Notice
Recent Posts
Recent Comments
Link
코드로 우주평화
함수를 어떻게 짜죠? 본문
반응형
제목 : 클린 코드
저자 : 로버트 C. 마틴
범위 : 3장 함수
기억하고 싶은 것
- 작게 만들어라! 함수를 만드는 첫째 규칙은 '작게!'다.
- 20줄도 길다.
- 들여 쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
- 함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만을 해야 한다.
- 한 가지란 무엇인가?
- 지정된 함수 '이름' 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다.
- 확인하는 방법, 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
- 함수 당 추상화 수준은 하나로!
- 근본 개념 <> 세부 사항 ex) getHtml() <> .append("\n")
- 추상화 수준을 일관되게 적용할 것
- 위에서 아래로 추상화 수준이 낮은 함수가 위치한다.
- Switch 문은 상속 관계로 숨긴 후에 다른 코드에 노출하지 않는다.
- 서술적인 이름을 사용하라!
- 함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다.
- 길고 서술적인 이름이 짧고 어려운 이름보다 좋다.
- 이름을 붙일 때는 일관성이 있어야 한다. 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.
- 함수 인수
- 함수에서 이상적인 인수 개수는 0개다. 3개는 가능한 피하는 편이 좋다.
- 4개 이상은 이유가 필요하며 이유가 있어도 사용하면 안 된다.
- 인수가 적은 것이 테스트에도 유리하다.
- 플래그 인수는 추하다. 함수로 불 값을 넘기는 관례는 끔찍하다.
- 이항 함수
- 좌표의 경우 자연적인 순서가 있어 괜찮지만
- 일반적인 이항 함수는 자연적인 순서가 없어 순서를 인위적으로 외워야 한다. 그만큼 위험이 따른다.
- 이런 경우 함수 명에 인수 키워드를 순서대로 기재하면 이해하기 쉽다.
- 함수와 인수가 동사/명사 쌍을 이뤄야 한다. ex) writeField(name)
- 부수 효과가 있다면 함수 이름에 함께 기재하라
- 명령과 조회를 분리하라!
- 함수는 객체 상태를 변경하거나 아니면 객체 정보를 반환하거나 둘 중 하나다. 둘 다 하면 혼란을 초래한다.
- 오류 코드보다 예외를 사용하라!
- if로 오류를 직접 핸들링하지 말고 try/except를 사용하자.
- try/except 블록을 별도 함수로 뽑아내는 편이 좋다.
- 오류 처리도 한 가지 작업에 속한다. 오류 처리하는 함수는 try로 시작해서 except로 끝나야 한다.
- 반복하지 마라!
- 중복은 소프트웨어에서 모든 악의 근원
- 객체지향 프로그래밍은 코드를 부모 클래스로 몰아 중복을 없앤다.
- 함수를 어떻게 짜죠?
- 처음에는 엉망이다. 글짓기 처럼 초안을 작성하고 그런 다음 코드를 다듬는다.
- 함수를 만들고 이름을 바꾸고 중복을 제거하고 메서드를 줄이고 순서를 바꾼다.
- 항상 단위 테스트를 수행한다.
- 처음부터 탁 짜내지 않는다. 그게 가능한 사람은 없으리라.
- 결론
- 함수는 그 언어의 동사며, 클래스는 명사다.
- 프로그래밍의 기술은 언제나 언어 설계의 기술이다.
- 장인은 시스템을 구현할 프로그램이 아니라 풀어갈 이야기로 여긴다.
- 진짜 목표는 시스템이라는 이야기를 풀어가는 데 있다는 사실을 명심하기 바란다.
- 작성하는 함수가 분명하고 정확한 언어로 깔끔하게 같이 맞아떨어져야 이야기를 풀어가기가 쉬워진다는 사실을 기억하라
떠오르는 생각이나 질문
- SRP란 무엇인가?
- 단일 책임 원칙은 "클래스는 단 한 개의 책임을 가져야 한다."를 의미
- 하나의 모듈은 하나의, 오직 하나의 액터에 대해서만 책임져야 한다.
- 액터란 동일한 종류의 요청을 하는 사용자를 의미함
- 단일 책임 원칙(SRP)이란?
- OCP란 무엇인가?
- 개방 폐쇄 원칙은 "확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다."를 의미
- "기능을 변경하거나 확장할 수 있으면서 그 기능을 사용하는 코드는 수정하지 않는다."를 뜻합니다.
- 변화하는 부분을 추상화함으로써 기존 코드를 수정하지 않고도, 확장을 할 수 있게 만들어 줍니다.
- 개방 폐쇄 원칙(OCP)이란?
- 단위 테스트란 무엇인가? 수행하는 방법은?
- 단위 테스트(Unit Test)는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
- 예를 들어 웹 애플리케이션에서 로그인 메서드에 대한 독립적인 테스트가 1개의 단위 테스트가 될 수 있다.
- [TDD] 단위 테스트(Unit Test) 작성의 필요성
- [파이썬] 단위 테스트의 기본 (unittest)
하고 싶은 말
- 프로그래밍 기술에 대한 개념 뿐만 아니라, SRP, OCP 처럼 코드 작성에 대해서도 많은 개념과 이론들이 있음을 알게 되었다.
- 디버그와 테스트가 굉장히 중요하다는 말을 여러 번 들었는데 내가 짠 코드에서도 직접 적용하면서 작은 단위로 테스트하는 습관을 길러야겠다.
- 처음부터 좋은 함수를 짜려하기 보다는 글짓기처럼 초안을 우선 작성하고 체크리스트를 통해 함수를 다듬는 식으로 작성해보자.
함수 체크리스트
✅ 서술적인 이름을 사용했는가?
✅ 20줄 이하인가?
✅ 인수를 최소화 하였는가?
✅ 명령과 조회를 분리하였는가?
✅ 중복되는 코드는 없는가?
✅ 하나의 기능만 수행하는가?
✅ 오류는 예외 처리하여 분리하였는가?
✅ 추상화 수준이 동일한가?
✅ SRP, OCP를 준수하는가?
✅ 단위 테스트를 수행했는가?
반응형
'나는 이렇게 본다 > Clean Code' 카테고리의 다른 글
원활한 소통을 장려하는 코드 형식은 무엇일까? (0) | 2022.02.01 |
---|---|
주석은 언제나 실패를 의미한다. (0) | 2022.01.31 |
의미 있는 이름 (0) | 2022.01.26 |
깨끗한 코드야말로 더 빨리 가는 유일한 방법 (0) | 2022.01.23 |
소프트웨어는 80% 이상이 '유지보수'다 (0) | 2022.01.22 |