π Goodbye, Clean Code (opens in a new tab)
ποΈ λ²μ λ μ§: 2024.07.08
π§ λ²μν ν¬λ£¨: μν(μ΅μμ°)
μκ°, Clean Code
λ¦μ μ λ μ΄μμ΅λλ€.
λλ£κ° μΌμ£ΌμΌ λ΄λ΄ μμ±νλ μ½λλ₯Ό λ§ νμΈνμ΅λλ€. μ°λ¦¬λ κ·Έλν½ νΈμ§κΈ° μΊλ²μ€λ₯Ό μμ νκ³ μμκ³ , λλ£λ μ¬κ°νκ³Ό νμ κ°μ λνμ ν¬κΈ°λ₯Ό κ°μ₯μ리μ μμ νΈλ€μ λλκ·Ένμ¬ μ‘°μ ν μ μλ κΈ°λ₯μ ꡬννμ΅λλ€.
μ½λλ μλνμ΅λλ€.
νμ§λ§ λ°λ³΅μ μ΄μμ΅λλ€. κ° λν(μ: μ¬κ°ν λλ νμ)μλ λ€λ₯Έ νΈλ€ μΈνΈκ° μμκ³ , κ° νΈλ€μ λ€λ₯Έ λ°©ν₯μΌλ‘ λλκ·Ένλ©΄ λνμ μμΉμ ν¬κΈ°κ° λ€λ₯΄κ² μν₯μ λ°μμ΅λλ€. μ¬μ©μκ° Shift ν€λ₯Ό λλ₯΄κ³ μμΌλ©΄ λΉμ¨μ μ μ§νλ©΄μ ν¬κΈ°λ₯Ό μ‘°μ ν΄μΌ νμ΅λλ€. λ§μ μνμ΄ μμμ΅λλ€.
μ½λλ λ€μκ³Ό κ°μ΄ μκ²Όμ΅λλ€:
let Rectangle = {
resizeTopLeft(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeTopRight(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeBottomLeft(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeBottomRight(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
};
let Oval = {
resizeLeft(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeRight(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeTop(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeBottom(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
};
let Header = {
resizeLeft(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeRight(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
};
let TextBlock = {
resizeTopLeft(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeTopRight(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeBottomLeft(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
resizeBottomRight(position, size, preserveAspect, dx, dy) {
// 10 repetitive lines of math
},
};
λ°λ³΅λλ μνμ΄ μ λ§ μ κ²½ μ°μμ΅λλ€.
κΉ¨λνμ§ μμμ΅λλ€.
λλΆλΆμ λ°λ³΅μ μ μ¬ν λ°©ν₯ μ¬μ΄μμ λ°μνμ΅λλ€. μλ₯Ό λ€μ΄, Oval.resizeLeft()
λ Header.resizeLeft()
μ μ μ¬ν μ μ΄ μμμ΅λλ€. μ΄λ λ λ€ μΌμͺ½ κ°μ₯μ리μ νΈλ€μ λλκ·Ένλ κ²μ λ€λ£¨κΈ° λλ¬Έμ
λλ€.
λ λ€λ₯Έ μ μ¬μ μ κ°μ λνμ λν λ©μλ μ¬μ΄μ μμμ΅λλ€. μλ₯Ό λ€μ΄, Oval.resizeLeft()
λ λ€λ₯Έ Oval
λ©μλμ μ μ¬ν μ μ΄ μμμ΅λλ€. μ΄λ λͺ¨λ νμμ λ€λ£¨κΈ° λλ¬Έμ
λλ€. ν
μ€νΈ λΈλ‘μ΄ μ¬κ°νμ΄μκΈ° λλ¬Έμ Rectangle
, Header
, TextBlock
μ¬μ΄μλ μ€λ³΅μ΄ μμμ΅λλ€.
μμ΄λμ΄κ° λ μ¬λμ΅λλ€.
λ€μκ³Ό κ°μ΄ μ½λλ₯Ό κ·Έλ£Ήννλ©΄ λͺ¨λ μ€λ³΅μ μ κ±°ν μ μμ΅λλ€:
let Directions = {
top(...) {
// 5 unique lines of math
},
left(...) {
// 5 unique lines of math
},
bottom(...) {
// 5 unique lines of math
},
right(...) {
// 5 unique lines of math
},
};
let Shapes = {
Oval(...) {
// 5 unique lines of math
},
Rectangle(...) {
// 5 unique lines of math
},
}
κ·Έλ¦¬κ³ λμ λμμ ꡬμ±νλ κ²μ λλ€.
let { top, bottom, left, right } = Directions;
function createHandle(directions) {
// 20 lines of code
}
let fourCorners = [
createHandle([top, left]),
createHandle([top, right]),
createHandle([bottom, left]),
createHandle([bottom, right]),
];
let fourSides = [createHandle([top]), createHandle([left]), createHandle([right]), createHandle([bottom])];
let twoSides = [createHandle([left]), createHandle([right])];
function createBox(shape, handles) {
// 20 lines of code
}
let Rectangle = createBox(Shapes.Rectangle, fourCorners);
let Oval = createBox(Shapes.Oval, fourSides);
let Header = createBox(Shapes.Rectangle, twoSides);
let TextBox = createBox(Shapes.Rectangle, fourCorners);
μ½λμ ν¬κΈ°λ μ λ°μΌλ‘ μ€μκ³ , μ€λ³΅μ μμ ν μ¬λΌμ‘μ΅λλ€! μ λ§ κΉλνλ€μ. νΉμ λ°©ν₯μ΄λ λνμ λμμ λ³κ²½νλ €λ©΄ μ¬κΈ°μ κΈ°μ λ©μλλ₯Ό μ λ°μ΄νΈνλ λμ ν κ³³μμ μ²λ¦¬ν μ μμ΅λλ€.
μ΄λ―Έ λ°€μ΄ λ¦μμμ΅λλ€ (μ λ νΉ λΉ μ Έ μμμ£ ). 리ν©ν°λ§ν λ΄μ©μ masterμ νμΈνκ³ μ μ리μ λ€μμ΅λλ€. λλ£μ μ§μ λΆν μ½λλ₯Ό κΉλνκ² μ 리ν κ²μ΄ μλμ€λ¬μ νλ©΄μμ.
λ€μλ μμΉ¨
... μμλλ‘ λμ§ μμμ΅λλ€.
μμ¬κ° μ λ₯Ό μΌλμΌλ‘ λΆλ¬ μ κ° λ³κ²½ν λ΄μ©μ λλ리λΌκ³ μ μ€νκ² μμ²νμ΅λλ€. μ λ 좩격μ λ°μμ΅λλ€. κΈ°μ‘΄ μ½λλ μλ§μ΄μκ³ μ κ° μμ ν κ²μ κΉλνλλ° λ§μ΄μ£ !
λ§μ§λͺ»ν΄ λ°λμ§λ§, μμ¬κ° μ³μλ€λ κ²μ κΉ¨λ«λ λ° μλ μ΄ κ±Έλ Έμ΅λλ€.
μ΄κ²μ ν λ¨κ³μ λλ€.
"κΉ¨λν μ½λ"μ μ§μ°©νκ³ μ€λ³΅μ μ κ±°νλ κ²μ μ°λ¦¬ μ€ λ§μ μ¬λλ€μ΄ κ²ͺλ λ¨κ³μ λλ€. μ½λμ μμ κ°μ΄ μμ λ, μΈ‘μ κ°λ₯ν 무μΈκ°μ μμ κ°μΉμ μ λ¬Έμ μΈ μλΆμ¬μ λΆμ¬νλ κ²μ΄ μ νΉμ μ λλ€. μ격ν lint κ·μΉ, λͺ λͺ μ€ν€λ§, νμΌ κ΅¬μ‘°, μ€λ³΅ μμ λ±μ΄ κ·Έ μμ λλ€.
μ€λ³΅ μ κ±°λ μλνν μ μμ§λ§, μ°μ΅μ ν΅ν΄ λ μ¬μμ§λλ€. λ§€λ² λ³κ²½ ν μ€λ³΅μ΄ μ κ±°λ λ§μμ§ μ μ μμ΅λλ€. κ·Έ κ²°κ³Ό μ€λ³΅ μ κ±°λ μ½λμ λν κ°κ΄μ μΈ λ©νΈλ¦μ κ°μ νλ κ²μ²λΌ λκ»΄μ§λλ€. λ λμ κ²μ μ¬λλ€μ μ 체μ±μ νΌλμ€λ½κ² λ§λ λ€λ κ²μ λλ€: "λλ κΉ¨λν μ½λλ₯Ό μμ±νλ μ¬λμ λλ€". μ΄κ²μ μΌμ’ μ μκΈ°κΈ°λ§λ§νΌ κ°λ ₯ν©λλ€.
μΌλ¨ μΆμνλ₯Ό λ§λλ λ°©λ²μ λ°°μ°λ©΄, κ·Έ λ₯λ ₯μ λμ·¨λμ΄ λ°λ³΅λλ μ½λλ₯Ό λ³Ό λλ§λ€ μΆμνλ₯Ό ν곡μμ λ½μλ΄λ κ²μ΄ μ νΉμ μ λλ€. λͺ λ λμ μ½λ©μ νλ€ λ³΄λ©΄ μ΄λμμλ λ°λ³΅μ λ³΄κ² λκ³ , μΆμνλ μ°λ¦¬μ μλ‘μ΄ μ΄λ₯λ ₯μ΄ λ©λλ€. λκ΅°κ° μΆμνκ° λ―Έλμ΄λΌκ³ λ§νλ©΄, μ°λ¦¬λ κ·Έκ²μ λ°μλ€μΌ κ²μ λλ€. κ·Έλ¦¬κ³ "κΉ¨λν¨"μ μλ°°νμ§ μλ λ€λ₯Έ μ¬λλ€μ νλ¨νκΈ° μμν κ²μ λλ€.
μ΄μ μ λ μ "리ν©ν°λ§"μ΄ λ κ°μ§ μΈ‘λ©΄μμ μ¬μμ΄μλ€λ κ²μ κΉ¨λ¬μμ΅λλ€.
-
첫째, μ λ κ·Έκ²μ μμ±ν μ¬λκ³Ό μ΄μΌκΈ°νμ§ μμμ΅λλ€. μ½λλ₯Ό λ€μ μμ±νκ³ κ·Έλ€μ μ견μ λ£μ§ μκ³ μ²΄ν¬μΈνμ΅λλ€. κ°μ λ κ²μ΄μλ€ νλλΌλ(μ΄μ λ λ μ΄μ κ·Έλ κ² λ―Ώμ§ μμ§λ§), μ΄λ κ·Έκ²μ μ²λ¦¬νλ λμ°ν λ°©λ²μ λλ€. 건κ°ν μμ§λμ΄λ§ νμ λμμμ΄ μ λ’°λ₯Ό μμκ°λλ€. νμκ³Ό μμ μμ΄ μ½λλ₯Ό λ€μ μμ±νλ κ²μ μ½λλ² μ΄μ€λ₯Ό ν¨κ³Όμ μΌλ‘ ν¨κ» νμ νλ λ₯λ ₯μ ν° ν격μ μ€λλ€.
-
λμ§Έ, 곡μ§λ μμ΅λλ€. μ μ½λλ μꡬ μ¬νμ λ³κ²½ν μ μλ λ₯λ ₯μ μ€λ³΅ κ°μμ κ΅ννμ§λ§, μ΄λ μ’μ κ±°λκ° μλμμ΅λλ€. μλ₯Ό λ€μ΄, λμ€μ λ€μν λνμ λ€μν νΈλ€μ λν λ§μ νΉμ μΌμ΄μ€μ λμμ΄ νμνμ΅λλ€. μ μΆμνλ κ·Έλ¬ν λ³κ²½μ μ©μ΄νκ² νκΈ° μν΄ λͺ λ°° λ 볡μ‘ν΄μ ΈμΌ νμ κ²μ λλ€. λ°λ©΄μ μλμ "μ§μ λΆν" λ²μ μμλ κ·Έλ¬ν λ³κ²½μ΄ μΌμ΄ν¬μ²λΌ μ½κ² μ μ§λμμ΅λλ€.
μ κ° "λλ¬μ΄" μ½λλ₯Ό μμ±ν΄μΌ νλ€κ³ λ§νκ³ μλ κ±ΈκΉμ? μλλλ€. "κΉ¨λν¨" λλ "λλ¬μ"μ΄λΌκ³ λ§ν λ μλ―Ένλ λ°λ₯Ό κΉμ΄ μκ°ν΄ 보λΌκ³ μ μν©λλ€. λ°νμ¬, μ μκ°, μλ¦λ€μ, μ°μν¨μ λλΌμλμ? κ·Έλ¬ν νμ§μ ν΄λΉνλ ꡬ체μ μΈ μμ§λμ΄λ§ κ²°κ³Όλ₯Ό μ΄λ¦ μ§μ μ μλ€κ³ μΌλ§λ νμ νμλμ? κ·Έκ²λ€μ΄ μ½λ μμ± λ° μμ λ°©μμ μ νν μ΄λ€ μν₯μ λ―ΈμΉλμ?
μ λ μ΄λ¬ν κ²λ€μ λν΄ κΉμ΄ μκ°νμ§ μμμ΅λλ€. μ½λκ° μ΄λ»κ² μκ²Όλμ§μ λν΄μλ λ§μ΄ μκ°νμ§λ§, λ§λλ§λν μΈκ° νκ³Ό ν¨κ» μ΄λ»κ² λ°μ νλμ§μ λν΄μλ μκ°νμ§ μμμ΅λλ€.
μ½λ©μ μ¬μ μ λλ€. 첫 λ²μ§Έ μ½λ ν μ€λΆν° μ§κΈκΉμ§ μΌλ§λ λ©λ¦¬ μλμ§ μκ°ν΄ 보μΈμ. ν¨μλ₯Ό μΆμΆνκ±°λ ν΄λμ€λ₯Ό 리ν©ν°λ§νμ¬ λ³΅μ‘ν μ½λλ₯Ό κ°λ¨νκ² λ§λ€ μ μλ λ°©λ²μ μ²μ 보μμ λ κΈ°μ¨μ λκΌμ κ²μ λλ€. κΈ°μ μ μλΆμ¬μ λλλ€λ©΄, μ½λμ κΉλν¨μ μΆκ΅¬νλ κ²μ΄ μ νΉμ μΌ κ²μ λλ€. νλμ κ·Έλ κ² ν΄λ³΄μΈμ.
νμ§λ§ κ±°κΈ°μ λ©μΆμ§ λ§μΈμ. κΉ¨λν μ½λ κ΄μ λκ° λμ§ λ§μΈμ. κΉ¨λν μ½λλ λͺ©νκ° μλλλ€. μ°λ¦¬κ° λ€λ£¨λ μμ€ν μ λ§λν 볡μ‘μ±μμ μ½κ°μ μλ―Έλ₯Ό μ°ΎμΌλ €λ μλμ λλ€. λ³κ²½μ΄ μ½λλ² μ΄μ€μ μ΄λ€ μν₯μ λ―ΈμΉ μ§ μμ§ νμ νμ§ λͺ»νμ§λ§ λ―Έμ§μ λ°λ€μμ μλ΄κ° νμν λ μ¬μ©νλ λ°©μ΄ λ©μ»€λμ¦μ λλ€.
κΉ¨λν μ½λκ° μ¬λ¬λΆμ μΈλνκ² νμΈμ. κ·Έλ¦¬κ³ λμμ£ΌμΈμ.