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
- 팩토리 메서드 패턴
- 객체를 생성하기 위한 인터페이스를 정의하고, 인스턴스 생성은 서브클래스가 결정하게 한다
출처: https://jdm.kr/blog/180
출처: https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html
출처: https://niceman.tistory.com/143
- 알아야할 객체지향 개념들이 많다
- 디자인패턴 공부가 필요하다
좋은 글 감사합니다:)
스터디 중, 저의 부족한 질문에도 성실히 답해주셔서 감사합니다.
개인적으로, 팩토리 메소드에 관해서 조금 찾아봤는데요,
정적 팩토리 메소드와 팩토리 메소드 패턴의 개념을 분리하여 생각하는 것이 좋을 것 같다고 생각합니다!
정적 팩토리 메소드 : 객체 생성을 캡슐화 하는 기법, 객체를 생성하는 메소드를 만들고 이를 static으로 선언 ( ex. valueOf ) -> 생성자에 비해 가독성이 좋고, 새로운 객체를 매번 생성할 필요가 없는 장점이 있습니다.
참고 : https://johngrib.github.io/wiki/static-factory-method-pattern/
팩토리 메소드 패턴 : 객체 생성 처리를 서브 클래스로 분리 해 처리하도록 캡슐화하는 패턴. -> 객체의 생성 코드를 별도의 클래스/메소드로 분리함으로써 객체 생성의 변화에 대하는데 유용.
참고 : https://gmlwjd9405.github.io/2018/08/07/factory-method-pattern.html
(정말 좋은 예시를 들고 있어서, 한 번 쭉 따라가 보는 것을 추천합니다!)
혹시 제가 부족한 부분 있으면 답글 부탁드립니다 :)
별개 얘긴데, 헤더를 사용하면 nav바 자동으로 생성되는데, 전체화면으로 봤을 때 편리하기에 추천드립니다!