[클린코드] Ch 1-2

Ericamoyed·2021년 1월 5일
0

클린코드

목록 보기
1/8

Chapter 1, 2

깨끗한 코드, 의미 있는 이름

인상깊은 구절

  • 여러 계정을 그룹으로 묶을 때, 실제 List가 아니라면 accountList라고 명명하지 않는다.
  • Info나 Data는 a, an, the와 마찬가지로 의미가 불분명한 불용어로 account와 accountData는 구분이 되지 않기 때문에 변수명에 사용을 지양
  • 검색하기 쉬운 이름 사용: 긴 이름이 짧은 이름보다 좋다
  • 클래스, 객체 이름은 명사/명사구가 적합
    • ex) Account
    • 그래도 Manager, Processor, Data, Info 등과 같은 단어는 피할 것
  • 메소드 이름은 동사/동사구가 적합
    • ex) deletePate
    • Accessor(접근자), Mutator(변경자), Predicate(조건자)은 get/set/is를 접두어로 사용하여 명명
  • 생성자 중복정의 시에는 정적 팩토리 메소드를 사용
    • ex) Complex a = Complex.FromRealNumber(23.0);
      not Complex a = new Complex(23.0);

추가 공부

p.19

  • 객체지향 설계 원칙 (SOLID)
    • SRP (Single Reponsibility Principle / 단일 책임 원칙)
      - "어떤 클래스를 변경 해야 하는 이유는 오직 하나뿐 이어야 한다 - 로버트 C 마틴"
      - 작성된 클래스는 하나의 기능만 가지며, 클래스가 제공하는 모든 서비스는 그 하나의 책임을 수행하는데 집중되어 있어야한다.
      - 역할/책임에 따라 클래스를 나눠서 설계해야한다
    • OCP (Open-Closed Principle / 개방 폐쇄 원칙)
      - "소프트위어 엔티티(클래스, 모듈, 함수 등)는 확장에 대해서는 열려 있어야 하지만 변경에 대해서는 닫혀 있어야 한다. - 로버트 C 마틴"
      - 요구사항의 변경/추가사항 발생 시, 기존 구성 요소는 수정 없이 그대로 가고 쉽게 확장하여 재사용할 수 있어야한다
      • ex) JDBC: DB 종류에 관계 없이 (MySql, Maria, ...) Connection 설정 부분의 변경만으로도 적용할 수 있다
    • LSP (Liskov Substitution Principle / 리스코프 치환 원칙)
      - "서브 타입은 언제든 자신의 기반 타입으로 (자신의 상위 클래스 (추상화의 레벨이 높은 클래스) 타입으로) 교체할 수 있어야 한다. - 로버트 C 마틴"
      • 상위 클래스: extends - is a kind of (하위 클래스는 상위 클래스의 한 종류)
      • 인터페이스: implements - is able to (인터페이스 할 수 있어야함)
      • upcasting / downcasting: 객체에 있어서 upcasting은 가능하나 (본인이 확장한 클래스로의 casting) downcasting은 불가하다 (본인을 확장한 클래스로의 casting)
    • ISP (Interface Segregation Principle / 인터페이스 분리 원칙)
      - "클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다. - 로버트 C 마틴"
      • 인터페이스를 통해 메서드를 제공할 때 최소한의 메서드만 제공해라. 그리고 상위클래스는 풍성할 수록 좋고, 인터페이스는 작을 수록 좋다.
    • DIP (Dependency Inversion Principle / 의존관계 역전 원칙)
      - "고차원 모듈은 저차원 모듈에 의존하면 안된다. 이 두 모듈 모두 다른 추상화된 것에 의존해야 한다. 추상화된 것은 구체적인 것에 의존하면 안된다. 구체적인 것이 추상화된 것에 의존해야 한다. 자주 변경되는 구체(Concrete) 클래스에 의존하지 마라 - 로버트 C 마틴"
      • 상위 클래스일수록 (Interface / Abstract Class) 변하지 않을 가능성이 높기에, 구체 클래스가 아닌 상위 클래스에 의존해라
      • 공통화 개념

출처: https://ktko.tistory.com/entry/자바-객체-지향의-원리-SOLID-DIP-의존-역전-원칙?category=753051 [KTKO 개발 블로그와 여행 일기]

p. 29

  • 헝가리식 표기법
    - 컴퓨터 프로그래밍에서 변수 및 함수의 이름 인자 앞에 데이터 타입을 명시하는 코딩 규칙
    - 하지만 지금은 MS도 공식 가이드라인에서 사용하지 말 것을 권고하고 있다.

출처: https://myeonguni.tistory.com/1595 [명우니닷컴]

p. 31

  • 팩토리 메서드 패턴
    - 객체를 생성하기 위한 인터페이스를 정의하고, 인스턴스 생성은 서브클래스가 결정하게 한다
    • 생성자 중복정의시 정적 팩토리 메서드를 사용
      Complex a = new Complex(23.0);
      Complex a = Complex.FromRealNumber(23.0);
    • 객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴
      RobotFactory rf = new SuperRobotFactory();
      Robot r = rf.createRobot("super");
      Robot r2 = rf.createRobot("power");
    • 팩토리 메소드 패턴을 사용하는 이유는 클래스간의 결합도를 낮추기 위한것입니다. 결합도라는 것은 간단히 말해 클래스의 변경점이 생겼을 때 얼마나 다른 클래스에도 영향을 주는가입니다. 팩토리 메소드 패턴을 사용하는 경우 직접 객체를 생성해 사용하는 것을 방지하고 서브 클래스에 위임함으로써 보다 효율적인 코드 제어를 할 수 있고 의존성을 제거합니다. 결과적으로 결합도 또한 낮출 수 있습니다.
    • 생성할 클래스를 미리 알지 못해도 팩토리 클래스가 객체 생성 담당
    • 객체의 자료형이 하위 클래스에 의해 결정: 확장 용이, if문 추가로 수정 필요 X
    • 확장성 up

출처: https://jdm.kr/blog/180
출처: https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html
출처: https://niceman.tistory.com/143


Comment

  • 알아야할 객체지향 개념들이 많다
  • 디자인패턴 공부가 필요하다
profile
꿈많은 개발자, 일상 기록을 곁들인

1개의 댓글

comment-user-thumbnail
2021년 1월 6일

좋은 글 감사합니다:)
스터디 중, 저의 부족한 질문에도 성실히 답해주셔서 감사합니다.

개인적으로, 팩토리 메소드에 관해서 조금 찾아봤는데요,
정적 팩토리 메소드와 팩토리 메소드 패턴의 개념을 분리하여 생각하는 것이 좋을 것 같다고 생각합니다!

  • 정적 팩토리 메소드 : 객체 생성을 캡슐화 하는 기법, 객체를 생성하는 메소드를 만들고 이를 static으로 선언 ( ex. valueOf ) -> 생성자에 비해 가독성이 좋고, 새로운 객체를 매번 생성할 필요가 없는 장점이 있습니다.
    참고 : https://johngrib.github.io/wiki/static-factory-method-pattern/

  • 팩토리 메소드 패턴 : 객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴. -> 객체의 생성 코드를 별도의 클래스/메소드로 분리함으로써 객체 생성의 변화에 대하는데 유용.
    참고 : https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html
    (정말 좋은 예시를 들고 있어서, 한 번 쭉 따라가 보는 것을 추천합니다!)

혹시 제가 부족한 부분 있으면 답글 부탁드립니다 :)

별개 얘긴데, 헤더를 사용하면 nav바 자동으로 생성되는데, 전체화면으로 봤을 때 편리하기에 추천드립니다!

답글 달기