패턴 그리고 객체지향적 코딩의 법칙
- story1 ~ 10
1. 왜 C++을 사용해야 하는가?
- 가치 있는 코드란 무엇인가?
- 기능 요구사항을 정확하게 만족하는 코드
- 요구사항이 변경되더라도 유연하게 대처 가능한 코드 (확장성)
- 다른 개발자가 활용하기 편한 코드 (API가 잘 되어 있음)
- 개발 방법의 기본
- 개발을 체계적으로 진행할 수 있는가?
- 개발하기 쉬운가?
- 관리하기 쉬운가?
- 확장하기 쉬운가?
- 안정적인가?
-
C++은 “상속, 캡슐화, 다형성 그리고 디자인 패턴 등을 통해 여러 유용한 테크닉이 존재한다.” 다만, 이것은 C가 아닌 C++로 개발해야하는 이유가 될 수는 없다.
- C 프로그래밍 시 생각할 점
- 관련된 구조체와 함수를 어떻게 연관지을 것인가?
- 구조체의 변수들은 어떻게 수정되어야 하나?
- 의도되지 않은 수정이 이루어졌을 경우 예외처리?
- 사용할 함수와 사용하면 안되는 함수에 대한 구분
- 해당 내용의 결론?
- “구조적 언어인 C를 이용하여, 객체 지향적으로 개발하는 방법”과 “객체 지향적 언어인 C++을 이용하여, C 만큼의 성능을 충족시키면서 개발하는 방법”
- 성능이 중요한 경우 : 전자
- HW에서 제공되는 정도의 성능 + 유지보수의 편리함 : 후자
- “구조적 언어인 C를 이용하여, 객체 지향적으로 개발하는 방법”과 “객체 지향적 언어인 C++을 이용하여, C 만큼의 성능을 충족시키면서 개발하는 방법”
2. 객체 지향 코드
-
모든 이론이나 개념에 대해 그것이 왜 필요했는지 고민하고 이해하는 것이 필요
- 객체 지향의 기본 단위 : 클래스
- 클래스는 하나의 책임 (혹은 기능)을 가지는 것이 좋음
- 확장성을 높힘 (== 결합도와 복잡도를 낮춤)
- 공통점 묶기와 조금만 알기
- 상속
- 다형성
- 캡슐화
- ※ [참고] 다중 상속
- C++에만 있고, Java에서는 다중 interface 상속 개념만 지원
- 모든 클래스는 하나의 책임만 (기능만)을 가진다.
- 추상 클래스와 인터페이스의 차이?
- 추상 클래스는 클래스 전체를 다 구현하지 않고, 자식 클래스에게 구현의 일부를 위임
- 인터페이스 : 기능 구현을 하지 않음이 원칙
- C++ : 컴파일러가 키워드를 구별하지 않으므로 사용 시 주의
- Java : interface와 abstract 키워드로 분리
- 객체지향의 원칙
- 클래스가 꼭 필요한 변수와 함수만 가지고 있는가?
- 클래스 사이의 연관성이 너무 높지 않은가?
- 중복된 코드가 너무 많지 않은가?
- 클래스가 너무 크지 않은가?
- 코드를 이해하기 쉬운가?
- 변하는 부분과 변하지 않는 부분은 무엇인가?
3. 코드의 종류
- 지저분한 소스가 탄생하는 배경
- 무책임한 개발자
- Case By Case로 땜빵하는 코드
- 소스의 이해 부족으로 인한 잘못된 수정
- 높은 결합도로 인한 부작용
- 문서와 다른 소스
- “역사적인 이유로”라며 시작되는 변명
- 커뮤니케이션의 부족
- 깨끗한 코드란?
- 가독성이 높고 구조적으로 이해하기 쉬운 코드
- 새 요구사항이 기존 깨끗한 코드로 수용이 어려운 경우, 리팩토링을 통한 새로운 구조의 소스를 만들기
- 깨끗한 코드를 만들기 위한 원칙
- 다른 개발자들에게 API를 제공한다는 마음
- 남이 봐도 쉬운 코드를 만든다
- “역사적”인 이유를 만들지 말아라
- 내 코드만 보지 말기
- 기존의 코드와 통일성 있는 코드를 작성하기
- 커뮤니케이션 하기
- 항상 ‘1년 뒤에 이 소스를 본다면?’이라고 생각하기
- 리팩토링
- 이쁜 코드 만들기
- 함수 및 변수의 Naming 규칙
- Prefix 붙이기
- 탭 들여쓰기 및 공통 type 묶기
- 클래스 헤더 구성
- public (호출이 빈번한 public -> 생성자 순으로)
- protected (해당 클래스의 자식 클래스가 overriding할 수 있는 함수)
- 클래스 내부에서만 사용하는 private
- 변수는 되도록 맨 아래쪽에 배치
- ’{‘,’}’는 내려쓰기
- 주석 달기
- 이쁜 코드는 위 규칙을 통일한 코드라고 생각
- 개개인에게 맡기기 보다는 cpplint를 이용하는게 더 깔끔
- code style에 대해 상세하게 설명할 필요 없이 알아서 맞춰줌