SlideShare a Scribd company logo
CLEAN CODE
ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ทœ์น™์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.๋” ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.If ๋ฌธ/ else ๋ฌธ/ while ๋ฌธ์— ๋“ค์–ด๊ฐ€๋Š” ๋ธ”๋ก์€ ํ•œ ์ค„๋กœํ•จ์ˆ˜์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€์€ 1์ด๋‚˜ 2๋‹จ์œผ๋กœ ํ•œ๋‹ค.
ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.๊ทธ ํ•œ ๊ฐ€์ง€๋ฅผ ์ž˜ ํ•ด์•ผ ํ•œ๋‹ค.์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€๋งŒ ์ด๋ž€ ๊ฐ™์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์˜๋ฏธํ•œ๋‹ค.ํ•œ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์„น์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
์ถ”์ƒํ™” ์ˆ˜์ค€ ๋†’์ŒgetHtml()	String pagePathName = PathParser.render(pagePath);	.append(โ€œ\nโ€);๋‚ฎ์Œ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.๊นจ์ง„ ์ฐฝ๋ฌธ ํšจ๊ณผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.
switch๋ฌธ์€ N๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„switch๋ฌธ์„ ํ”ผํ•  ์ˆ˜๋Š” ์—†๋‹ค.switch๋ฌธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง„๋‹ค. SRP ์œ„๋ฐ˜
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)๋งŒ์•ฝ ๋‘ ์ธ์ˆ˜๊ฐ€ ํ•œ ๊ฐ€์ง€ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๊ฑฐ๋‚˜ ์ž์—ฐ์ ์ธ ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด OKassertEquals(expected, actual)๊ณผ ๊ฐ™์ด ๋‹น์—ฐํ•œ ์ดํ•ญ ํ•จ์ˆ˜๋„ ์ž์—ฐ์ ์ธ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.
Difficulty์‚ผํ•ญ ํ•จ์ˆ˜ >์ดํ•ญ ํ•จ์ˆ˜assertEqual(message, expected, actual)์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ expected๋ผ๊ณ  ์˜ˆ์ƒํ•˜์ง€ ์•Š์•˜๋‚˜?์˜ˆ์™ธ)assertEqual(1.0, amount, 0.001)์ดํ•ดํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ, ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ์ •๋ฐ€๋„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ๊ฐ€์น˜๋Š” ์žˆ๋‹ค.
Circle	makeCircle(double x, double y, double radius);vsCircle	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๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.DRYDonโ€™t Repeat Youself. ๋ฐ˜๋ณต์„ ํ•˜์ง€ ๋ง์ž!์ค‘๋ณต์€ ์˜ค๋ฅ˜์˜ ์›์ฒœ์ด๋‹ค.
ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—…์€์ผ๋ จ์˜ ์ œ๋ จ ๊ณผ์ •์ด๋‹ค.์ฒซ ์ˆ ์— ๋ฐฐ๋ถ€๋ฅด๋žด!์ ์ฐจ์ ์œผ๋กœ Refactoringํ•˜์ž.ํ•˜์ง€๋งŒํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ์ด๋Ÿฐ ๊ณผ์ •์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

More Related Content

PPTX
[2011 04 30]python-3์žฅ
Jong Pil Won
ย 
PPTX
Effective c++ 3
ํ˜„์ฐฌ ์–‘
ย 
PDF
ํ˜„๋Œ€๊ณ ๋“ฑํ•™๊ต PHP ๊ฐ•์˜ - 2์ฐจ์‹œ (์„ค๋ฆฌ๋ฒˆ ํ”„๋กœ์ ํŠธ)
Ukjae Jeong
ย 
PDF
ํ˜„๋Œ€๊ณ ๋“ฑํ•™๊ต PHP ๊ฐ•์˜ - 3์ฐจ์‹œ (์„ค๋ฆฌ๋ฒˆ ํ”„๋กœ์ ํŠธ)
Ukjae Jeong
ย 
KEY
Cleancode ch5
Kyungryul KIM
ย 
PPTX
Code complete chapter 19, 20 organize
hanstar17
ย 
PDF
04. interface in typescript
Han JaeYeab
ย 
PDF
C# ๊ณ ๊ธ‰ ๋ฌธ๋ฒ• part 1
์ค€์˜ ๋ฐ•
ย 
[2011 04 30]python-3์žฅ
Jong Pil Won
ย 
Effective c++ 3
ํ˜„์ฐฌ ์–‘
ย 
ํ˜„๋Œ€๊ณ ๋“ฑํ•™๊ต PHP ๊ฐ•์˜ - 2์ฐจ์‹œ (์„ค๋ฆฌ๋ฒˆ ํ”„๋กœ์ ํŠธ)
Ukjae Jeong
ย 
ํ˜„๋Œ€๊ณ ๋“ฑํ•™๊ต PHP ๊ฐ•์˜ - 3์ฐจ์‹œ (์„ค๋ฆฌ๋ฒˆ ํ”„๋กœ์ ํŠธ)
Ukjae Jeong
ย 
Cleancode ch5
Kyungryul KIM
ย 
Code complete chapter 19, 20 organize
hanstar17
ย 
04. interface in typescript
Han JaeYeab
ย 
C# ๊ณ ๊ธ‰ ๋ฌธ๋ฒ• part 1
์ค€์˜ ๋ฐ•
ย 

What's hot (20)

PDF
Effective c++ chapter5 6_ 131039 ์‹ ๋™์ฐฌ
Dong Chan Shin
ย 
PDF
[SwiftStudy 2016] 3์žฅ. ํ•จ์ˆ˜
Keunhyun Oh
ย 
PDF
[SwiftStudy 2016] 2์žฅ. Swift ํƒ€์ž… ํŒŒํŠธ 1
Keunhyun Oh
ย 
PDF
C# ๊ณ ๊ธ‰ ๋ฌธ๋ฒ• part 2
์ค€์˜ ๋ฐ•
ย 
PDF
Java 8 api :: lambda ์ด์šฉํ•˜๊ธฐ
rupert kim
ย 
KEY
Cleancode ch16 serialdate_refactoring
Kyungryul KIM
ย 
PDF
C# ๊ธฐ์ดˆ ๋ฌธ๋ฒ• part 2
์ค€์˜ ๋ฐ•
ย 
PDF
5 6 1
nexthw
ย 
PDF
The art of readable code ch4 ch8
Ki Sung Bae
ย 
PPTX
Processing 4th Class: Function
MinGi KYUNG
ย 
PDF
Clean code 3แ„Œแ…กแ†ผ-แ„’แ…กแ†ทแ„‰แ…ฎ
Yong-sang Lee
ย 
PPTX
Whatโ€™s new in c++11
Jeongsang Baek
ย 
PPTX
javascript01
ChangHyeon Bae
ย 
PPTX
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 13์žฅ ํ…œํ”Œ๋ฆฟ
ํ•ด๊ฐ•
ย 
PPTX
Scala nested function generic function
Yong Joon Moon
ย 
PPT
ํ˜ธ์ด์ŠคํŒ…, ํด๋กœ์ €, IIFE
ChangHyeon Bae
ย 
PDF
C# ๊ธฐ์ดˆ ๋ฌธ๋ฒ• part 1
์ค€์˜ ๋ฐ•
ย 
PPTX
7.์ฝ๊ธฐ ์‰ฝ๊ฒŒ ํ๋ฆ„์ œ์–ด ๋งŒ๋“ค๊ธฐ
GeniusYG
ย 
PDF
03. function in typescript
Han JaeYeab
ย 
PDF
Deep dive functional thinking
Jeong-gyu Kim
ย 
Effective c++ chapter5 6_ 131039 ์‹ ๋™์ฐฌ
Dong Chan Shin
ย 
[SwiftStudy 2016] 3์žฅ. ํ•จ์ˆ˜
Keunhyun Oh
ย 
[SwiftStudy 2016] 2์žฅ. Swift ํƒ€์ž… ํŒŒํŠธ 1
Keunhyun Oh
ย 
C# ๊ณ ๊ธ‰ ๋ฌธ๋ฒ• part 2
์ค€์˜ ๋ฐ•
ย 
Java 8 api :: lambda ์ด์šฉํ•˜๊ธฐ
rupert kim
ย 
Cleancode ch16 serialdate_refactoring
Kyungryul KIM
ย 
C# ๊ธฐ์ดˆ ๋ฌธ๋ฒ• part 2
์ค€์˜ ๋ฐ•
ย 
5 6 1
nexthw
ย 
The art of readable code ch4 ch8
Ki Sung Bae
ย 
Processing 4th Class: Function
MinGi KYUNG
ย 
Clean code 3แ„Œแ…กแ†ผ-แ„’แ…กแ†ทแ„‰แ…ฎ
Yong-sang Lee
ย 
Whatโ€™s new in c++11
Jeongsang Baek
ย 
javascript01
ChangHyeon Bae
ย 
[์•„๊ฟˆ์‚ฌ] The C++ Programming Language 13์žฅ ํ…œํ”Œ๋ฆฟ
ํ•ด๊ฐ•
ย 
Scala nested function generic function
Yong Joon Moon
ย 
ํ˜ธ์ด์ŠคํŒ…, ํด๋กœ์ €, IIFE
ChangHyeon Bae
ย 
C# ๊ธฐ์ดˆ ๋ฌธ๋ฒ• part 1
์ค€์˜ ๋ฐ•
ย 
7.์ฝ๊ธฐ ์‰ฝ๊ฒŒ ํ๋ฆ„์ œ์–ด ๋งŒ๋“ค๊ธฐ
GeniusYG
ย 
03. function in typescript
Han JaeYeab
ย 
Deep dive functional thinking
Jeong-gyu Kim
ย 
Ad

Viewers also liked (14)

PPTX
Clean code(01)
๊ทœ์—ด ๊น€
ย 
PPTX
Clean code(02)
๊ทœ์—ด ๊น€
ย 
PPTX
Clean code chapter9
ukjinkwoun
ย 
PPT
Clean code chapter11 - systems
itomcc
ย 
PPTX
์ฝ”๋“œ Ch20
ukjinkwoun
ย 
PPTX
Clean code(04)
๊ทœ์—ด ๊น€
ย 
PPTX
Clean code(05)
๊ทœ์—ด ๊น€
ย 
PPTX
Clean code chapter1
ukjinkwoun
ย 
PPTX
Tobi ์Šคํ”„๋ง 2์žฅ php version
ukjinkwoun
ย 
PPTX
๋งŒ๋“ค๋ฉด์„œ ๋ฐฐ์šฐ๋Š” Cocos2d x ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 10-11์žฅ
ukjinkwoun
ย 
PDF
Clean code Chapter.2
HyeonSeok Choi
ย 
PDF
Chean code chapter 1
HyeonSeok Choi
ย 
PDF
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
HyeonSeok Choi
ย 
PPTX
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
Jay Park
ย 
Clean code(01)
๊ทœ์—ด ๊น€
ย 
Clean code(02)
๊ทœ์—ด ๊น€
ย 
Clean code chapter9
ukjinkwoun
ย 
Clean code chapter11 - systems
itomcc
ย 
์ฝ”๋“œ Ch20
ukjinkwoun
ย 
Clean code(04)
๊ทœ์—ด ๊น€
ย 
Clean code(05)
๊ทœ์—ด ๊น€
ย 
Clean code chapter1
ukjinkwoun
ย 
Tobi ์Šคํ”„๋ง 2์žฅ php version
ukjinkwoun
ย 
๋งŒ๋“ค๋ฉด์„œ ๋ฐฐ์šฐ๋Š” Cocos2d x ๋ฉ€ํ‹ฐ ํ”Œ๋žซํผ ๊ฒŒ์ž„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ 10-11์žฅ
ukjinkwoun
ย 
Clean code Chapter.2
HyeonSeok Choi
ย 
Chean code chapter 1
HyeonSeok Choi
ย 
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
HyeonSeok Choi
ย 
แ„แ…ขแ„แ…ณแ†บแ„’แ…กแ†ซ แ„แ…ฉแ„ƒแ…ณ (ํด๋ฆฐ ์ฝ”๋“œ, Clean Code)
Jay Park
ย 
Ad

Similar to Clean code(03) (20)

PDF
ํด๋ฆฐ ์ฝ”๋“œ part1
Minseok Jang
ย 
PPTX
2015 ๋‚˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋‹ค ์ปจํผ๋Ÿฐ์Šค (11) ์—ผ์‚ฐ์•… - ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•˜์—ฌ
iamprogrammerofficial
ย 
PPTX
Clean code
bbongcsu
ย 
PPTX
ํด๋ฆฐ์ฝ”๋“œ์™€ TDD
Herren
ย 
PPTX
[2012 01 28]cleancode 3์žฅ
Jong Pil Won
ย 
DOCX
The Art Of Readable Code.
Unyong (Sheldon) Choi
ย 
DOCX
The art of readable code _ Part I
์šด์šฉ ์ตœ
ย 
PDF
ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ฐ ์ง€์ผœ์•ผ ํ•  ์‚ฌํ•ญ๋“ค
Lee Geonhee
ย 
PDF
Pure Function and Rx
Hyungho Ko
ย 
PDF
Effective C++ Chapter 1 Summary
SeungYeonChoi10
ย 
PDF
Scala syntax function
Yong Joon Moon
ย 
PDF
แ„‹แ…ฌแ„€แ…จแ„‹แ…ฅ แ„‰แ…ณแ„แ…ฅแ„ƒแ…ต 3/5 function and object
๋ฏผํƒœ ๊น€
ย 
PDF
์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ์›์น™
Hyosang Hong
ย 
PDF
Java ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ์›์น™
Hyosang Hong
ย 
PPTX
C++ ์ฝ”๋”ฉ์˜ ์ •์„.pptx
sung suk seo
ย 
PDF
Working with code
JaeYeoul Ahn
ย 
PDF
์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์„  ๊ทธ๋ฃน(Sig) ๊ฐœ๋ฐœ ์›์น™
Hong Hyo Sang
ย 
PPTX
Load to Clean code
์˜์ฃผ ๋ฐ•
ย 
PPTX
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
์ต์„ฑ ์กฐ
ย 
PPTX
Google c++codingconvention
๋Œ€์˜ ๋…ธ
ย 
ํด๋ฆฐ ์ฝ”๋“œ part1
Minseok Jang
ย 
2015 ๋‚˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋‹ค ์ปจํผ๋Ÿฐ์Šค (11) ์—ผ์‚ฐ์•… - ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•˜์—ฌ
iamprogrammerofficial
ย 
Clean code
bbongcsu
ย 
ํด๋ฆฐ์ฝ”๋“œ์™€ TDD
Herren
ย 
[2012 01 28]cleancode 3์žฅ
Jong Pil Won
ย 
The Art Of Readable Code.
Unyong (Sheldon) Choi
ย 
The art of readable code _ Part I
์šด์šฉ ์ตœ
ย 
ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ฐ ์ง€์ผœ์•ผ ํ•  ์‚ฌํ•ญ๋“ค
Lee Geonhee
ย 
Pure Function and Rx
Hyungho Ko
ย 
Effective C++ Chapter 1 Summary
SeungYeonChoi10
ย 
Scala syntax function
Yong Joon Moon
ย 
แ„‹แ…ฌแ„€แ…จแ„‹แ…ฅ แ„‰แ…ณแ„แ…ฅแ„ƒแ…ต 3/5 function and object
๋ฏผํƒœ ๊น€
ย 
์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ์›์น™
Hyosang Hong
ย 
Java ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ์›์น™
Hyosang Hong
ย 
C++ ์ฝ”๋”ฉ์˜ ์ •์„.pptx
sung suk seo
ย 
Working with code
JaeYeoul Ahn
ย 
์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ์„  ๊ทธ๋ฃน(Sig) ๊ฐœ๋ฐœ ์›์น™
Hong Hyo Sang
ย 
Load to Clean code
์˜์ฃผ ๋ฐ•
ย 
์ดํŽ™ํ‹ฐ๋ธŒ C++ (7~9)
์ต์„ฑ ์กฐ
ย 
Google c++codingconvention
๋Œ€์˜ ๋…ธ
ย 

Clean code(03)

  • 2. ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ทœ์น™์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.๋” ์ž‘๊ฒŒ ๋งŒ๋“ค์–ด๋ผ.If ๋ฌธ/ else ๋ฌธ/ while ๋ฌธ์— ๋“ค์–ด๊ฐ€๋Š” ๋ธ”๋ก์€ ํ•œ ์ค„๋กœํ•จ์ˆ˜์—์„œ ๋“ค์—ฌ์“ฐ๊ธฐ ์ˆ˜์ค€์€ 1์ด๋‚˜ 2๋‹จ์œผ๋กœ ํ•œ๋‹ค.
  • 3. ํ•จ์ˆ˜๋Š” ํ•œ ๊ฐ€์ง€๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.๊ทธ ํ•œ ๊ฐ€์ง€๋ฅผ ์ž˜ ํ•ด์•ผ ํ•œ๋‹ค.์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€๋งŒ ์ด๋ž€ ๊ฐ™์€ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์˜๋ฏธํ•œ๋‹ค.ํ•œ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์„น์…˜์œผ๋กœ ๋ถ„ํ• ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.
  • 4. ์ถ”์ƒํ™” ์ˆ˜์ค€ ๋†’์ŒgetHtml() String pagePathName = PathParser.render(pagePath); .append(โ€œ\nโ€);๋‚ฎ์Œ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๊ฐ™์ง€ ์•Š์œผ๋ฉด์ฝ๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.๊นจ์ง„ ์ฐฝ๋ฌธ ํšจ๊ณผ๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.
  • 5. switch๋ฌธ์€ N๊ฐ€์ง€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„switch๋ฌธ์„ ํ”ผํ•  ์ˆ˜๋Š” ์—†๋‹ค.switch๋ฌธ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์„ ๊ฐ€์ง„๋‹ค. SRP ์œ„๋ฐ˜
  • 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)๋งŒ์•ฝ ๋‘ ์ธ์ˆ˜๊ฐ€ ํ•œ ๊ฐ€์ง€ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๊ฑฐ๋‚˜ ์ž์—ฐ์ ์ธ ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด OKassertEquals(expected, actual)๊ณผ ๊ฐ™์ด ๋‹น์—ฐํ•œ ์ดํ•ญ ํ•จ์ˆ˜๋„ ์ž์—ฐ์ ์ธ ์ˆœ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•œ๋‹ค.
  • 13. Difficulty์‚ผํ•ญ ํ•จ์ˆ˜ >์ดํ•ญ ํ•จ์ˆ˜assertEqual(message, expected, actual)์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜๊ฐ€ expected๋ผ๊ณ  ์˜ˆ์ƒํ•˜์ง€ ์•Š์•˜๋‚˜?์˜ˆ์™ธ)assertEqual(1.0, amount, 0.001)์ดํ•ดํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ, ๋ถ€๋™์†Œ์ˆ˜์ ์˜ ์ •๋ฐ€๋„๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ๊ฐ€์น˜๋Š” ์žˆ๋‹ค.
  • 14. Circle makeCircle(double x, double y, double radius);vsCircle 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๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค.์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.DRYDonโ€™t Repeat Youself. ๋ฐ˜๋ณต์„ ํ•˜์ง€ ๋ง์ž!์ค‘๋ณต์€ ์˜ค๋ฅ˜์˜ ์›์ฒœ์ด๋‹ค.
  • 24. ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ์ž‘์—…์€์ผ๋ จ์˜ ์ œ๋ จ ๊ณผ์ •์ด๋‹ค.์ฒซ ์ˆ ์— ๋ฐฐ๋ถ€๋ฅด๋žด!์ ์ฐจ์ ์œผ๋กœ Refactoringํ•˜์ž.ํ•˜์ง€๋งŒํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋‹ค๋ฉด ์ด๋Ÿฐ ๊ณผ์ •์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • 25. ์ข‹์€ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ์ง„์งœ ๋ชฉํ‘œ๋Š”์‹œ์Šคํ…œ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ๋ฅผ ํ’€์–ด๊ฐ€๋Š”๋ฐ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์žŠ์ง€๋ง์ž!