์ ์ ์ธ์ธํจ์ ๊น๋ค์ด ์๋ค.
์ฑ ์ ๊ฐ๊ฐ์ ํฐ ์ฃผ์ ์ ๋ํด์ 17๊ฐ์ ์ฅ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ํด๋น ๊ธ์์๋ ์ฑ ์ ๋ชจ๋ ๋ด์ฉ์ ๋ค๋ฃจ์ง๋ ์๋๋ค. ํ์ฌ ๋์๊ฒ ํ์ํ ๋ด์ฉ์ด๊ฑฐ๋ ๋ค์ ํ๋ฒ ์๊ธฐํด์ผ ํ๋ ์ ๋ค๋ง ๋ค๋ฃฐ ๊ฒ์ด๋ฏ๋ก ์ด ์ ์ ๋ํด์๋ ์ํด๋ฅผ ๊ตฌํ๋ค.
1์ฅ. ๊นจ๋ํ ์ฝ๋ ๐
์๋ ์ปค๋ํ(Ward Cunningham)์ '๊นจ๋ํ ์ฝ๋๋ ์ฝ์ผ๋ฉด์ ๋๋ ์ผ์ด ์์ด์ผ ํ๋ค'๋ผ๊ณ ๋งํ๋ค. ์ฝ์ผ๋ฉด์ ์ง์ํ ๋๋ก ๋์๊ฐ๋ ์ฝ๋๊ฐ ๊นจ๋ํ ์ฝ๋๋ค. ๊ฐ ๋ชจ๋์ ๋ค์ ๋ฌด๋๋ฅผ ์ค๋นํ๊ณ , ๋ชจ๋์ ์ฝ์ผ๋ฉด์ ๋ค์์ ๋ฒ์ด์ง ์ํฉ์ด ๋ณด์ฌ์ผ ํ๋ค.
2์ฅ. ์๋ฏธ ์๋ ์ด๋ฆ ๐ผ
- ์ข์ ์ด๋ฆ์ ์ง์ผ๋ ค๋ฉด ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง๋ง ์ข์ ์ด๋ฆ์ผ๋ก ์ ์ฝํ๋ ์๊ฐ์ด ํจ์ฌ ๋ ๋ง๋ค.
- ์์ฑ์๋ฅผ ์ค๋ณต์ ์ํ ๋๋ ์ ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- ์ถ์์ ์ธ ๊ฐ๋
ํ๋์ ๋จ์ด ํ๋๋ฅผ ์ ํํด ์ด๋ฅผ ๊ณ ์ํ๋ค.
์๋ฅผ ๋ค์ด, ๋๊ฐ์ ๋ฉ์๋๋ฅผ ํด๋์ค๋ง๋ค fetch, retrieve, get์ผ๋ก ์ ๊ฐ๊ฐ ๋ถ๋ฅด์ง ์๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๋์ผ ์ฝ๋ ๊ธฐ๋ฐ์ controller, manager, driver๋ฅผ ์์ด ์ฐ๋ฉด ํผ๋์ค๋ฝ๋ค. - ํ ๋จ์ด๋ฅผ ๋ ๊ฐ์ง ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ง๋ผ.
์๋ฅผ ๋ค์ด, ์ง๊ธ๊น์ง ๊ตฌํํ add ๋ฉ์๋๋ ๋ชจ๋๊ฐ ๊ธฐ์กด ๊ฐ ๋ ๊ฐ๋ฅผ ๋ํ๊ฑฐ๋ ์ด์ด์ ์๋ก์ด ๊ฐ์ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํ์. ์๋ก ์์ฑํ ๋ฉ์๋๋ ์งํฉ์ ๊ฐ ํ๋๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ add๊ฐ ์๋ insert๋ append๋ผ๋ ์ด๋ฆ์ด ์ ๋นํ๋ค. - ์๋ฏธ ์๋ ๋งฅ๋ฝ์ ์ถ๊ฐํ๋ผ
firstName, lastName, street, houseNumber, city, state, zipcode๋ผ๋ ๋ณ์๊ฐ ์์ ๋, ๋ณ์๋ค์ ์ฃผ์๋ผ๋ ์ฌ์ค์ ๊ธ๋ฐฉ ์ ์ ์๋ค. ํ์ง๋ง ์ด๋ ๋ฉ์๋๊ฐ state๋ผ๋ ๋ณ์ ํ๋๋ง ์ฌ์ฉํ๋ค๋ฉด ๋ณ์ state๊ฐ ์ฃผ์ ์ผ๋ถ๋ผ๋ ์ฌ์ค์ ๊ธ๋ฐฉ ์์์ฑ๊ธฐ ํ๋ค๋ค.
addr๋ผ๋ ์ ๋์ด๋ฅผ ์ถ๊ฐํด addrFirstName, addrLastName, addrSate๋ผ ์ฐ๋ฉด ๋งฅ๋ฝ์ด ์กฐ๊ธ ๋ ๋ถ๋ช ํด์ง๋ค.
3์ฅ. ํจ์ ๐ฑ
- ํจ์๋ฅผ ๋ง๋๋ ์ฒซ ๋ฒ์งธ ๊ท์น์ '์๊ฒ!'๋ค. ํจ์๋ฅผ ๋ง๋๋ ๋ ๋ฒ์งธ ๊ท์น์ '๋ ์๊ฒ!'๋ค.
- ํจ์์์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ 1๋จ์ด๋ 2๋จ์ ๋์ด์๋ ์ ๋๋ค.
์ค์ฒฉ ๊ตฌ์กฐ๊ฐ ์๊ธธ ๋งํผ ํจ์๊ฐ ์ปค์ ธ์๋ ์ ๋๋ค. 'if ๋ฌธ / else ๋ฌธ / while ๋ฌธ' ๋ฑ์ ๋ค์ด๊ฐ๋ ๋ธ๋ก์ ํ ์ค์ด์ด์ผ ํ๋ค. - ํจ์๋ ํ ๊ฐ์ง๋ฅผ ํด์ผ ํ๋ค. ๊ทธ ํ ๊ฐ์ง๋ฅผ ์ํด์ผ ํ๋ค. ๊ทธ ํ ๊ฐ์ง๋ง์ ํด์ผ ํ๋ค.
์ง์ ๋ ํจ์ ์ด๋ฆ ์๋์์ ์ถ์ํ ์์ค์ด ํ๋์ธ ๋จ๊ณ๋ง ์ํํ๋ค๋ฉด ๊ทธ ํจ์๋ ํ ๊ฐ์ง ์์ ๋ง ํ๋ค. ํจ์๊ฐ ํ์คํ 'ํ ๊ฐ์ง' ์์ ๋ง ํ๋ ค๋ฉด ํจ์ ๋ด ๋ชจ๋ ๋ฌธ์ฅ์ ์ถ์ํ ์์ค์ด ๋์ผํด์ผ ํ๋ค. (์ถ์ํ ์์ค์ด๋ ํด๋น ์ฝ๋๋ฅผ ์ฝ์ผ๋ฉด์ ํ์ ํ ์ ์๋ ์ ๋ณด์ ์์ค์ ๋งํ๋ค. ํด๋น ์ฝ๋๋ก ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ ์ ์์ผ๋ฉด ์ถ์ํ ์์ค์ด ๋ ๋ฎ์์ง๋ค๊ณ ํ ์ ์๋ค.) - ํ ํจ์ ๋ด์ ์ถ์ํ ์์ค์ ์์ผ๋ฉด ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ด ํท๊ฐ๋ฆฐ๋ค.
ํน์ ํํ์ด ๊ทผ๋ณธ ๊ฐ๋ ์ธ์ง ์๋๋ฉด ์ธ๋ถ์ฌํญ์ธ์ง ๊ตฌ๋ถํ๊ธฐ ์ด๋ ค์ด ํ์ด๋ค. ํ์ง๋ง ๋ฌธ์ ๋ ์ด ์ ๋๋ก ๊ทธ์น์ง ์๋๋ค. ๊ทผ๋ณธ ๊ฐ๋ ๊ณผ ์ธ๋ถ์ฌํญ์ ๋ค์๊ธฐ ์์ํ๋ฉด, ๊นจ์ด์ง ์ฐฝ๋ฌธ์ฒ๋ผ ์ฌ๋๋ค์ด ํจ์์ ์ธ๋ถ์ฌํญ์ ์ ์ ๋ ์ถ๊ฐํ๋ค.
์ด๋ฅผ ์ํด ๋ด๋ ค๊ฐ๊ธฐ ๊ท์น์ด๋ ๊ฒ์ด ์๋ค. ํ ํจ์ ๋ค์์๋ ์ถ์ํ ์์ค์ด ํ ๋จ๊ณ ๋ฎ์ ํจ์๊ฐ ์ค๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ, ์์์ ์๋๋ก ํ๋ก๊ทธ๋จ์ ์ฝ์ผ๋ฉด ํจ์ ์ถ์ํ ์์ค์ด ํ ๋ฒ์ ํ ๋จ๊ณ์ฉ ๋ฎ์์ง๋ค. - ๋คํ์ฑ(polymorphism)์ ์ด์ฉํ์ฌ switch ๋ฌธ์ ์์ฑํ์
// ๋์ ์ฝ๋
public Money calculatePay(Employee e) throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlyPae(e);
case SALARIED:
return calculateSalariedPay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
// ์ข์ ์ฝ๋
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calculatePay();
public abstract void deliverPay(Money pay);
}
------------------------------------------------
public interface EmplyeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
------------------------------------------------
public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISSIONED:
return new CommissionedEmployee(r);
case HOURLY:
return new HourlyEmployee(r);
case SALARIED:
return new SalariedEmployee(r);
default:
throw new InvalidEmployeeType(r.type);
}
}
}
- ํจ์์์ ์ด์์ ์ธ ์ธ์ ๊ฐ์๋ 0๊ฐ(๋ฌดํญ)๋ค.
๋ค์์ 1๊ฐ(๋จํญ)๊ณ , ๋ค์์ 2๊ฐ(์ดํญ)๋ค. 3๊ฐ(์ผํญ)๋ ๊ฐ๋ฅํ ํผํ๋ ํธ์ด ์ข๋ค. 4๊ฐ ์ด์(๋คํญ)์ ํน๋ณํ ์ด์ ๊ฐ ํ์ํ๋ค. ํน๋ณํ ์ด์ ๊ฐ ์์ด๋ ์ฌ์ฉํ๋ฉด ์ ๋๋ค. - ๋จํญ ํจ์๋ '์ธ์์ ์ง๋ฌธ์ ๋์ง๋ ๊ฒฝ์ฐ'์ '์ธ์๋ฅผ ๋ฌด์ธ๊ฐ๋ก ๋ณํํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
์ธ์์ ์ง๋ฌธ์ ๋์ง๋ ๊ฒฝ์ฐ - boolean fileExists("MyFile")
์ธ์๋ฅผ ๋ฌด์ธ๊ฐ๋ก ๋ณํํด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ - InputStream fileOpen("MyFiile") // String ํ์ ํ์ผ ์ด๋ฆ์ InpustStream์ผ๋ก ๋ณํํ๋ ๊ฒ - ํ๋๊ทธ ์ธ์๋ฅผ ์ฐ์ง ๋ง์
ํจ์๋ก ๋ถ์ธ ๊ฐ์ ๋๊ธฐ๋ ๊ด๋ก๋ ์ ๋ง๋ก ๋์ฐํ๋ค. ์ด๊ฒ์ ํจ์๊ฐ ํ๊บผ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ์ฒ๋ฆฌํ๋ค๊ณ ๋๋๊ณ ๊ณตํํ๋ ๊ฒ์ด๋ค. (ํ๋๊ทธ๊ฐ ์ฐธ์ด๋ฉด A๋ฅผ ํ๊ณ ๊ฑฐ์ง์ด๋ฉด B๋ฅผ ํ๋ค๋ ๊ฒ) - ํจ์๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ํํ๊ฑฐ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ตํ๊ฑฐ๋ ๋ ์ค ํ๋๋ง ํด์ผ ํ๋ค.
- ์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ
// ์ค๋ฅ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
if (deletePage(page) == E_OK) {
if (registry.deleteReference(page.name) == E_OK) {
if (configKeys.deleteKey(page.name.makeKey()) == E_OK) {
logger.log("page delted");
} else {
logger.log("configKey not deleted");
}
} else {
logger.log("deletedReference from registry failed");
}
} else {
logger.log("delete failed");
return E_ERROR;
}
// ์์ธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
catch (Exception e) {
logger.log(e.getMessage());
}
try/catch ๋ธ๋ก์ ์๋ ์ง์ ๋ถํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก try/catch ๋ธ๋ก์ ์๋์ ๊ฐ์ด ๋ณ๋ ํจ์๋ก ๋ฝ์๋ด๋ ํธ์ด ์ข๋ค.
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exceptioni e) {
logger.log(e.getMessage());
}
'๐ ๊ฐ๋ฐ ์์ > ํด๋ฆฐ ์ฝ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํด๋ฆฐ ์ฝ๋(Clean Code) - 11์ฅ, 12์ฅ (0) | 2023.01.11 |
---|---|
ํด๋ฆฐ ์ฝ๋(Clean Code) - 10์ฅ (0) | 2023.01.11 |
ํด๋ฆฐ ์ฝ๋(Clean Code) - 8์ฅ, 9์ฅ (0) | 2023.01.10 |
ํด๋ฆฐ ์ฝ๋(Clean Code) - 7์ฅ (0) | 2023.01.10 |
ํด๋ฆฐ ์ฝ๋(Clean Code) - 4์ฅ, 5์ฅ, 6์ฅ (0) | 2023.01.09 |