SlideShare a Scribd company logo
1 of 24
CLEAN CODE
함수를 만드는 규칙 작게 만들어라. 더 작게 만들어라. If 문/ else 문/ while 문에 들어가는 블록은 한 줄로 함수에서 들여쓰기 수준은 1이나 2단으로 한다.
함수는 한 가지만 해야 한다. 그 한 가지를 잘 해야 한다. 여기서 한 가지만 이란 같은 추상화 수준을 의미한다. 한 가지 작업을 수행하는 함수는 섹션으로 분할하기 힘들다.
추상화 수준  높음 getHtml() 	String pagePathName = PathParser.render(pagePath); 	.append(“”); 낮음 추상화 수준이 같지 않으면 읽기가 어렵다. 깨진 창문 효과로 인해 코드가 계속해서 나빠질 수 있다.
switch문은 N가지 작업을 처리한다. 하지만 불행히도switch문을 피할 수는 없다. switch문은 일반적으로 다음과 같은 문제점을 가진다. ,[object Object]
OCP 위반
코드 중복해결책은 ? 다형성을 이용하라!
작은 함수는 서술적인 이름을 고르기 쉽다. 긴 서술적인 이름 > 짧고 어려운 이름 IDE를 이용하라. replace 기능을 이용해서 이런저런 이름을 시도해 보라. 서술적인 이름은 코드 개선에도 도움을 준다. 이름을 지을 때 일관성이 중요하다.
함수의 인수는 적을수록 좋다. 인수가 많으면 테스트 케이스를 작성하기 어렵다. 출력 인수는 입력 인수보다 이해하기 어렵다. 반환값을 기대하지 출력 인수를 기대하지 않는다.
booleanfileExists(“MyFile”) 과 같은 조회 InputStreamfileOpen(“MyFile”) 과 같은 명령 두 형식은 단항 함수가 당연하다. 시스템의 상태를 바꾸는 이벤트 함수도 단항 함수로 괜찮다.
플래그 인수는 추하다. 함수가 여러 가지를 처리한다고 공표하는 것과 같다. renderForSuit() renderForSingleTest() < render(booleanisSuite)
writeField(name) vswriteField(outputStream, name) 어느 쪽이 이햐하기 쉬운가? 이항 -> 단항으로 변환을 할 수 있다면 그렇게 하자. 이항 인수가 적절한 경우도 있다. EX) Point p = new Point(0, 0) vs Point p = new Point(0) 만약 두 인수가 한 가지 값을 표현하거나 자연적인 순서가 있다면 OK assertEquals(expected, actual) 과 같이 당연한 이항 함수도 자연적인 순서가 존재하지 않아서 실수를 유발한다.
Difficulty 삼항 함수 >이항 함수 assertEqual(message, expected, actual) 첫 번째 인수가 expected라고 예상하지 않았나? 예외) assertEqual(1.0, amount, 0.001) 이해하기는 어렵지만, 부동소수점의 정밀도를 고려하면 가치는 있다.
Circle	makeCircle(double x, double y, double radius); vs Circle	makeCircle(Point center, double radius); 같은 개념의 인수를 새로운 객체로 합칠 수 있는지?  확인하자!
String.format, printf와 같이 가변 인수가 필요한 경우가 있다. 가변 인수를 한 개의 인자로 생각할 때 마찬가지로 함수의 인자 수가 삼항을 넘으면 안된다.
함수의 의도를 표현하기 위해서 좋은 이름은 필수적이다. 단항 함수는 함수와 인수 -> 동사/명사로 EX) 	write(name), writeField(name) 또 함수 이름에 키워드를 추가할 수도 있다. EX) assertEquals < assertExpectedEqualsActual(expected, actual) 이렇게 함으로써 인수의 순서 문제를 해결할 수 있다.
부수 효과는 함수가 한 가지 일만 수행한다는 원칙을 위배한다. 부수 효과로 인해 일시적인 결합이나 순서 종속성이 생긴다. 때로, 일시적인 결합이 필요하다면 함수 이름에 명시하자. 물론 함수가 한 가지만 한다는 규칙을 위반하지만 말이다.
출력 인수를 피하라! 출력 인수는 코드 읽기의 흐름을 망해한다. OOP이전에는 출력 인수가 필요했다. 하지만 OOP에선 this가 출력 인수를 대신한다.
If( set(“username”, “unclebob”) ) /*…*/ 확인 or 설정 ? If( attributeExists(“username”) ) { setAttribute(“username”, “unclebob”); /*…*/ } 명령과 조회를 구분하자.
오류 코드를 반환하는 함수도 명령/조회의 규칙을 위반한다. EX) If( deletePage(page) == E_OK ) { if( registry.deleteReference(page.name) == E_OK ) { 	if( configKeys.deleteKey(page.name.makeKey()) == E_OK ) 	{ 		logger.log(“page deleted”); 		} 	else 	{ 		logger.log(“configKey not deleted”); 	} } else { 	logger.log(“deleteReference from registry failed”); } } else { logger.log(“delete failed”); return E_ERROR; }
예외를 사용하면 오류 처리 코드가 원래 코드에서 분리된다. EX) try { deletePage(page); registry.deleteReference(page.name); configKeys.deleteKey(page.name.makeKey()); } catch(Exception e) { logger.log(e.getMessage()); }
오류 처리도 한 가지 작업이므로 try/catch 블록을 별도의 함수로 뽑아내면 코드가 더 보기 좋아진다. EX) public  void delete(Page page) { try { deletePageAndAllReference(page); 	} catch(Exception e) { logError(e); } }
오류 코드도 OCP를 위반한다. 오류 코드를 추가하려면 코드를 수정해야 한다. DRY Don’t Repeat Youself.  반복을 하지 말자! 중복은 오류의 원천이다.
함수를 만드는 작업은 일련의 제련 과정이다. 첫 술에 배부르랴! 점차적으로 Refactoring하자. 하지만 테스트가 없다면 이런 과정은 불가능하다.

More Related Content

What's hot

Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Dong Chan Shin
 
[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수Keunhyun Oh
 
[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1Keunhyun Oh
 
C# 고급 문법 part 2
C# 고급 문법 part 2C# 고급 문법 part 2
C# 고급 문법 part 2준영 박
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기rupert kim
 
Cleancode ch16 serialdate_refactoring
Cleancode ch16 serialdate_refactoringCleancode ch16 serialdate_refactoring
Cleancode ch16 serialdate_refactoringKyungryul KIM
 
C# 기초 문법 part 2
C# 기초 문법 part 2C# 기초 문법 part 2
C# 기초 문법 part 2준영 박
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8Ki Sung Bae
 
Processing 4th Class: Function
Processing 4th Class: FunctionProcessing 4th Class: Function
Processing 4th Class: FunctionMinGi KYUNG
 
Clean code 3장-함수
Clean code 3장-함수Clean code 3장-함수
Clean code 3장-함수Yong-sang Lee
 
[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿해강
 
Scala nested function generic function
Scala nested function generic functionScala nested function generic function
Scala nested function generic functionYong Joon Moon
 
호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFEChangHyeon Bae
 
C# 기초 문법 part 1
C# 기초 문법 part 1C# 기초 문법 part 1
C# 기초 문법 part 1준영 박
 
7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기GeniusYG
 
03. function in typescript
03. function in typescript03. function in typescript
03. function in typescriptHan JaeYeab
 
Deep dive functional thinking
Deep dive functional thinkingDeep dive functional thinking
Deep dive functional thinkingJeong-gyu Kim
 

What's hot (20)

Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬Effective c++ chapter5 6_ 131039 신동찬
Effective c++ chapter5 6_ 131039 신동찬
 
[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수[SwiftStudy 2016] 3장. 함수
[SwiftStudy 2016] 3장. 함수
 
[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1[SwiftStudy 2016] 2장. Swift 타입 파트 1
[SwiftStudy 2016] 2장. Swift 타입 파트 1
 
C# 고급 문법 part 2
C# 고급 문법 part 2C# 고급 문법 part 2
C# 고급 문법 part 2
 
Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기Java 8 api :: lambda 이용하기
Java 8 api :: lambda 이용하기
 
Cleancode ch16 serialdate_refactoring
Cleancode ch16 serialdate_refactoringCleancode ch16 serialdate_refactoring
Cleancode ch16 serialdate_refactoring
 
C# 기초 문법 part 2
C# 기초 문법 part 2C# 기초 문법 part 2
C# 기초 문법 part 2
 
5 6 1
5 6 15 6 1
5 6 1
 
The art of readable code ch4 ch8
The art of readable code ch4   ch8The art of readable code ch4   ch8
The art of readable code ch4 ch8
 
Processing 4th Class: Function
Processing 4th Class: FunctionProcessing 4th Class: Function
Processing 4th Class: Function
 
Clean code 3장-함수
Clean code 3장-함수Clean code 3장-함수
Clean code 3장-함수
 
What’s new in c++11
What’s new in c++11What’s new in c++11
What’s new in c++11
 
javascript01
javascript01javascript01
javascript01
 
[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿
 
Scala nested function generic function
Scala nested function generic functionScala nested function generic function
Scala nested function generic function
 
호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE호이스팅, 클로저, IIFE
호이스팅, 클로저, IIFE
 
C# 기초 문법 part 1
C# 기초 문법 part 1C# 기초 문법 part 1
C# 기초 문법 part 1
 
7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기7.읽기 쉽게 흐름제어 만들기
7.읽기 쉽게 흐름제어 만들기
 
03. function in typescript
03. function in typescript03. function in typescript
03. function in typescript
 
Deep dive functional thinking
Deep dive functional thinkingDeep dive functional thinking
Deep dive functional thinking
 

Viewers also liked

Clean code(01)
Clean code(01)Clean code(01)
Clean code(01)규열 김
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)규열 김
 
Clean code chapter9
Clean code chapter9Clean code chapter9
Clean code chapter9ukjinkwoun
 
Clean code chapter11 - systems
Clean code   chapter11 - systemsClean code   chapter11 - systems
Clean code chapter11 - systemsitomcc
 
Clean code(04)
Clean code(04)Clean code(04)
Clean code(04)규열 김
 
Clean code(05)
Clean code(05)Clean code(05)
Clean code(05)규열 김
 
Clean code chapter1
Clean code chapter1Clean code chapter1
Clean code chapter1ukjinkwoun
 
Tobi 스프링 2장 php version
Tobi 스프링 2장   php versionTobi 스프링 2장   php version
Tobi 스프링 2장 php versionukjinkwoun
 
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장ukjinkwoun
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)Jay Park
 

Viewers also liked (14)

Clean code(01)
Clean code(01)Clean code(01)
Clean code(01)
 
Clean code(02)
Clean code(02)Clean code(02)
Clean code(02)
 
Clean code chapter9
Clean code chapter9Clean code chapter9
Clean code chapter9
 
Clean code chapter11 - systems
Clean code   chapter11 - systemsClean code   chapter11 - systems
Clean code chapter11 - systems
 
코드 Ch20
코드 Ch20코드 Ch20
코드 Ch20
 
Clean code(04)
Clean code(04)Clean code(04)
Clean code(04)
 
Clean code(05)
Clean code(05)Clean code(05)
Clean code(05)
 
Clean code chapter1
Clean code chapter1Clean code chapter1
Clean code chapter1
 
Tobi 스프링 2장 php version
Tobi 스프링 2장   php versionTobi 스프링 2장   php version
Tobi 스프링 2장 php version
 
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
만들면서 배우는 Cocos2d x 멀티 플랫폼 게임 프로그래밍 10-11장
 
Clean code Chapter.2
Clean code Chapter.2Clean code Chapter.2
Clean code Chapter.2
 
Chean code chapter 1
Chean code chapter 1Chean code chapter 1
Chean code chapter 1
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)깨끗한 코드 (클린 코드, Clean Code)
깨끗한 코드 (클린 코드, Clean Code)
 

Similar to Clean code(03)

읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다wonmin lee
 
Scala 기초 (3)
Scala 기초 (3)Scala 기초 (3)
Scala 기초 (3)명성 정
 
Scala 기초 (2)
Scala 기초 (2)Scala 기초 (2)
Scala 기초 (2)명성 정
 
[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩jusingame
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여iamprogrammerofficial
 
Template at c++
Template at c++Template at c++
Template at c++Lusain Kim
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법SeongHyun Ahn
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Park Jonggun
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오Taeoh Kim
 
The art of readable code _ Part I
The art of readable code _ Part IThe art of readable code _ Part I
The art of readable code _ Part I운용 최
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLIDRyan Park
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinDong Chan Shin
 

Similar to Clean code(03) (20)

읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다읽기 좋은 코드가 좋은코드다
읽기 좋은 코드가 좋은코드다
 
Scala 기초 (3)
Scala 기초 (3)Scala 기초 (3)
Scala 기초 (3)
 
Scala 기초 (2)
Scala 기초 (2)Scala 기초 (2)
Scala 기초 (2)
 
[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩[C언어]함수오버로딩과오버라이딩
[C언어]함수오버로딩과오버라이딩
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
Working with code
Working with codeWorking with code
Working with code
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
2015 나는 프로그래머다 컨퍼런스 (11) 염산악 - 가독성에 대하여
 
Template at c++
Template at c++Template at c++
Template at c++
 
파이썬 기본 문법
파이썬 기본 문법파이썬 기본 문법
파이썬 기본 문법
 
The Art Of Readable Code.
The Art Of Readable Code.The Art Of Readable Code.
The Art Of Readable Code.
 
Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수Start IoT with JavaScript - 6.함수
Start IoT with JavaScript - 6.함수
 
자바 8 학습
자바 8 학습자바 8 학습
자바 8 학습
 
스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오스칼라와 스파크 영혼의 듀오
스칼라와 스파크 영혼의 듀오
 
The art of readable code _ Part I
The art of readable code _ Part IThe art of readable code _ Part I
The art of readable code _ Part I
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 

Clean code(03)

  • 2. 함수를 만드는 규칙 작게 만들어라. 더 작게 만들어라. If 문/ else 문/ while 문에 들어가는 블록은 한 줄로 함수에서 들여쓰기 수준은 1이나 2단으로 한다.
  • 3. 함수는 한 가지만 해야 한다. 그 한 가지를 잘 해야 한다. 여기서 한 가지만 이란 같은 추상화 수준을 의미한다. 한 가지 작업을 수행하는 함수는 섹션으로 분할하기 힘들다.
  • 4. 추상화 수준 높음 getHtml() String pagePathName = PathParser.render(pagePath); .append(“”); 낮음 추상화 수준이 같지 않으면 읽기가 어렵다. 깨진 창문 효과로 인해 코드가 계속해서 나빠질 수 있다.
  • 5.
  • 7. 코드 중복해결책은 ? 다형성을 이용하라!
  • 8. 작은 함수는 서술적인 이름을 고르기 쉽다. 긴 서술적인 이름 > 짧고 어려운 이름 IDE를 이용하라. replace 기능을 이용해서 이런저런 이름을 시도해 보라. 서술적인 이름은 코드 개선에도 도움을 준다. 이름을 지을 때 일관성이 중요하다.
  • 9. 함수의 인수는 적을수록 좋다. 인수가 많으면 테스트 케이스를 작성하기 어렵다. 출력 인수는 입력 인수보다 이해하기 어렵다. 반환값을 기대하지 출력 인수를 기대하지 않는다.
  • 10. booleanfileExists(“MyFile”) 과 같은 조회 InputStreamfileOpen(“MyFile”) 과 같은 명령 두 형식은 단항 함수가 당연하다. 시스템의 상태를 바꾸는 이벤트 함수도 단항 함수로 괜찮다.
  • 11. 플래그 인수는 추하다. 함수가 여러 가지를 처리한다고 공표하는 것과 같다. renderForSuit() renderForSingleTest() < render(booleanisSuite)
  • 12. writeField(name) vswriteField(outputStream, name) 어느 쪽이 이햐하기 쉬운가? 이항 -> 단항으로 변환을 할 수 있다면 그렇게 하자. 이항 인수가 적절한 경우도 있다. EX) Point p = new Point(0, 0) vs Point p = new Point(0) 만약 두 인수가 한 가지 값을 표현하거나 자연적인 순서가 있다면 OK assertEquals(expected, actual) 과 같이 당연한 이항 함수도 자연적인 순서가 존재하지 않아서 실수를 유발한다.
  • 13. Difficulty 삼항 함수 >이항 함수 assertEqual(message, expected, actual) 첫 번째 인수가 expected라고 예상하지 않았나? 예외) assertEqual(1.0, amount, 0.001) 이해하기는 어렵지만, 부동소수점의 정밀도를 고려하면 가치는 있다.
  • 14. Circle makeCircle(double x, double y, double radius); vs Circle makeCircle(Point center, double radius); 같은 개념의 인수를 새로운 객체로 합칠 수 있는지? 확인하자!
  • 15. String.format, printf와 같이 가변 인수가 필요한 경우가 있다. 가변 인수를 한 개의 인자로 생각할 때 마찬가지로 함수의 인자 수가 삼항을 넘으면 안된다.
  • 16. 함수의 의도를 표현하기 위해서 좋은 이름은 필수적이다. 단항 함수는 함수와 인수 -> 동사/명사로 EX) write(name), writeField(name) 또 함수 이름에 키워드를 추가할 수도 있다. EX) assertEquals < assertExpectedEqualsActual(expected, actual) 이렇게 함으로써 인수의 순서 문제를 해결할 수 있다.
  • 17. 부수 효과는 함수가 한 가지 일만 수행한다는 원칙을 위배한다. 부수 효과로 인해 일시적인 결합이나 순서 종속성이 생긴다. 때로, 일시적인 결합이 필요하다면 함수 이름에 명시하자. 물론 함수가 한 가지만 한다는 규칙을 위반하지만 말이다.
  • 18. 출력 인수를 피하라! 출력 인수는 코드 읽기의 흐름을 망해한다. OOP이전에는 출력 인수가 필요했다. 하지만 OOP에선 this가 출력 인수를 대신한다.
  • 19. If( set(“username”, “unclebob”) ) /*…*/ 확인 or 설정 ? If( attributeExists(“username”) ) { setAttribute(“username”, “unclebob”); /*…*/ } 명령과 조회를 구분하자.
  • 20. 오류 코드를 반환하는 함수도 명령/조회의 규칙을 위반한다. EX) If( deletePage(page) == E_OK ) { if( registry.deleteReference(page.name) == E_OK ) { if( configKeys.deleteKey(page.name.makeKey()) == E_OK ) { logger.log(“page deleted”); } else { logger.log(“configKey not deleted”); } } else { logger.log(“deleteReference from registry failed”); } } else { logger.log(“delete failed”); return E_ERROR; }
  • 21. 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리된다. EX) try { deletePage(page); registry.deleteReference(page.name); configKeys.deleteKey(page.name.makeKey()); } catch(Exception e) { logger.log(e.getMessage()); }
  • 22. 오류 처리도 한 가지 작업이므로 try/catch 블록을 별도의 함수로 뽑아내면 코드가 더 보기 좋아진다. EX) public void delete(Page page) { try { deletePageAndAllReference(page); } catch(Exception e) { logError(e); } }
  • 23. 오류 코드도 OCP를 위반한다. 오류 코드를 추가하려면 코드를 수정해야 한다. DRY Don’t Repeat Youself. 반복을 하지 말자! 중복은 오류의 원천이다.
  • 24. 함수를 만드는 작업은 일련의 제련 과정이다. 첫 술에 배부르랴! 점차적으로 Refactoring하자. 하지만 테스트가 없다면 이런 과정은 불가능하다.
  • 25. 좋은 함수를 작성하는 것도 중요하지만 진짜 목표는 시스템이라는 이야기를 풀어가는데 있다는 것을 잊지말자!
  • 26.