Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 7์žฅ
๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์ /ํด๋ฆฐ ์ฝ”๋“œ

ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 7์žฅ

2023. 1. 10. 22:12

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
    '๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์ /ํด๋ฆฐ ์ฝ”๋“œ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 10์žฅ
    • ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 8์žฅ, 9์žฅ
    • ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 4์žฅ, 5์žฅ, 6์žฅ
    • ํด๋ฆฐ ์ฝ”๋“œ(Clean Code) - 1์žฅ, 2์žฅ, 3์žฅ
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”