๐ ๋ชฉ์ฐจ.
3. ํจ์
.์๊ฒ ๋ง๋ค์ด๋ผ!
.ํ๊ฐ์ง๋ง ํด๋ผ!
.์์์ ์๋๋ก ์ฝ๋์ฝ๊ธฐ:๋ด๋ ค๊ฐ๊ธฐ๊ท์น
.์์ ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ๋ผ.
.ํจ์ ์ธ์
.๋ง์ด ์ฐ๋ ๋จํญ ํ์
.ํ๋๊ทธ ์ธ์ ์ง์
.์ธ์ ๊ฐ์ฒด
.์ธ์ ๋ชฉ๋ก
.๋์ฌ์ ํค์๋
.๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ๋ง๋ผ!.
.์ถ๋ ฅ ์ธ์
.๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ผ.
.์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ!.
.try/catch ๋ธ๋ก ๋ฝ์๋ด๊ธฐ
.Error.java ์์กด์ฑ ์์
.๋ฐ๋ณตํ์ง ๋ง๋ผ.
.ํจ์๋ฅผ ์ด๋ป๊ฒ ์ง์ฃ ?
.๊ฒฐ๋ก
โ๏ธ ๋ด์ฉ.
3. ํจ์
.์๊ฒ ๋ง๋ค์ด๋ผ!
ํจ์๋ฅผ ๋ง๋๋ ์ฒซ์งธ ๊ท์น์ '์๊ฒ!'์ด๋ค. ๋ธ๋ก๊ณผ ๋ค์ฌ ์ฐ๊ธฐ, if/else, while ๋ฌธ ๋ฑ ๋ธ๋ก์ ํ ์ค์ด์ผ ํ๋ ์๋ฏธ๋ค.
๊ทธ๋ฌ๋ฉด ๋ฐ๊นฅ์ ๊ฐ์ธ๋ ํจ์๊ฐ ์์์ง ๋ฟ ์๋๋ผ, ๋ธ๋ก ์์์ ํธ์ถํ๋ ํจ์ ์ด๋ฆ์ ์ ์ ํ ์ง๋๋ค๋ฉด, ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ๋ ์ฌ์์ง๋ค.
์ด ๋ง์ ์ค์ฒฉ ๊ตฌ์กฐ๊ฐ ์๊ธธ ๋งํผ ํจ์๊ฐ ์ปค์ ธ์๋ ์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํจ์์์ ๋ค์ฌ ์ฐ๊ธฐ ์์ค์ 1๋จ์ด๋ 2๋จ์ ๋์ด์๋ฉด ์ ๋๋ค. ๊ทธ๋์ผ ํจ์๋ฅผ ์ฝ๊ณ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
. ํ ๊ฐ์ง๋ง ํด๋ผ!
ํจ์๋ ํ ๊ฐ์ง๋ฅผ ํด์ผ ํ๋ค. ๊ทธ ํ ๊ฐ์ง๋ฅผ ์ํด์ผ ํ๋ค. ๊ทธ ํ ๊ฐ์ง๋ง์ ํด์ผ ํ๋ค.
.์์์ ์๋๋ก ์ฝ๋ ์ฝ๊ธฐ:๋ด๋ ค๊ฐ๊ธฐ ๊ท์น
์ฝ๋๋ ์์์ ์๋๋ก ์ด์ผ๊ธฐ์ฒ๋ผ ์ฝํ์ผ ์ข๋ค.
ํ ํจ์ ๋ค์์๋ ์ถ์ํ ์์ค์ด ํ ๋จ๊ณ ๋ฎ์ ํจ์๊ฐ ์จ๋ค. ์ฆ, ์์์ ์๋๋ก ํ๋ก๊ทธ๋จ์ ์ฝ์ผ๋ฉด ํจ์ ์ถ์ํ ์์ค์ด ํ ๋ฒ์ ํ ๋จ๊ณ์ฉ ๋ฎ์์ง๋ค.
.์์ ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ๋ผ.
๊ธธ๊ณ ์์ ์ ์ธ ์ด๋ฆ์ผ์๋ก ํจ์๊ฐ ํ๋ ์ผ์ ์ข ๋ ์ ํํํ๋ฏ๋ก ์ข๋ค.
๊ธธ๊ณ ์์ ์ ์ธ ์ด๋ฆ์ด ๊ธธ๊ณ ์์ ์ ์ธ ์ฃผ์๋ณด๋ค ์ข๋ค. ํจ์ ์ด๋ฆ์ ์ ํ ๋๋ ์ฌ๋ฌ ๋จ์ด๊ฐ ์ฝ๊ฒ ์ฝํ๋ ๋ช
๋ช
๋ฒ์ ์ฌ์ฉํ๋ค.
.ํจ์ ์ธ์
ํจ์์์ ์ด์์ ์ธ ์ธ์ ๊ฐ์๋ 0๊ฐ์ด๋ค.
๋ค์์ 1๊ฐ, ๋ค์์ 2๊ฐ์ด๋ค. 3๊ฐ๋ ๊ฐ๋ฅํ ํผํ๊ณ 4๊ฐ ์ด์์ ํน๋ณํ ์ด์ ๊ฐ ํ์ํ๋ค.
.๋ง์ด ์ฐ๋ ๋จํญ ํ์
ํจ์์ ์ธ์ 1๊ฐ๋ฅผ ๋๊ธฐ๋ ํํ ์ด์ ๋ ๋ ๊ฐ์ง์ด๋ค.
1. ์ธ์์ ์ง๋ฌธ์ ๋์ง๋ ๊ฒฝ์ฐ
boolean fileExists("MyFile") // MyFile ์กด์ฌ ์ฌ๋ถ
2. ์ธ์๋ก ๋ญ๊ฐ๋ก ๋ณํํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ
InputStream fileOpen("MyFile") // MyFile ์ InputStream์ผ๋ก ๋ณํ
๊ทธ ์ธ ํํ์ง ์์ ์ฌํญ์ผ๋ก ์ด๋ฒคํธ๊ฐ ์๋ค.
passwordAttemptFailedNtimes(int attempts) // ์
๋ ฅ ์ธ์๋ก ์์คํ
์ ์ํ ๋ณํ
์ด ์ธ์ ๋จํญ ํจ์๋ ๊ฐ๊ธ์ ํผํ๋ค.
// ๋ณํ ํจ์์์ ์ถ๋ ฅ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ํผ๋์ ์ผ๊ธฐํ ์ ์๋ค.
void includeSetupPageInfo(StringBuffer pageText) // X
// ์
๋ ฅ ์ธ์๋ฅผ ๋ฐํํ๋ ํจ์๋ผ๋ฉด ๋ณํ ๊ฒฐ๊ณผ๋ ๋ฐํ ๊ฐ์ผ๋ก ๋๋ ค์ค๋ค.
StringBuffer transform(StringBuffer in) // O
.ํ๋๊ทธ ์ธ์ ์ง์
ํ๋๊ทธ ์ธ์๋ true/false์ ๋ฐ๋ผ ํจ์๊ฐ ํ ์ผ์ด ๋ ๊ฐ์ง ์ด์์ด๋ผ๋ ๊ฒ์ ๊ณตํํ๋ ์ ์ผ๋ก. ์์ ๊ณ์ ์ธ๊ธ๋๋ 'ํ ๊ฐ์ง๋ง ํด๋ผ!'์ ์๋ฐฐ๋๋ค.
// X
void setUp(boolean isSet){
}
.์ธ์ ๊ฐ์ฒด
์ธ์๊ฐ 2~3๊ฐ ํ์ํ๋ค๋ฉด ์ผ๋ถ๋ฅผ ๋ ์์ ์ธ ํด๋์ค ๋ณ์๋ก ์ ์ธํ ๊ฐ๋ฅ์ฑ์ ์ง์ด๋ณธ๋ค.
Circle makeCircle(double x, double y, double radius); // before
Circle makeCircle(Point center, double radius); // after
๊ฐ์ฒด๋ฅผ ์์ฑํด ์ธ์๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ด ๋์์์ผ๋ก ๋ณด์ผ์ง ๋ชจ๋ฅด์ง๋ง ๊ทธ๋ ์ง ์๋ค.
x์ y๋ฅผ ๋ฌถ๋ฏ์ด ๋ณ์๋ฅผ ๋ฌถ์ด ๋๊ธฐ๋ ค๋ฉด ์ด๋ฆ์ ๋ถ์ฌ์ผ ํ๋ฏ๋ก ๊ฒฐ๊ตญ ๊ฐ๋
์ ํํํ๊ฒ ๋๋ค.
.์ธ์ ๋ชฉ๋ก
๋๋ก๋ ์ธ์ ๊ฐ์๊ฐ ๊ฐ๋ณ์ ์ธ ํจ์๋ ํ์ํ๋ค. String.format ๋ฉ์๋๊ฐ ์ข์ ์์ด๋ค.
๊ฐ๋ณ ์ธ์๋ฅผ ์ทจํ๋ ๋ชจ๋ ํจ์์๋ 'ํจ์ ์ธ์' ์๋ฆฌ๊ฐ ์ ์ฉ๋๋ค. ๋จํญ, ์ดํญ ์ผํญ ๋ฑ์ ์ด ์ด์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๋ค.
String.format("%s worked %.2f hours.", name, hours);
public String format(String format, Object... args)
.๋์ฌ์ ํค์๋
ํจ์์ ์๋๋ ์ธ์์ ์์์ ์๋๋ฅผ ์ ๋๋ก ํํํ๋ ค๋ฉด ์ข์ ํจ์ ์ด๋ฆ์ด ํ์๋ค.
๋จํญ ํจ์์ ๊ฒฝ์ฐ ํจ์์ ์ธ์๊ฐ ๋์ฌ/๋ช
์ฌ ์์ ์ด๋ค์ผ ํ๋ค. ์๋ก write(name)์ ์ดํดํ๊ธฐ๊ฐ ์ฝ๋ค.
์ข ๋ ์ข์ ์ด๋ฆ์ writeField(name)์ด๋ค. Field์ ์ด๋ฆ์ ์ด๋ค๋ ์ฌ์ค์ด ๋ช
ํํ ๋๋ฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ค์์ผ๋ก๋ ํจ์ ์ด๋ฆ์ ํค์๋๋ฅผ ์ถ๊ฐํ๋ ํ์์ด๋ค. ์ฆ ํจ์ ์ด๋ฆ์ ์ธ์ ์ด๋ฆ์ ๋ฃ๋๋ค
์๋ก assertEquals๋ณด๋ค assertExpectedEqualsActual(expected, actual)์ด ๋ ์ข๋ค. ์ด๋ด ๊ฒฝ์ฐ ์ธ์์ ์์๋ฅผ ๊ธฐ์ตํ ํ์๊ฐ ์์ด์ง๋ค.
.๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ๋ง๋ผ!.
๋ถ์ ํจ๊ณผ๋ ๊ฑฐ์ง๋ง์ด๋ค. ํจ์์์ ํ ๊ฐ์ง ์ผ์ ํ๊ณ ์ ํด ๋๊ณ ๋ค๋ฅธ ์ผ์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ ๋ง์ด๋ค.
๋ง์ฝ ํ์ํ ๋ถ์ํจ๊ณผ์ผ ๊ฒฝ์ฐ ํจ์ ์ด๋ฆ์ ๋ถ๋ช ํ ๋ช ์ํ๋ ๊ฒ ์ข๋ค. ๋ฌผ๋ก ํจ์๊ฐ 'ํ ๊ฐ์ง๋ง ํด๋ผ!'๋ผ๋ ๊ท์น์ ์๋ฐฐํ๊ฒ ๋์ง๋ง.
.์ถ๋ ฅ ์ธ์
์ผ๋ฐ์ ์ผ๋ก ์ถ๋ ฅ ์ธ์๋ ํผํด์ผ ํ๋ค. ํจ์์์ ์ํ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด ํจ์๊ฐ ์ํ ๊ฐ์ฒด ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ ํํ๋ค.
public void appendFooter(StringBuffer report) // X
report.appendFooter(); // O
.๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ผ.
ํจ์๋ ์ํํ๊ฑฐ๋ ๋ตํ๊ฑฐ๋ ๋ ์ค ํ๋๋ง ํด์ผ ํ๋ค. ๋ ๋ค ํ๋ฉด ์ ๋๋ค.
๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ์๋๋ฉด ๊ฐ์ฒด ์ ๋ณด๋ฅผ ๋ฐํํ๊ฑฐ๋ ๋ ์ค ํ๋์ด๋ค. ๋ ๋ค ํ ๊ฒฝ์ฐ ํผ๋์ ์ด๋ํ๋ค.
public boolean set(String attribute, String value); // X ์ํ ๋ณ๊ฒฝ๊ณผ , exists ์ฌ๋ถ
public boolean attributeExists(String name): // O exists
public void setAttribute(String name, String value); // O ์ํ ๋ณ๊ฒฝ
.์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ!.
๋ช ๋ น ํจ์์์ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ ์์ ๋งํ '๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ผ' ๊ท์น์ ๋ฏธ๋ฌํ๊ฒ ์๋ฐํ๋ค. ์์นซ if๋ฌธ์์ ๋ช ๋ น์ ํํ์์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ฌ์ด ํ์ด๋ค.
// X
if(deletePage(page) == E_OK){
error~~
}
// O
try{
deletePage(page);
...
}catch(Exception e){
error~~
}
.try/catch ๋ธ๋ก ๋ฝ์๋ด๊ธฐ
try/catch ๋ธ๋ก์ ์๋ ์ถํ๋ค. ์ฝ๋ ๊ตฌ์กฐ์ ํผ๋์ ์ผ์ผํค๋ฉฐ, ์ ์ ๋์๊ณผ ์ค๋ฅ ์ฒ๋ฆฌ ๋์์ ๋ค์์ธ๋ค. ๋ฐ๋ผ์ try/catch ๋ธ๋ก์ ๋ณ๋ ํจ์๋ก ๋ฝ์๋ด๋ ํธ์ด ์ข๋ค.
์ค๋ฅ ์ฒ๋ฆฌ๋ ํ ๊ฐ์ง ์์ ์ด๋ค.
// X
public void delte(Page page) {
try{
deletePage(page);
...
}catch(Exception e){
error~~
}
}
// O
public void delete(Page page) {
try{
deletePageAndAllReferences(page);
}catch(Exception e){
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page)
...
}
private void logError(Exception e){
error~~
}
.Error.java ์์กด์ฑ ์์
์ค๋ฅ ์ฝ๋๋ฅผ ๋ฐํํ๋ค๋ ์ด์ผ๊ธฐ๋, ํด๋์ค๋ ์ด๊ฑฐํ ๋ณ์๋ , ์ด๋์ ๊ฐ ์ค๋ฅ ์ฝ๋๋ฅผ ์ ์ํ๋ค๋ ๋ป์ด๋ค.
public enum Error {
OK,
INVALID,
...
}
์์ ๊ฐ์ ํด๋์ค๋ ์์กด์ฑ ์์์ด๋ค. ๋ค๋ฅธ ํด๋์ค์์ Error enum์ improt ํ์ฌ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก, ์ฆ Error enum์ด ๋ณํ๋ฉด Error enum์ ์ฌ์ฉํ๋ ํด๋์ค ์ ๋ถ๋ฅผ ๋ค์ ์ปดํ์ผํ๊ณ ์ฌ๋ฐฐ์นํด์ผ ํ๋ค.
๊ทธ๋์ Error ํด๋์ค ๋ณ๊ฒฝ์ด ์ด๋ ค์์ง๋ค. ๋ฐ๋ผ์ ์ ์ค๋ฅ ์ฝ๋๋ฅผ ์ถ๊ฐ ํ๊ธฐ๋ณด๋ค๋ ๊ธฐ์กด์ ์ค๋ฅ์ฝ๋๋ฅผ ์ฌ ์ฌ์ฉํ๋ค.
์ค๋ฅ ์ฝ๋ ๋์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์์ธ๋ Exception ํด๋์ค์์ ํ์๋๋ค. ๋ฐ๋ผ์ ์ฌ์ปดํ์ผ/์ฌ๋ฐฐ์น ์์ด ์ ์์ธ ํด๋์ค๋ฅผ ์ถ๊ฐํ ์ ์๋ค. -> ์๋ฌ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ Exception์ผ๋ก ์ฌ์ฉ. ๊ตณ์ด ErroCode๋ฅผ ์ ์ธํ์ฌ ์์กด์ฑ์ ๋์ผ ํ์๊ฐ ์๋ค.
.๋ฐ๋ณตํ์ง ๋ง๋ผ.
๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ท ํ์์ด ์๋ฏ์ด. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๋๋ฅผ ๋ถ๋ชจ ํด๋์ค๋ก ๋ชฐ์ ์ค๋ณต์ ์์ค๋ค.
.ํจ์๋ฅผ ์ด๋ป๊ฒ ์ง์ฃ ?
์ฒ์๋ถํฐ ์๋ฒฝํ ๊ท์น์ ๊ฐ์ง ํจ์๋ฅผ ์ง๊ธฐ๋ ์ด๋ ต๋ค. ์ฒ์์๋ ๊ธธ๊ณ ๋ณต์กํ๋ฉฐ ์ค๋ณต๋ ๋ง์๋ฟ๋๋ฌ ์์ ๋งํ ๊ท์น ๋๋ถ๋ถ์ ์๋ฐฐํ๋ค. ํ์ง๋ง ์ด๋ฌํ ์ฝ๋๋ฅผ ๋น ์ง ์์ ํ ์คํธํ๋ ๋จ์ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง๋ ๋ค.
๋ค์์ผ๋ก๋ ์ฝ๋๋ฅผ ๋ค๋ฌ๊ณ , ํจ์๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฆ์ ๋ฐ๊พธ๊ณ , ์ค๋ณต์ ์ ๊ฑฐํ๋ค. ๋ฉ์๋๋ฅผ ์ค์ด๊ณ ์์๋ ๋ฐ๊พธ๋ฉฐ. ๋๋ก๋ ์ ์ฒด ํด๋์ค๋ฅผ ์ชผ๊ฐ๊ธฐ๋ ํ๋ค.
์ด ๋ชจ๋ ์์
์ค์๋ ํญ์ ๋จ์ ํ
์คํธ๋ ํต๊ณผํด์ผ ํ๋ค. ์ต์ข
์ ์ผ๋ก๋ ์์ ๋งํ ๊ท์น์ ๋ฐ๋ฅด๋ ํจ์๊ฐ ์ป์ด์ง๋ค.
.๊ฒฐ๋ก
๋ชจ๋ ์์คํ ์ ํน์ ์์ฉ ๋ถ์ผ ์์คํ ์ ๊ธฐ์ ํ ๋ชฉ์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ์ค๊ณํ ๋๋ฉ์ธ ํนํ ์ธ์ด(Domain Specific Language, DSL)๋ก ๋ง๋ค์ด์ง๋ค. ํจ์๋ ๊ทธ ์ธ์ด์์ ๋์ฌ๋ฉฐ, ํด๋์ค๋ ๋ช ์ฌ์ด๋ค. ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ ์ ์ธ์ ๋ ์ธ์ด ์ค๊ณ์ ๊ธฐ์ ์ด๋ค.
ํ๋ก ํ๋ก๊ทธ๋๋จธ๋ ์์คํ ์ (๊ตฌํํ ) ํ๋ก๊ทธ๋จ์ด ์๋๋ผ. (ํ์ด๋๊ฐ) ์ด์ผ๊ธฐ๋ก ์ฌ๊ธด๋ค. ์์ ๋งํ ๊ท์น๋ค์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ด์ผ๊ธฐ๋ฅผ ํ์ด๊ฐ๋ ๋ฐ ์๋ค๋ ์ฌ์ค์ ๋ช ์ฌํ๊ธธ ๋ฐ๋๋ค.
๐ ๋๋์ .
- ๋ค์ํ ๊ท์น๋ค์ด ์ ์๋์์ง๋ง. ๋ง์ง๋ง ๊ฒฐ๋ก ์์์ ํ๋ก๊ทธ๋๋ฐ ๊ตฌํ์ ์๊ฐํ๊ธฐ๋ณด๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ํ์ด๋๊ฐ๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ผ๋ ๋ง์์ ๋ชจ๋ ๊ท์น๋ค์ด ์ค๋ช ์ด ๋ ๊ฒ ๊ฐ๋ค.
'Study > CleanCode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Study][CleanCode - 2] 5. ํ์ ๋ง์ถ๊ธฐ (0) | 2022.07.13 |
---|---|
[Study][CleanCode - 1] 4. ์ฃผ์ (0) | 2022.07.11 |
[Study][CleanCode - 1] 2. ์๋ฏธ ์๋ ์ด๋ฆ (0) | 2022.06.28 |
[Study][CleanCode - 1] 1. ๊นจ๋ํ ์ฝ๋ (0) | 2022.06.28 |
[Study][CleanCode - 0] ๊ณํ (0) | 2022.06.24 |