Clean Code라는 단어는 굉장히 매력적이지만 실제로 대단한 임팩트는 없다. 하지만 레거시 코드를 어떻게 해야 할지에 대한 고민과 앞으로 유지보수가 힘들게 만드는 코드를 지양하기 위한 바로미터가 될 수 있다.
로버트 C 마틴의 지침
- 절대적으로 지켜야 하는 내용이 아니다.
- 팀이나 공동체에서 서로 동의하는 합리적인 원칙을 세우기 위한 소통
- Clean Code는 소통을 위한 기초지식을 제공하고 생각할 거리를 던져주는 책
Robert C. Martin - Wikipedia
From Wikipedia, the free encyclopedia American software consultant Robert Cecil Martin (born 5 December 1952), colloquially called "Uncle Bob",[2] is an American software engineer, instructor, and author. He is most recognized for promoting many software d
en.wikipedia.org
: 존경의 의미로 클린코드 개념을 창시한 사람의 얼굴은 알아두도록 하자.(얼굴을 알면 우연히 마주쳤을 때 사인은 받을 수 있지 않을까?)
클린 코드가 되지 않는 이유
클린 코드 상태에서 유지보수는 빠르게 된다. 하지만 점차 클린 하지 않는 코드가 되는 이유
- 기한을 맞추기 위해, 클린 하지 않는 코드가 양산된다.
- 그 위에 유지보수를 지속적으로 하게 된다.
- 이 것들이 쌓이게 되면서 유지보수 속도가 점차 느려진다. (악순환 반복)
=> 코드를 깨끗하게 유지하려는 노력이 오히려 기한을 맞출 수 있는 좋은 방법이다.
클린코드 원칙
클린 코드를 유지하려는 노력은 습관화가 되어야 한다.(날을 잡고 코딩하는 것이 아니다.)
청소의 개념과 비슷한데 정리하면 다음과 같다.
- 정리 : 적절한 명명법으로 정리
- 정돈 : 코드는 누구나 예상하는 위치에 있어야 한다.(파편화된 함수를 모은다)
- 청소 : 쓰레기는 치운다. 필요 없는 주석은 지운다.
- 규율화 : 청소 방식, 그룹 내 구현 스타일 기법 통일화
- 생활화 : 자기 작품을 자주 돌아본다.
Clean Code의 다양한 정의
비야네 스트롭스트룹 : 논리가 간단해야 한다. 깨끗한 코드는 한 가지를 제대로 한다. (C++ 창시자)
Grady Booch : 단순하고 직접적이다.(의도를 잘 표현한다.) 깨끗한 코드는 잘 쓴 문장처럼 읽힌다. 깨끗한 코드는 결코 설계자의 의도를 숨기지 않는다.(UML 창시자)
마이클 패더스 : 깨끗한 코드는 언제나 누군가 주의 깊게 짰다는 느낌을 준다. (Working Effectively with Legacy Code 저자)
워드 커닝햄 : 코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드라 불러도 되겠다.(wiki창시자, XP 공동 창시자)
Clean Code를 사용하는 마인드
우리는 저자다.
책 저자는 글을 쓰고, 본인이 쓴 글을 읽고 또 읽고, 다시 읽는다.
독자 입장에서 다시 읽고 고친다. 독자와 잘 소통이 되는지 확인한다.
코드를 짤 때는 자신이 저자임을 기억하고 끊임없이 기존 코드를 읽어야 한다.
보이스카우트 규칙
시간이 지나도 언제나 깨끗하게 유지해야 한다. (지속적인 개선)
캠프장은 처음 왔을 때 보다 더 깨끗하게 해 놓고 떠나야 한다.
Clean Coding 작성 방법
의미 있는 이름을 쓴다
흔한 약어 지양 : ax, aix, 만능 용어 자제 : info, Data
함수
- 추상화 : 복잡하거나 동작이 많은 경우는 함수를 분리 (함수는 의미를 갖는 최소한의 함수로 만든다. 한 가지 목적을 가져야 한다.
- 함수배치는 위에서 아래로 코드를 읽을 수 있도록 함수 배치를 한다.
- 함수 이름을 잘 짓기 : 의미를 잘 알 수 있게 짓기
- 함수 인수 개수는 가능한 1개 이하로 한다.
- 한수 인수에 flag는 피한다.
주석
주석은 유지보수 되지 않는다.
객체지향
OOP(객체지향 4대 요소) : 캡슐화, 상속, 추상화, 다형성
생각해 볼거리
처음부터 객체지향으로 구현하지 않았다면 lagacy Code를 refactoring 하면서 개선을 할 텐데, 객체지향으로 메서드를 분리, 클래스로 분리를 하다 보면 동일코드는 제거하여 함수로 뽑(추상화)는 과정을 거칠 텐데, 이때 함수의 예외처리를 위해 진입 초기에 return 처리를 하게 된다. 그런데 어쩌나? 자동차 SW를 개발한다면 MISRA C++ 지침을 지켜야 하는데 MISRA C++ rule 에는 multi return을 하지 말라고 한다. multi return을 안 하려면 return에 대한 상태값을 담은 flag 도 써야 하는데 당신은 어떻게 수정을 할 텐가?
예) https://spin.atomicobject.com/2011/07/26/in-defence-of-misra/
단위 테스트
좋은 단위 테스트는 F.I.R.S.T 규칙을 따른다.
- Fast : 실행이 빨라야 한다.
- Independent : 단위 기능에 집중해야 한다.(하나의 테스트 당 하나의 기능만 테스트)
- Repeatable : 반복적으로 수행해도 같은 결과가 나와야 한다.
- Self-Validating : 기대결과를 단언할 수 있어야 한다.
- Timely : 미루지 않고 즉시 작성해야 한다.
위 단위 테스트를 녹인 방법론 나왔고, 방법론 중 TDD 란 개념도 나왔다.
참고
책 광고는 아니고, 좀 더 깊이 들여다보고 생각해 보고 싶다면 구매를 추천한다.
https://www.yes24.com/Product/Goods/11681152

'개발' 카테고리의 다른 글
도스 배치파일 - 문자열 입력 받기 (0) | 2022.06.29 |
---|---|
개발 기초 용어 정리 (0) | 2022.06.28 |
C 시큐어코딩 가이드 (0) | 2022.03.21 |