Ch.9 설계 건정성을 해치는 여러 악마

텐저린티·2023년 7월 18일
0
post-thumbnail

9.1 💀 데드 코드

  • 악마 설명
    • 절대로 실행되지 않는 조건 내부에 있는 코드
  • 악마 사유
    • 가독성 떡락
    • 사양변경 시 버그 유발
  • 퇴치법
    • 발견 즉시 제거 요망
      • IDE의 정적 분석 도구가 데드코드 보면 기함을 토함
      • 그거보고 고치면 됨.

9.2 🦾 YAGNI 원칙

  • 천사 설명
    • 지금 필요 없는 기능을 만들지 말라
  • 천사 사유
    • 예측에 들어맞지 않는 로직 → 데드 코드
    • 예측해서 코드를 미리 작성해도 시간 낭비 → 어차피 사양 바뀜
  • 응원법
    • 지금 필요한 기능을 최대한 간단한 형태로 만드는 것이 좋음

9.3 4️⃣ 매직 넘버

  • 악마 설명
    • 로직 내부에 직접 작성되어 있어, 의미를 알기 힘든 숫자
  • 악마 사유
    • 동일한 값이 여러 곳에 중복 → 중복 코드
  • 퇴치법
    • 상수 활용으로 해결
      • 가독성도 좋고, 변경 대응에도 좋음
boolean isOk() {
		// 60 무엇?
		return value > 60;
}
private static final int REQUIRED_POINT = 60

boolean isOk() {
		return value > REQUIRED_POINT;
}

9.4 ⌨️ 문자열 자료형에 대한 집착

  • 악마 사유
    • CSV 파일처럼 의미가 다른 여러 값을 한 String 변수에 담으면 의미 알기 어려움
    • split 같은 전처리로 로직 복잡
  • 퇴치법
    • 의미가 다른 값은 각각 다른 변수에 저장하자

9.5 🌐  전역 변수

  • 악마 설명
    • 모든 곳에 접근할 수 있는 변수
  • 악마 사유
    • 고얀놈
      • 자바 언어에는 원래 없음 → 왜 없겠나
      • public static → 이렇게 굳이 써야 함
    • 어디, 언제 값 변경했는지 파악 어려움
    • 버그 영향 검토 리소스 증가
    • 동기화 성능 이슈
      • 데드락 상태 가능성
      • 동기화 하고 싶지 않은 다른 인스턴스 변수도 Lock 걸림
  • 퇴치법
    • 영향 범위 최소화
      • 호출 가능 위치 국소적으로

9.6 ❌ null 문제

  • 악마 설명
    • 메모리 접근과 관련된 문제 방지 위한 최소한의 도구
    • 잘못된 처리 의미
  • 악마 사유
    • ‘무언가 갖고 있지 않은 상태’, ‘무언가 미설정 상태’ 조차 아님!
  • 퇴치법
    • null 리턴하지 않는 설계
      • 메소드에서 null을 리턴하지 않는 것
    • null 전달하지 않는 설계
      • 메소드에서 변수에 null을 할당하지 않지 않는 것
    • 인스턴스 변수 EMPTY 처럼 무의미하지만, 인스턴스가 존재하는 값으로 할당하는 방법 존재
      • null 체크 자체를 안 해도 됨

        static final Equipment EMPTY = new Equipment("장비 없음", 0, 0, 0);
        
        void takeOffAllEquipments() {
        		head = Equipment.EMPTY();
        		body = Equipment.EMPTY();
        		arm = Equipment.EMPTY();
        }
    • null 안전
      • 언어 자체에서 제공하는 null 안전 자료형을 이용해서 코딩하는 방법

9.7 ⁉️ 예외를 catch하고서 무시하는 코드

  • 악마 설명
    • catch 블록 안에 아무런 동작 없는 코드
  • 악마 사유
    • 오류 탐지 방법 없어짐
    • 불-편
  • 퇴치법
    • 예외 발견 즉시 통지, 기록
      • catch 구문에선 최소 로그만이라도 기록해야 함
      • 생성자 가드

9.8 Ⓜ️ 설계 질서를 파괴하는 메타 프로그래밍

  • 악마 설명
    • 프로그램 실행 중에 해당 프로그램 구조 자체를 제어하는 프로그래밍
    • 흑마법
  • 악마 사유
    • 리플랙션을 사용해서 final 값 변경 가능하기 때문
      • 기껏 만족시킨 올바른 설계의 백도어 발생
    • 메타 정보 이용해서 인스턴스 생성 가능하기 때문
      • 정적 분석 도구의 도움을 받지 못함

      • 클래스 이름 변경하면 → 컴파일에는 문제 없지만, 런타임 시 해당 클래스 미존재로 오류 발생

        static Object generateInstance(String packageName, String className) throws Exception {
        		String fillName = packageName + "." + className;
        		Class klass = Class.forName(fillName);
        		Contructor constructor = klass.getDeclaredConstructor();
        		return constructor.newInstance();
        }
        
        // 이건 정적분석도구가 타입을 알 수 없음 -> 버그 유발
        Employer user = (Employer) generateInstance("customer", "User");
  • 퇴치법
    • 시스템 분석 용도에서만 활용
    • 아주 작은 범위에서만 활용

9.9 🗂️ 기술 중심 패키징

  • 악마 설명
    • 구조에 따라 폴더와 패키지 나누는 것
    • 스프링에서는 MVC 에 따라 패키지 나누는 것
  • 악마 사유
    • 디자인 패턴에 따라 구분했기 때문에 비즈니스 지식(개념) 이 어디와 관련있는지 구분하기 어려움
  • 퇴치법
    • 비즈니스 개념 기준으로 폴더 구분
      • 관련 있는 내용만 참조 가능
      • 관련 있는 내용끼리만 사용 가능토록 package private 으로 사용
      • 응집도 높아지므로 유지보수 용이

9.10 🧾 샘플 코드 복사해서 붙여넣기

  • 악마 설명
    • 라이브러리 문서 같은 거
  • 악마 사유
    • 얘네는 유지보수성, 변경 용이성 고려 안 함
    • 고얀놈들

9.11 🗡️ 은 탄환

  • 새로 알게 된 내용이라고 신나서 적용하면 큰 코 다침
  • 팩토리 패턴 처음에 적용했다가 바로 제거했던 것처럼 상황에 따라 적합한 걸 쓰고, 과감히 버려야 함
  • 설계에 best는 없음, better만 있을뿐
profile
개발하고 말테야

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

정말 좋은 글 감사합니다!

답글 달기

관련 채용 정보