1.  걍 짜.


2.  막 짜.


3.  일단 완성 했으면 함수 이름을 고민해.

    인수의 가인수명을 분명히 넣어줘.

    인수의 타입과 가인수명으로 충분히 설명되는 내용은

    함수 이름에서 빼도 돼.

    함수의 이름을 줄여.


    만약 더이상 간단하게 안줄여지면,

    이 함수의 특성에 해당하는 단어의 의미와

    일반적인 의미를 분리할 수 있다는 힌트야.


    함수 이름이 예쁘게 안붙어? 그럼 니가 잘못짠거임.


4.  함수를 의미 단위로 작게 쪼개

    30줄 넘은 함수는

    나중에 보고 아~ 전에 일반화 하다 말았구나 생각하면 됨.


5.  아주 단순한 동사 하나로 함수명이 표현 되었으면 잘한거야.

    대개 뭐 목적어는 인수로 커버 되잖아?

    형용사 하나 정도 가지고 갈 순 있겠지.

    동일한 형용사를 갖는 함수들이 즐비하다면

    namespace 로 나누는것도 고려할 수 있음.


6.  자, 이제 함수에 타입 제약이 없는지 살펴봐

    딱히 다양한 타입을 지원할 필요가 없으면 냅둬.


7.  함수에 상수 제약이 없는지 살펴봐

    상수가 이함수의 설정 조건이 되는지 살펴봐.

    딱히 다양한 조건을 지원할 필요가 없으면 냅둬.


8.  만약 6, 7 에 걸리잖아?

    그럼 가차없이 템플릿으로 일반화해.


    여담인데 재귀형 템플릿의 일반화와 특수화는 for 문과 같아.


    for( 진입문; 반복조건( 특수식 ); 변경 )

        일반식;


    이게 for 문 문법이잖아?


    for( int i = 0; i < 10; ++i )

        일반식;


    처럼 동작하는 재귀형 템플릿은 다음과 같지.

    위는 변수가 바뀌며 일반식이 10번 실행되는거지만,

    아래는 각각의 상수가 설정된 함수가 10개 만들어짐.


    template< int i > // i 은 이터레이터로 볼수 있어

    inline auto some_function()

    {

        일반식;

        some_function< i + 1 >(); // 변경문이지?

    }


    template<>

    inline auto some_function< 10 >() // 특수식

    {

    }


    some_function< 0 >(); 하면 함수 10개를 만들어주는 트리거가 되는거지 ( 진입문 )


    이렇게, 말이지.


9.  여러 함수들이 공통 명사를 포함하거나

    공통 인수, 전역 데이타를 참조하고 있니?

    그럼 클래스로 싸. 공통 인수나 전역 데이타는 멤버 변수임.

    여러 함수에 사용된 명사를 떼어 클래스 이름을 지어.

    그럼 함수엔 동사 정도나 남겠지. 잘했어.


10. 클래스가 커지면 세포 분열해.

    비슷한 클래스가 있다고? 교배해.

    어디에도 쓰일 수 있는 공통 ( 일반 ) 줄기 세포와

    구체적인 특수 조직 세포로 나눠.

    그게 부모 객체와 자식 객체임.


11. 클래스 이름이 복잡하다고?

    나눠~

    최상위 부모 클래스 이름이 단순해졌다고?

    잘했어.

    니 클래스들은 일가를 이루었구나.

    조상 클래스의 재사용성은 좋을거야.

    자식 손자새끼들이 두고두고 조상탓 할테니.


*   *   *


잘 만들어진 함수와 클래스는 소인수 분해 과정과 같다.

더이상 쪼갤 수 없는 의미의 단계로 쪼개어 나가면, 그 결과물이 각각 소인수다.

그 순간이 되면 중복 소인수들이 보인다.


그 친구들은 당장 구현된 함수와 클래스에서 재사용성이 보장된 일반 함수와 클래스가 된다.

이 작업을 통해 성능적 최적화와 표현적 최적화를 동시에 추구할 수 있다.

그렇게 최적화 되고 일반화 된 해법의 재사용성은 최상이다.


아래는 소인수분해의 예시다.



어떤가? 함수의 계층적 호출 구조, 멀티클래싱의 구조와 동일하지 않은가?


쪼갤수 있는 의미적 문제가 단 하나인 어떤 함수는 간단하게 작성가능하다.

그런데 조금 복잡한 문제는 몇 개의 작은 의미의 합성으로 이루어진다.

이는 해법의 합성이 요구된다는 말과 같다.


초보, 중수들은 그때부터 머리가 핑핑 돌기 시작하지.

각각의 단위 해법들, 즉 함수와 클래스들을 사용해,

복합적 문제의 최소공배수,

즉 포괄범위를 얻어내면 복합 문제를 풀게 된 것이다.


그러기 위해서 소인수 분해를 통해 최대공약수를 구하고,

그 최대공약수가 직접적 부모 클래스가 된다.


해법 a 와 해법 b 의 포괄해를 필요로하는 복합 문제 AB 를 위해

a * b 해버리는 삽질은 말자.


LCM( a, b ) = a / GCD( a, b ) * b 임을 잊지 말란 소리다.