본문 바로가기

생각

[고찰] Coding Insight

▶ 함수 생성 딜레마

함수에 인자를 추가해서(기능을 더해서) 함수 중복을 피할 건지

아니면, 함수 최소 기능을 놔 둔체 기능이 다른 함수는 새로 만들 건지는 딜레마다.

 

1) 함수에 기능을 추가할 경우

장점 : 함수에 기능만 추가하면 코드 중복을 막을 수 있다.

단점 : 함수 내에 분기 문이 늘고, 함수가 길어진다.

 

2) 기능이 일부 다른 함수를 새로 만들 경우

장점 : 코드가 명확해 지고, 상위 스택에서 분기를 나누기가 쉽다.

단점 : 코드가 길어진다.

 

타 회사 라이브러리 사용시 (라이브러리 사용법 만들기)

쉽다고 생각할 것이아니라(실제로 쉽지 않다) 사용법이 완전히 숙지 되기 위하여 사용법을 요약한 PPT를 만든다.

 

사건)

본인은 TC387 라이브러리 사용법을 완전히 숙제하지 못해, 어쩡쩡하게 시간을 낭비 했다.

 

반성)

사용법을 완벽하게 숙지하고, 관련하여 PPT로 정리하였어야 했다. 스스로를 완전히 이해시켜서, 하나의 의문도 남기지 말아야 했다.

 

클래스 멤버 변수를 쓸 것 인가 vs 함수 인자로 넘길 것인가

- 함수에서 쓰이는 변수를 멤버 함수로 부터 받아오는 구조로 할 것인가, 함수 인자로 (호출하는 곳에서) 받아서 쓸 것인가 하는 고민이 있다. 예를 들어 특정 변수가 클래스에서 사용되는 경우, main문(상위)에 선언하고 클래스의 멤버 함수에서 인자로 넘겨 사용하게 된다면, 해당 변수는 main 문에 있어 눈에 띄기 쉽고 디버깅하기도 쉽다. 반면, 클래스의 멤버 변수로 존재하지 않아 은닉화의 장점을 살리기 어렵고, 남발하게 되는 단점이 존재한다.

 

1) 클래스 멤버 변수로 둘 경우

장점: 은닉화 되고, 클래스에 확실히 종속된다는 느낌을 줄 수 있다.

단점: 초기화가 필요한 경우 따로 조취를 취해줘야 하며, 눈에 띄지 않기 때문에 '존재를 잊어버릴' 위험이 있다.

 

2) 함수 인자로 넘길 경우

장점: 디버깅하기 쉽고, 상위 스택에 존재하기 때문에 다른 클래스에서도 사용이 가능하다.

단점: 클래스 멤버 함수의 인자로 넘겨줘서 사용해야 하기 때문에 코드가 복잡해 질 수 있다. 인자 갯수에 변동이 일어나서 코드 수정이 자주 일어날 수 있다. 만약 함수에서 해당 변수가 필요 없게 될 경우 (함수 원형 및 선언에서) 코드 수정이 일어난다.

 

결론)

- 멤버 변수는 클래스를 대표하는 변수만 만들도록 한다

  : 필요할 때 마다 만들게 되면, 초기화 값 변경 등에서 누락이 일어나기 쉽다
  ex) 어느 단계 어느 함수로 부터 멤버 값이 변경될 경우, 함수 순서만 보고 있는 상황에서는 상태 변경을 짐작하기 어려움
- 함수 인자를 받는 것으로 변경하면, 함수가 지저분해진다. 코드 수정도 번거로워 진다. 

- 깔끔한 방법은 비슷한 속성의 변수를 구조체로 두어, 클래스에서 내부 변수로 가지고 있는 것이 좋다.

- 항상 코드를 짜기 전에 효율적인 구조와 변수, 위상을 생각한다

  : 필요한 변수

  : 필요한 구조체(변수도 구조체로 묶을 수 있으면 묶는다)

  : 연관되어 함께 존재할 필요가 있는 변수와 함수에서 사용될 가능성이 있는 변수들은 클래스로 묶는다

- 각 멤버 함수 별로 멤버 변수 어떤 것을 변화시킬 것인지를 유저가 알수 있게 명확하게 표기하면 가독성에 좋다.

- 멤버 함수의 입력부는 구조가 비슷한 것이, 향후 코드 변경이 적을 수 있다.

함수 인자로 쓴다면, 구조체를 두어 비슷한 속성의 변수를 한대 모으고 함수의 입력부를 통일하는 것이 변경이 덜하다.

 

 

▶ 22월 1월 회고

라이브러리를 만들면서 SW를 구조적으로 '은닉화'를 지켜가며 짜는 법을 깨달았다.

- 주요 변수는 한데 모아야 하고, C 언어라면 Static 선언하여 한 파일에서만 존재하게 한다.

- C언어라도 get, set 함수를 이용하여 해당 변수에 접근하게 한다.

- 주요 변수를 모은 파일을 Config로 정해 다양한 파일에서 참조하게 하되, 다른 파일 끼리는 의존성이 없게 한다.

이런 구조로

- 짜다 보면 '주요 변수'가 어떤 항목을 내포해야 하며 어떻게 나뉘어야 하는지 스스로 알게 된다 (고민이 필요하다)

  ex) 구조체 변수 정의

- '주요 변수'는 헤더파일에 존재하면 안되며 .cpp 파일에 존재해햐 한다 (중복 선언을 피하기 위해서)

- Unit Test와 자동 빌드 시스템(CI/CD)에 익숙해지면 아주 멋진 코드를 찍어낼 수 있을 것으로 확신이 든다.

- (자료구조를 담고 있는) 'Config' 파일로 부터 논리가 파생되는 느낌(?)이 되게 한다.

반응형

'생각' 카테고리의 다른 글

[비] 시민의 참여하는 정책  (0) 2021.07.11
변하는 것과 변하지 않는 것  (0) 2020.12.10
메타인지에 관하여  (0) 2020.08.04