* Function
원칙
- 가장 중요한 원칙은 한가지 일만 해야한다!
- 극단적으로 4줄 짜리 함수여야 한다! 라는 말이 존재 (이를 가능하게 하려면 Indentation, while, nested if 등이 없어야 함, if 같은 경우는 결국 내부에 if-else 문으로 나눠지기 때문에 더욱 함수를 크고 복잡하게 만듬 그리고 사용한다면 코틀린에서 추천하는 것처럼 제어문이 아닌 값으로 평가해야함)
- 잘 지어진 서술적인 긴 이름을 갖는 많은/작은 함수들로 유지되어야 함(Small many functions, Nice descriptive long name)
The First Rule of Functions
- 더 이상 작아질 수 없을 만큼 작아야한다.
- 마틴 파울러가 쓴 CleanCode 에서는 큰 함수를 보면 클래스(새로운 오브젝트)로 추출할 생각을 먼저 해야한다(Extract Method Object).
- 클래스는 일련의 변수들이 동작하는 기능의 집합이다.
리팩토링 과정
1. 큰 메서드가 있다면, 오브젝트로 추출하기 (intellij 명령어 - Extract Method Object) e.g. xxxBuilder
2. 메서드 전체에 걸쳐 여러군데에서 사용되고 있는 변수가 있다면, Field variable 로 추출하기(intellij 명령어 Extract Field)
(Class 의 Field 로 변경하게 되면, 나중에 또 다른 작은 메서드로 분리할 때 추가적으로 파라미터로 넘기지 않아도 됨)
3. 코드가 중복되는 부분이 있는데, 완전 같지 않고 조금 다른 부분이 있다면, 그 부분만 따로 변수로 처리할 수 있도록 한다 (intellij 명령어 Extract Field variable)
개선되서 좋은 점이 있나?
- 먼저 읽기 쉬워지고, 이해하기 시워지고, 함수가 자신의 의도를 잘 전달할 수 있음
개선의 원인?
- Small : 함수는 작아질 수 있을만큼 가장 작은 단위가 되었기 때문
- 블록이 적어야함 : if, else, while 문장 등의 내부 블록은 한줄이어야 한다.
- Indentation 이 적어야 함(함수는 중첩 구조를 갖을 만큼 크면 안됨, 들여쓰기는 보통 1~2 단계정도로 코드를 구성하는 것이 좋다)
메서드의 이름은 내부 구현을 추상화하여 그대로 표현하고 있어야한다.
언제까지 Function 을 나눠야할까?
- 함수를 나눴을 때, 그 내부에 추상화 수준과 외부의 추상화 수준이 같다면, 더이상 진행할 필요가 없다.
- 어떤 기능을 To 부정사처럼 표현하고, 나눠 나간다. (~~를 하기위해선, ~~를 해야해 를 반복한다)
큰함수는 변수와 인자들을 가지고, 들여쓰기가 존재하고, 변수들이 서로 커뮤니케이션이 있다면 -> 항상 하나 이상의 클래스로 분리할 수 있다.
영상에서는 PrimePrinter 메서드를 리팩토링 하는 영상을 보여주는데, 위가 리팩토링 하기전, 아래가 리팩토링 이후 이다.
이전에는 PrimePrinter 메서드안에 Generator와 Printer 의 기능 모두가 있었는데, 리팩토링 이후에는 PrimePrinter 라는 상위 클래스가 있고, PrimeGenerator 클래스와 NumberPrinter 클래스를 사용하는 방식으로 변경이 되었다.
해당 구조의 장점은 이후 더욱 PrimeGenerator 하는 알고리즘이 개발되어, 변경이 필요할 때 PrimePrinter 에는 영향이 없고, 그저 PrimeGenerator 에 새로운 알고리즘을 추가하기만 하면된다. 또한 다른 클래스에서 숫자를 출력해야하는 일이 생긴다면, NumberPrinter 클래스를 사용하여 클래스가 재사용 될수도 있다.
* One function - one thing?
하나 이상의 섹션으로 구성된 함수는 적어도 유지보수할 개발자의 입장에서는 One thing 이 아니라 그저 알수없는 코드 뭉텅이일 뿐이다.
가장 존중받아야할 사람은 내가 아니라, 앞으로 이 코드를 읽게 될 개발자들. 그 상황을 배려하고 코드를 작성하자. (물론 말만 쉽고, 행동은 어렵다)
한 함수는 하나의 추상화 기능을 가지고 있으면 된다. But, 추상화 레벨은 모두 다르게 생각할 수 있고, 불분명하다.
이를 해결하려면, Extract Till you Drop (더이상 Extract 할 수 없을 때 까지, 혹은 포기할 정도로 추출하다) 4줄 이내로 함수들을 구성하려고 노력하고, if, while 문 등에서 {} 가 보이면 Extract 의 대상이 된다.
* Conclusion
- 함수는 작아야한다. 그리고 그것(당신이 생각하는 것보다)보다 더 작아야한다.
- 이름을 잘 지으면 당신뿐만 아니라 모든 사람들의 시간을 절약해 준다.(당신의 코드를 이해하기 위한 네비게이션 역할을 한다)
(물론 처음부터 함수의 이름을 잘 지을 수는 없다. 아이가 생겼을 때 성별도 모르고 이름을 먼저 지는 것은 어려운 것이라고 봐도 된다. 대신 함수를 만들때는 문법이나 철자를 틀리지 않고 작성하자)
'Code Paradigm' 카테고리의 다른 글
클린 코더스 강의 요약(Architecture) - 5 (0) | 2020.11.03 |
---|---|
클린 코더스 강의 요약(Form) - 4 (0) | 2020.10.05 |
클린 코더스 강의 요약(Function Structure) - 3 (0) | 2020.07.21 |
클린 코더스 강의 요약 (OOP) - 1 (0) | 2020.07.19 |
코틀린으로 작성하는 Double Dispatch(더블 디스패치) (0) | 2020.03.22 |