패턴 그리고 객체지향적 코딩의 법칙 미완(2016.03.29)
Class: 공통의 성질을 가진 종류, 부류
내가 정말 잘 올바르게 작성한 것일까? 하고 고민해 본 적이 있을 것이다.
아쉽게도 그런 정답은 존재하지 않는다.
장말 잘 만들어진 코드란 요구사항을 정확히 만족하는 코드이다. 그런데 현실에선 요구 사항들이 끊임없이 변하기 때문에 만족시키기란 쉽지 않다.
개발 방법의 기본
- 개발을 체계적으로 진행할 수 있는가?
- 개발하기 쉬운가?
- 관리하기 쉬운가?
- 확장하기 쉬운가?
- 안정적인가?
공통점 묶기 조금만 알기
공통점 묶기와 조금만 알기는 객체지향 언어에서 상속, 다형성, 캡슐화보다 더 중요한 개념이다. 공통점을 묶고 조금만 알기 위해 노력하다 보니 상속, 다형성, 캡슐화가 필요하게 되고 더불어 추상화, 일반화라고 세분화도 저절로 이루어지는 것이다.
회사에선 사원, 군대에선 군인, 편의점에선 손님
class 사원
{
public:
virtual void 건강검진()=0;
};
class 예비군
{
public:
virtual void 지겨운훈련()=0;
};
class 편의점손님
{
public:
virtual void 계산하기()=0;
};
C++ 다중 상속을 이용해 구현
class 나초보: public 사원, public 예비군, public 편의점손님
{
public :// 사원
virtual void 건강검진(){...구현...}
public :// 예비군
virtual void 지겨운훈련(){...구현...}
public :// 편의점
virtual void 계산하기(){...구현...}
};
나초보씨가 만났던 세 사람은 각자 클래스가 있겠지만 나초보씨와 만났던 부분에 함수
void 닥터::건강검진(사원 a_employee)
{
a_employee.건강검진();
}
void 조교::훈련(예비군 a_reserve)
{
a_reserve.지겨운훈련();
}
void 편의점알바::물건팔기(편의점손님 a_customer)
{
a_customer.계산하기();
}
void Foo()
{
나초보 Na;
닥터 Kim;
조교 Yun;
편의점알바 Oh;
Kim.건강검진(Na);
Yun.훈련(Na);
Oh.물건팔기(Na);
}
모든 클래스는 하나의 책임만 가진다.
interface : 경계면, 접점, 공유(접촉)영역
깨끗한 코드의 선순환
깨끗한 코드 → 새로운 요구사항 발생 → 요구사항 적용이 쉬움 → 동일성 있는 수정
깨끗한 코드 작성하기 위한 원칙
- 다른 개발자들에게 API를 제공한다는 마음으로 개발하라
- 남이 봐도 쉬운 코드를 만들어라
- 역사적인 이류를 만들지 말아라
- 자신의 코드만 보지 말아라
- 기존의 코드와 통일성 있는 코드를 작성하라
- 커뮤니케이션 하라
- 항상 1년 뒤에 이 소스를 본다면이라고 생각하라
- 리팩토링 하라
완벽함이란 더 이상 무엇인가를 더할 것이 없을 때 이루어지는 것이 아니라, 더 이상 무엇인가를 뺄 것이 없을 때 이루어진다. - 앙뜨완느 마리 로제 드 생떽쥐페리
객체지향 코딩 원칙
- 클래스가 꼭 필요한 변수와 함수만을 가지고 있는가?
- 클래스 사이의 연관성이 너무 높지 않은가?
- 중복된 코드가 너무 많지 않은가?
- 클래스가 너무 크지 않은가?
- 코드를 이해하기 쉬운가?
- 변하는 부분과 변화지 않는 부분은 무엇인가?
구현 퍼포먼스 향상
- 코딩 중에는 마우스를 최대한 만지지 마라
- 자신이 사용하는 툴의 모든 단축키를 외워라
- 디버깅하기 쉽도록 코드를 작성하라
- 반복되는 작업을 편하게 해줄 도구를 찾아라
- 목적지로 가는 가장 빠른 길을 탐색하라
- 구현 중에 흐름을 끊지 말아라
네이밍(Naming)
int nCount=0;
int nMagazineCount=0, nNovelCount=0, nOthersCount=0;
int nTotalBookCount=0;
int nMagazineCount=0, nNovelCount=0, nOthersCount=0;
타입
|
Prefix
|
예제
|
bool
|
b
|
bool bRunning;
|
int
|
n
|
int nIndex;
|
char
|
ch
|
char chCode;
|
float
|
f
|
float fRate;
|
double
|
dbl
|
double dblPi;
|