๐Ÿคง7์žฅ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ

๊น€์ข…์™„ยท2023๋…„ 5์›” 1์ผ
0

CleanCode

๋ชฉ๋ก ๋ณด๊ธฐ
4/6

์˜ค๋ฅ˜ ์ฝ”๋“œ๋ณด๋‹ค ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•ด๋ผ

์˜ค๋ฅ˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋…ผ๋ฆฌ๊ฐ€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ์ฝ”๋“œ์™€ ์„ž์ด๊ฒŒ ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค. ์ฐจ๋ผ๋ฆฌ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ฎ๋‹ค.

Try-Catch-Finally ๋ฌธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜๋ผ

try ๋ธ”๋ก์—์„œ ๋ฌด์Šจ ์ผ์ด ์ƒ๊ธฐ๋“ ์ง€ catch ๋ธ”๋ก์€ ํ”„๋กœ๊ทธ๋žจ ์ƒํƒœ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ๋Š” try-catch-finally ๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํŽธ์ด ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋ฉด try ๋ธ”๋ก์—์„œ ๋ฌด์Šจ ์ผ์ด ์ƒ๊ธฐ๋“ ์ง€ ํ˜ธ์ถœ์ž๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

๋จผ์ € ๊ฐ•์ œ๋กœ ์˜ˆ์™ธ๋ฅผ ์ผ์œผํ‚ค๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ข‹๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ try ๋ธ”๋ก์˜ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๋ฒ”์œ„ ๋‚ด์—์„œ ํŠธ๋žœ์žญ์…˜ ๋ณธ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์‰ฌ์›Œ์ง„๋‹ค.

๋ฏธํ™•์ธ ์˜ˆ์™ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

ํ™•์ธ๋œ ์˜ˆ์™ธ๋Š” Open Closed Principle(OCP)๋ฅผ ์œ„๋ฐ˜ํ•œ๋‹ค. ๋ฉ”์„œ๋“œ์—์„œ ํ™•์ธ๋œ ์˜ˆ์™ธ๋ฅผ ๋˜์กŒ๋Š”๋ฐ catch ๋ธ”๋ก์ด ์„ธ ๋‹จ๊ณ„ ์œ„์— ์žˆ๋‹ค๋ฉด ๊ทธ ์‚ฌ์ด ๋ฉ”์„œ๋“œ ๋ชจ๋‘๊ฐ€ ์„ ์–ธ๋ถ€์— ํ•ด๋‹น ์˜ˆ์™ธ๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค. ์ฆ‰ ํ•˜์œ„ ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ƒ์œ„ ๋‹จ๊ณ„ ๋ฉ”์„œ๋“œ ์„ ์–ธ๋ถ€๋ฅผ ์ „๋ถ€ ๊ณ ์ฒ˜์•ผ๋œ๋‹ค. ํ™•์ธ๋œ ์˜ˆ์™ธ๋Š” ์บก์Šํ™”๋ฅผ ๊นจ๋ฒ„๋ฆฐ๋‹ค.

์˜ˆ์™ธ์— ์˜๋ฏธ๋ฅผ ์ œ๊ณตํ•˜๋ผ

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ์ •๋ณด๋ฅผ ๋‹ด์•„ ์˜ˆ์™ธ์™€ ํ•จ๊ป˜ ๋˜์ง„๋‹ค. ์‹คํŒจํ•œ ์—ฐ์‚ฐ ์ด๋ฆ„๊ณผ ์‹คํŒจ ์œ ํ˜•๋„ ์–ธ๊ธ‰ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋กœ๊น… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด catch ๋ธ”๋ก์—์„œ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•˜๋„๋ก ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.

ํ˜ธ์ถœ์ž๋ฅผ ๊ณ ๋ คํ•ด ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ผ

๋‹จ์ˆœํžˆ ์˜ˆ์™ธ๋ฅผ ์žก์•„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ์‹ธ๊ธฐ ํด๋ž˜์Šค

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);
		}
	}
}

์œ„ ํด๋ž˜์Šค๋Š” innerPort ํด๋ž˜์Šค์˜ open ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์‹ธ๊ธฐ ํด๋ž˜์Šค์ด๋‹ค. ๊ฐ์‹ธ๊ธฐ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ณ  ์™ธ๋ถ€ api๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ •์ƒ ํ๋ฆ„์„ ์ •์˜ํ•˜๋ผ

์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.

try {
	MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
	m_total += expenses.getTotal();
} catch(MealExpensesNotFound e) {
	m_total += getMealPerDiem();
}

์œ„ ์ฝ”๋“œ๋Š” ์‹๋น„๋ฅผ ๋น„์šฉ์œผ๋กœ ์ฒญ๊ตฌํ–ˆ๋‹ค๋ฉด ์ง์›์ด ์ฒญ๊ตฌํ•œ ์‹๋น„๋ฅผ ์ด๊ณ„์— ๋”ํ•˜๊ณ  ์ฒญ๊ตฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ผ์ผ ๊ธฐ๋ณธ ์‹๋น„๋ฅผ ์ด๊ณ„์— ๋”ํ•œ๋‹ค. ์œ„ ์ฝ”๋“œ๋Š” ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ์ฝ”๋“œ์˜ ์ดํ•ด๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค. ์ด๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.


MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
m_total += expenses.getTotal();

expenses.getTotal() ๋ฉ”์†Œ๋“œ๋ฅผ ํ•ญ์ƒ ์ง์›์ด ์ฒญ๊ตฌํ•œ ์‹๋น„๋ฅผ ์ด๊ณ„์— ๋”ํ•˜๊ฒŒ ํ•˜๊ณ  ๋งŒ์•ฝ ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ ์‹๋น„๋ฅผ ์ด๊ณ„์— ๋”ํ•˜๋„๋ก ๋ฐ”๊ฟˆ์œผ๋กœ ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋ฅผ ํŠน์ˆ˜ ์‚ฌ๋ก€ ํŒจํ„ด์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•ด ํŠน์ˆ˜ ์‚ฌ๋ก€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํด๋ผ์ด์–ธํŠธ์— ์ฝ”๋“œ๊ฐ€ ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง„๋‹ค.

null์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋งˆ๋ผ

null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ผ๊ฑฐ๋ฆฌ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ํ˜ธ์ถœ์ž์—๊ฒŒ ๋ฌธ์ œ๋ฅผ ๋„˜๊ธด๋‹ค. ์–ด๋””์„œ null ํ™•์ธ์„ ๋นผ๋จน๋Š”๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ†ต์ œ ๋ถˆ๋Šฅ์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.
null์„ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ ์–ด๋””์„ ๊ฐ€ nullPointerException์ด ๋ฐœ์ƒํ•  ํ™•์œจ๋„ ๋†’์•„์ง„๋‹ค.
์™ธ๋ถ€ API๊ฐ€ null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ๊ฐ์‹ธ๊ธฐ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ null ์—๋Œ€ํ•œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ ํŠน์ˆ˜ ์‚ฌ๋ก€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

null์„ ์ „๋‹ฌํ•˜์ง€ ๋งˆ๋ผ

null์„ ์ „๋‹ฌํ•˜๋ฉด ์–ด๋””์„ ๊ฐ€ nullPointerException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๊ณ  ํ–‰๋‹น ์˜ค๋ฅ˜๊ฐ€ ์–ด๋””์„œ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ธฐ ๋ฒˆ๊ฑฐ๋กœ์›Œ์ง„๋‹ค. ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” null์„ ์ „๋‹ฌํ•˜์ง€ ๋ง๊ณ  ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๊ฒŒ ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๋‹ค.

๋Œ€๋‹ค์ˆ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ํ˜ธ์ถœ๊ฐ€๊ฐ€ ์‹ค์ˆ˜๋กœ ๋„˜๊ธฐ๋Š” null์„ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์• ์ดˆ์— null์„ ๋„˜๊ธฐ์ง€ ๋ชปํ•˜๋„๋ก ๊ธˆ์ง€ํ•˜๋Š” ์ •์ฑ…์ด ํ•ฉ๋ฆฌ์ ์ด๋‹ค. ์ฆ‰, ์ธ์ˆ˜๋กœ null์ด ๋„˜์–ด์˜ค๋ฉด ์ฝ”๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค. ์ด๋Ÿฐ ์ •์ฑ…์„ ๋”ฐ๋ฅด๋ฉด ๊ทธ๋งŒํผ ๋ถ€์ฃผ์˜ํ•œ ์‹ค์ˆ˜๋ฅผ ์ €์ง€๋ฅผ ํ™•๋ฅ ๋„ ์ž‘์•„์ง„๋‹ค.

๊ฒฐ๋ก 

์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ”„๋กœ๊ทธ๋žจ ๋…ผ๋ฆฌ์™€ ๋ถ„๋ฆฌํ•˜๋ฉด ๋…๋ฆฝ์ ์ธ ์ถ”๋ก ์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ๋„ ํฌ๊ฒŒ ๋†’์•„์ง„๋‹ค.

profile
๊ฐœ๋ฐœ์— ์žฌ๋ฏธ๋ฅผ ๋Š๋ผ๋ฉฐ ๊พธ์ค€ํžˆ ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๊น€์ข…์™„ ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€