CleanCode TIL (2022.02.04)

Henry Choยท2022๋…„ 2์›” 4์ผ
0

๋…ธ๊ฐœ๋ถ

๋ชฉ๋ก ๋ณด๊ธฐ
14/31

DAY 15

๐Ÿ”–ย ์˜ค๋Š˜ ์ฝ์€ ๋ฒ”์œ„ : 7. ์˜ค๋ฅ˜์ฒ˜๋ฆฌ (137~142p)


๐Ÿค“ย ์ฑ…์—์„œ ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ

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

  • ๋…ผ๋ฆฌ์™€ ์˜ค๋ฅ˜ ๊ตฌ๋ถ„์€ ์ข‹์ง€๋งŒ ์˜ค๋ฅ˜ ๊ฐ์ง€๊ฐ€ ํ”„๋กœ๊ทธ๋žจ ์–ธ์ €๋ฆฌ๋กœ ๋ฐ€๋ ค๋‚  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ธฐ๋ณธ ๊ฐ’์„ ๋ฆฌํ„ดํ•จ์œผ๋กœ์„œ ๋ถˆํ•„์š”ํ•œ ์ค‘๋‹จ์„ ์ œ๊ฑฐํ•˜๋Š” ์˜ˆ์ œ
    try {
        MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
        m_total += expenses.getTotal();
    } catch (MealExpensesNotFound e) {
        m_total += getMealPerDiem();
    }
    ํŠน์ˆ˜์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ๋” ์ข‹๊ฒ ๋‹ค
    public class PerDiemMealExpenses implements MealExpenses {
        public int getTotal() {
            // ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ผ์ผ ๊ธฐ๋ณธ ์‹๋น„๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. }
        }
    }
    ์œ„์™€ ๊ฐ™์ด ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์ค‘๋‹จํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค
    MealExpenses expenses = expenseReportDAO.getMeals(employee.getID());
    m_total += expenses.getTotal();

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

public void registerItem(Item item) {
    if (item != null) {
        ItemRegistry registry = peristentStore.getItemRegistry();
        if (registry != null) {
            Item existing = registry.getItem(item.getID());
            if (existing.getBillingPeriod().hasRetailOwner()) {
                existing.register(item);
            }
        }
    }
}
  • null ํ™•์ธ์„ ๋ˆ„๋ฝํ•˜๋Š”๊ฒŒ ๋ฌธ์ œ๊ฐ€์•„๋‹ˆ๋ผ ์• ์ดˆ์— null return์„ ์ตœ์†Œํ™” ํ•ด์•ผ ํ•œ๋‹ค
  • ๋Œ€์‹ ์— ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ ํŠน์ˆ˜ ์‚ฌ๋ก€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ์™ธ๋ถ€ API๊ฐ€ null์„ ๋ฐ˜ํ™˜ ํ•œ๋‹ค๋ฉด ๊ฐ์‹ธ๊ธฐ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ํ•ด ์˜ˆ์™ธ, ํŠน์ˆ˜์‚ฌ๋ก€๊ฐ์ฒด ๋ฐ˜ํ™˜
List < Employee > employees = getEmployees();
if (employees != null) {
    for (Employee e: employees) {
        totalPay += e.getPay();
    }
}

์œ„ ๊ฒฝ์šฐ์—์„œ getEmployees๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ

public List < Employee > getEmployees() {
    if (..์ง์›์ด ์—†๋‹ค๋ฉด..)
        return Collections.emptyList();
}

empty List ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์˜€์œผ๋ฏ€๋กœ null ์ฒดํฌ ์—†์ด ์ง„ํ–‰

List < Employee > employees = getEmployees();
for (Employee e: employees) {
    totalPay += e.getPay();
}

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

  • ๋ฉ”์„œ๋“œ๋กœ null ์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์€ ๋” ๋‚˜์˜๋‹ค
  • ๋‘ ์ง€์  ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‹ผํ•˜๋Š” ๋ฉ”์„œ๋“œ ์˜ˆ์ œ
    public class MetricsCalculator {
        public double xProjection(Point p1, Point p2) {
                return (p2.xโ€“ p1.x) * 1.5;
            }
            ...
    }
    ๋ˆ„๊ตฐ๊ฐ€ Null ์„ ์ „๋‹ฌํ•œ๋‹ค๋ฉด
    calculator.xProjection(null, new Point(12, 13));
    โ†’ NullPointerException ๋ฐœ์ƒ ๋ฐฉ๋ฒ•1. ์ƒˆ๋กœ์šด ์˜ˆ์™ธ ์œ ํ˜•์„ ๋งŒ๋“ค์–ด ๋˜์ง
    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;
        }
    }
    ๊ธฐ์กด๋ณด๋‹ค๋Š” ๋‚ซ์ง€๋งŒ InvalidArgumentException ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค ๋ฐฉ๋ฒ•2. assert๋ฌธ์„ ์‚ฌ์šฉ
    public class MetricsCalculator {
        public double xProjection(Point p1, Point p2) {
            assert p1 != null: "p1 should not be null";
            assert p2 != null: "p2 should not be null";
            return (p2.xโ€“ p1.x) * 1.5;
        }
    }
    ๋ณด๊ธฐ์—๋Š” ํŽธํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ null ์ „๋‹ฌ ๋˜์—ˆ์„ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธดํ•จ

๊ฒฐ๋ก 

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

๐Ÿค”ย ๋– ์˜ค๋ฅด๋Š” ์ƒ๊ฐ

  • ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋‚˜ NULL์„ ์“ฐ์ง€์•Š๋Š” ์ฝ”๋“œ ํŒจํ„ด๋“ค์ด ์ด๋ฏธ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋‚ด์žฅ๋œ Rust์˜ ํž˜์ด ์ƒˆ์‚ผ ๋Œ€๋‹จํ•˜๋‹ค๊ณ  ๋Š๊ปด์ง

๐Ÿ”Žย ์งˆ๋ฌธ

๐Ÿ“ย ์†Œ๊ฐ 3์ค„ ์š”์•ฝ

  • ํŠน์ˆ˜์ƒํ™ฉ์„ ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ๋ฆฌํ„ดํ•จ์œผ๋กœ์„œ ๋ถˆํ•„์š”ํ•œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ(์ค‘๋‹จ)๋ฅผ ์ œ๊ฑฐ
  • NULL์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ๋ง๊ณ  ์˜ˆ์™ธ๋‚˜ ํŠน์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ๋ฉ”์„œ๋“œ๋กœ NULL์„ ์ „๋‹ฌํ•˜์ง€ ๋ง๊ณ  ์ƒˆ๋กœ์šด ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ assert๋ฌธ ํ™œ์šฉ
profile
Full stack tech visionary

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