7์ฅ. ์ค๋ฅ ์ฒ๋ฆฌ ๐ฐ
๋ฌด์ธ๊ฐ ์๋ชป๋ ๊ฐ๋ฅ์ฑ์ ๋ ์กด์ฌํ๋ค. ๋ฌด์ธ๊ฐ ์๋ชป๋๋ฉด ๋ฐ๋ก ์ก์ ์ฑ ์์ ๋ฐ๋ก ์ฐ๋ฆฌ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์๋ค.
- ํธ์ถ์๋ฅผ ๊ณ ๋ คํด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ๋ผ.
// ์ค๋ณต์ด ์ฌํ์ฌ ๋์ ์ฝ๋
ACMEPort port = new ACMEPort(12);
try {
port.open();
} catch (DeviceResponseException e) {
reportPortError(e);
logger.log("Device response exception", e);
} catch (ATM1212UnlockedException e) {
reportPortError(e);
logger.log("Unlock exception", e);
} catch (GMXError e) {
reportPortError(e);
logger.log("Device response exception");
} finally {
...
}
// ๊ฐ์ธ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ ์ข์ ์ฝ๋
LocalPort port = new LocalPort(12);
try {
port.open();
} catch (PortDeviceFailure e) {
reportError(e);
logger.log(e.getMessage(), e);
} finally {
...
}
----------------------------------
public class LocalPort {
private ACMEPort innerPort;
public LocalPort(int portNumber) {
innerPort = new ACMEPort(portNumber);
}
public void open() {
try {
innerPort.open();
} catch (DeviceResponseException e) {
throw new PortDeviceFailure(e);
} catch (ATM1212UnlockedException e) {
throw new PortDeviceFailure(e);
} catch (GMXError e) {
throw new PortDeviceFailure(e);
}
}
...
}
LocalPort ํด๋์ค์ฒ๋ผ ACMEPort๋ฅผ ๊ฐ์ธ๋ ํด๋์ค๋ ๋งค์ฐ ์ ์ฉํ๋ค. ์ค์ ๋ก ์ธ๋ถ API๋ฅผ ์ฌ์ฉํ ๋๋ ๊ฐ์ธ๊ธฐ ๊ธฐ๋ฒ์ด ์ต์ ์ด๋ค. ์ธ๋ถ API๋ฅผ ๊ฐ์ธ๋ฉด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ก๊ทธ๋จ ์ฌ์ด์์ ์์กด์ฑ์ด ํฌ๊ฒ ์ค์ด๋ ๋ค. ๋์ค์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฐ์ํ๋ ๋น์ฉ์ด ์ ๋ค. ๋ํ ๊ฐ์ธ๊ธฐ ํด๋์ค์์ ์ธ๋ถ API๋ฅผ ํธ์ถํ๋ ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ก๊ทธ๋จ์ ํ ์คํธํ๊ธฐ๋ ์ฌ์์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ธ๊ธฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ํน์ ์ ์ฒด๊ฐ API๋ฅผ ์ค๊ณํ ๋ฐฉ์์ ๋ฐ๋ชฉ ์กํ์ง ์๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ API๋ฅผ ์ ์ํ๋ฉด ๊ทธ๋ง์ด๋ค.
ํํ ์์ธ ํด๋์ค๊ฐ ํ๋๋ง ์์ด๋ ์ถฉ๋ถํ ์ฝ๋๊ฐ ๋ง๋ค. ์์ธ ํด๋์ค์ ํฌํจ๋ ์ ๋ณด๋ก ์ค๋ฅ๋ฅผ ๊ตฌ๋ถํด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ๊ฐ ๊ทธ๋ ๋ค. ํ ์์ธ๋ ์ก์๋ด๊ณ ๋ค๋ฅธ ์์ธ๋ ๋ฌด์ํด๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ๋ผ๋ฉด ์ฌ๋ฌ ์์ธ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
- ์ ์ ํ๋ฆ์ ์ ์ํ๋ผ
์์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ ์ธ๋ถ API๋ฅผ ๊ฐ์ธ ๋ ์์ ์ธ ์์ธ๋ฅผ ๋์ง๊ณ , ์ฝ๋ ์์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ์ ์ํด ์ค๋จ๋ ๊ณ์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค. ๋๊ฐ๋ ๋ฉ์ง ์ฒ๋ฆฌ ๋ฐฉ์์ด์ง๋ง, ๋๋ก๋ ์ค๋จ์ด ์ ํฉํ์ง ์์ ๋๋ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ํน์ ์ฌ๋ก ํจํด(special case pattern)์ ์ฌ์ฉํ์. ์ด๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ๊ฐ์ฒด๋ฅผ ์กฐ์ํด ํน์ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ๊ทธ๋ฌ๋ฉด ํด๋์ค๋ ๊ฐ์ฒด๊ฐ ์์ธ์ ์ธ ์ํฉ์ ์บก์ํํด์ ์ฒ๋ฆฌํ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์์ธ์ ์ธ ์ํฉ์ ์ฒ๋ฆฌํ ํ์๊ฐ ์์ด์ง๋ค.
์๋ฅผ ์ดํด๋ณด์. ์ง์์ด ์๋น๋ฅผ ๋น์ฉ์ผ๋ก ์ฒญ๊ตฌํ๋ค๋ฉด ์ง์์ด ์ฒญ๊ตฌํ ์๋น๋ฅผ ์ด๊ณ์ ๋ํ๋ค๊ณ ํ์. ๋ง์ฝ ์๋น๋ฅผ ๋น์ฉ์ผ๋ก ์ฒญ๊ตฌํ์ง ์์๋ค๋ฉด ์ผ์ผ ๊ธฐ๋ณธ ์๋น๋ฅผ ์ด๊ณ์ ๋ํ๋ค.
try {
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expense.getTotal();
} catch(MealExpenseNotFound e) {
m_total += getMealPerDiem();
}
์์ ์ฝ๋๋ ์์ธ๊ฐ ๋ ผ๋ฆฌ๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. ํน์ ์ํฉ์ ์ฒ๋ฆฌํ์ง ์๋๋ค๋ฉด ์๋์ ๊ฐ์ด ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expenses.getTotal();
----------------------------------------
public class PerDiemMealExpenses implements MealExpenses {
public int getTotal() {
// ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ผ์ผ ๊ธฐ๋ณธ ์๋น๋ฅผ ๋ฐํํ๋ค.
}
}
- null์ ์ ๋ฌํ์ง ๋ง๋ผ
๋ฉ์๋์์ null์ ๋ฐํํ๋ ๋ฐฉ์๋ ๋์์ง๋ง ๋ฉ์๋๋ก null์ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ ๋์๋ค. ์ ์์ ์ธ ์ธ์๋ก null์ ๊ธฐ๋ํ๋ API๊ฐ ์๋๋ผ๋ฉด ๋ฉ์๋๋ก null์ ์ ๋ฌํ๋ ์ฝ๋๋ ์ต๋ํ ํผํ๋ค.
public class MetricsCalculator {
public double xProjection(Point p1, Point p2) {
return (p2.x - p1.x) * 1.5;
}
...
}
ํด๋น ์ฝ๋์์ calculator.xProjection(null, new Point(12, 13)); ์ ์คํํ๋ฉด ๋น์ฐํ NullPointerException์ด ๋ฐ์ํ๋ค.
public class MetricsCalculator {
public double xProjection(Point p1, Point p2) {
if (p1 == null || p2 == null) {
throw InvalidArgumentException(
"Invalid argument for MetricsCalculator.xProjection");
}
return (p2.x - p1.x) * 1.5;
}
}
NullPointerException ๋ณด๋ค๋ ์กฐ๊ธ ๋์์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ ์ฝ๋๋ InvalidArgumentException์ ์ก์๋ด๋ ์ฒ๋ฆฌ๊ธฐ๊ฐ ํ์ํ๋ค.
public class MetircsCalculator {
public double xProjection(Point p1, Point p2) {
assert p1 != null : "p1 should not be null";
assert p1 != null : "p2 should not be null";
return (p2.x - p1.x) * 1.5;
}
}
์์ ์ฝ๋๋ ๋ฌธ์ํ๊ฐ ์ ๋์ด ์ฝ๋ ์ผ๊ธฐ๋ ํธํ์ง๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํ๋ค. ์ฆ, ๋๊ตฐ๊ฐ null์ ์ ๋ฌํ๋ฉด ์ฌ์ ํ ์คํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๋๋ค์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ํธ์ถ์๊ฐ ์ค์๋ก ๋๊ธฐ๋ null์ ์ ์ ํ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ์ ์ด์ null์ ๋๊ธฐ์ง ๋ชปํ๋๋ก ๊ธ์งํ๋ ์ ์ฑ ์ด ํฉ๋ฆฌ์ ์ด๋ค.
7์ฅ ๊ฒฐ๋ก
๊นจ๋ํ ์ฝ๋๋ ์ฝ๊ธฐ๋ ์ข์์ผ ํ์ง๋ง ์์ ์ฑ๋ ๋์์ผ ํ๋ค. ์ด ๋์ ์์ถฉํ๋ ๋ชฉํ๊ฐ ์๋๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌํด ๋ ์์ ์ธ ์ฌ์์ผ๋ก ๊ณ ๋ คํ๋ฉด ํผํผํ๊ณ ๊นจ๋ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ํ๋ก๊ทธ๋จ ๋ ผ๋ฆฌ์ ๋ถ๋ฆฌํ๋ฉด ๋ ๋ฆฝ์ ์ธ ์ถ๋ก ์ด ๊ฐ๋ฅํด์ง๋ฉฐ ์ฝ๋ ์ ์ง๋ณด์์ฑ๋ ํฌ๊ฒ ๋์์ง๋ค.
'๐ ๊ฐ๋ฐ ์์ > ํด๋ฆฐ ์ฝ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํด๋ฆฐ ์ฝ๋(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) - 4์ฅ, 5์ฅ, 6์ฅ (0) | 2023.01.09 |
ํด๋ฆฐ ์ฝ๋(Clean Code) - 1์ฅ, 2์ฅ, 3์ฅ (0) | 2023.01.08 |