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) - 4μž₯, 5μž₯, 6μž₯
πŸ“‚ 개발 μ„œμ /클린 μ½”λ“œ

클린 μ½”λ“œ(Clean Code) - 4μž₯, 5μž₯, 6μž₯

2023. 1. 9. 22:38

4μž₯. 주석 🌿

λ‚˜μœ μ½”λ“œμ— 주석을 달지 마라. μƒˆλ‘œ 짜라.
  • 주석은 였래될수둝 μ½”λ“œμ—μ„œ λ©€μ–΄μ§„λ‹€.
      주석은 였래될수둝 μ™„μ „νžˆ 그릇될 κ°€λŠ₯성도 컀진닀. μ΄μœ λŠ” λ‹¨μˆœν•˜λ‹€. ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ 주석을 μœ μ§€ν•˜κ³  λ³΄μˆ˜ν•˜κΈ°λž€ ν˜„μ‹€μ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹ˆκΉŒ.
  • λΆ€μ •ν™•ν•œ 주석은 μ•„μ˜ˆ μ—†λŠ” 주석보닀 훨씬 더 λ‚˜μ˜λ‹€.
      λΆ€μ •ν™•ν•œ 주석은 λ…μžλ₯Ό ν˜„ν˜Ήν•˜κ³  μ˜€λ„ν•œλ‹€. λΆ€μ •ν™•ν•œ 주석은 κ²°μ½” 이뀄지지 μ•Šμ„ κΈ°λŒ€λ₯Ό 심어쀀닀. 더 이상 지킬 ν•„μš”κ°€ μ—†λŠ” κ·œμΉ™μ΄λ‚˜ μ§€μΌœμ„œλŠ” μ•ˆ λ˜λŠ” κ·œμΉ™μ„ λͺ…μ‹œν•œλ‹€.
  • 주석은 의미λ₯Ό λͺ…λ£Œν•˜κ²Œ λ°ν˜€μ•Ό ν•œλ‹€.
      κ·Έλ¦‡λœ 주석을 달아놓을 μœ„ν—˜λ„ μƒλ‹Ήνžˆ λ†’λ‹€. 그리고 주석이 μ˜¬λ°”λ₯Έμ§€ κ²€μ¦ν•˜κΈ°λŠ” 쉽지 μ•Šλ‹€. 이것이 의미λ₯Ό λͺ…λ£Œνžˆ λ°νžˆλŠ” 주석이 ν•„μš”ν•œ 이유인 λ™μ‹œμ— 주석이 μœ„ν—˜ν•œ μ΄μœ μ΄κΈ°λ„ ν•˜λ‹€. κ·ΈλŸ¬λ―€λ‘œ 주석을 달 λ•ŒλŠ” 더 λ‚˜μ€ 방법이 μ—†λŠ”μ§€ κ³ λ―Όν•˜κ³  μ •ν™•νžˆ 달도둝 κ°λ³„νžˆ μ£Όμ˜ν•œλ‹€.

 

5μž₯. ν˜•μ‹ λ§žμΆ”κΈ° πŸ€

  • κ°œλ…μ€ 빈 ν–‰μœΌλ‘œ λΆ„λ¦¬ν•˜λΌ
      생각 μ‚¬μ΄λŠ” 빈 행을 λ„£μ–΄ 뢄리해야 λ§ˆλ•…ν•˜λ‹€. 빈 행은 μƒˆλ‘œμš΄ κ°œλ…μ„ μ‹œμž‘ν•œλ‹€λŠ” μ‹œκ°μ  λ‹¨μ„œλ‹€. μ½”λ“œλ₯Ό 읽어 λ‚΄λ €κ°€λ‹€ 보면 빈 ν–‰ λ°”λ‘œ λ‹€μŒ 쀄에 눈길이 λ©ˆμΆ”κΈ° λ•Œλ¬Έμ΄λ‹€.
  • μ„Έλ‘œ 밀집도
      μ€„λ°”κΏˆμ΄ κ°œλ…μ„ λΆ„λ¦¬ν•œλ‹€λ©΄ μ„Έλ‘œ λ°€μ§‘λ„λŠ” 연관성을 μ˜λ―Έν•œλ‹€. (μ—¬κΈ°μ„œ μ—°κ΄€μ„±μ΄λž€ ν•œ κ°œλ…μ„ μ΄ν•΄ν•˜λŠ” 데 λ‹€λ₯Έ κ°œλ…μ΄ μ€‘μš”ν•œ 정도닀.) 즉, μ„œλ‘œ λ°€μ§‘ν•œ μ½”λ“œ 행은 μ„Έλ‘œλ‘œ κ°€κΉŒμ΄ 놓여야 ν•œλ‹€λŠ” λœ»μ΄λ‹€. 연관성이 κΉŠμ€ 두 κ°œλ…μ΄ 멀리 λ–¨μ–΄μ Έ 있으면 μ½”λ“œλ₯Ό μ½λŠ” μ‚¬λžŒμ΄ μ†ŒμŠ€ 파일과 클래슀λ₯Ό μ—¬κΈ°μ €κΈ° λ’€μ§€κ²Œ λœλ‹€.
  • κ°€μ§œ λ²”μœ„
      λ•Œλ‘œλŠ” 빈 while λ¬Έμ΄λ‚˜ for 문을 μ ‘ν•œλ‹€. μ„Έλ―Έμ½œλ‘ (;)은 μƒˆ 행에닀 μ œλŒ€λ‘œ λ“€μ—¬ μ¨μ„œ λ„£μ–΄μ€€λ‹€. κ·Έλ ‡κ²Œ ν•˜μ§€ μ•ŠμœΌλ©΄ λˆˆμ— 띄지 μ•ŠλŠ”λ‹€.
while(dis.read(buf, 0, readBufferSize) != -1)
;

 

6μž₯. 객체와 자료ꡬ쑰 🌡

  λ³€μˆ˜λ₯Ό λΉ„κ³΅κ°œ(private)둜 μ •μ˜ν•˜λŠ” μ΄μœ κ°€ μžˆλ‹€. 남듀이 λ³€μˆ˜μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ²Œ λ§Œλ“€κ³  μ‹Άμ–΄μ„œλ‹€. 좩동이든 변덕이든, λ³€μˆ˜ νƒ€μž…μ΄λ‚˜ κ΅¬ν˜„μ„ λ§˜λŒ€λ‘œ λ°”κΎΈκ³  μ‹Άμ–΄μ„œλ‹€.

  λ³€μˆ˜ 사이에 ν•¨μˆ˜λΌλŠ” 계측을 λ„£λŠ”λ‹€κ³  κ΅¬ν˜„μ΄ μ €μ ˆλ‘œ κ°μΆ°μ§€μ§€λŠ” μ•ŠλŠ”λ‹€. κ΅¬ν˜„μ„ 감좔렀면 좔상화가 ν•„μš”ν•˜λ‹€! κ·Έμ € (ν˜•μ‹ 논리에 치우쳐) 쑰회 ν•¨μˆ˜μ™€ μ„€μ • ν•¨μˆ˜λ‘œ λ³€μˆ˜λ₯Ό 닀룬닀고 ν΄λž˜μŠ€κ°€ λ˜μ§€λŠ” μ•ŠλŠ”λ‹€. κ·Έλ³΄λ‹€λŠ” 좔상 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•΄ μ‚¬μš©μžκ°€ κ΅¬ν˜„μ„ λͺ¨λ₯Έ 채 자료의 핡심을 μ‘°μž‘ν•  수 μžˆμ–΄μ•Ό μ§„μ •ν•œ 의미의 ν΄λž˜μŠ€λ‹€.

// ꡬ체적인 Point 클래슀
public class Point {
    public double x;
    public double y;
}
// 좔상적인 Point 클래슀
public interface Point {
    double getX();
    double getY();
    void setCartesian(double x, double y);
    double getR();
    double getTheta();
    void setPolar(double r, doiuble theta);
}
// ꡬ체적인 Vehicle 클래슀
public interface Vehicle {
    double getFuelTankCapacityInGallons();
    double getGallonsOfGasoline();
}
// 좔상적인 Vehicle 클래슀
public interface Vehicle {
    double getPercentFuelRemaining();
}

 

  (자료 ꡬ쑰λ₯Ό μ‚¬μš©ν•˜λŠ”) 절차적인 μ½”λ“œλŠ” κΈ°μ‘΄ 자료 ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μƒˆ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜κΈ° 쉽닀. 반면, 객체 μ§€ν–₯ μ½”λ“œλŠ” κΈ°μ‘΄ ν•¨μˆ˜λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μƒˆ 클래슀λ₯Ό μΆ”κ°€ν•˜κΈ° 쉽닀.

  λ°˜λŒ€μͺ½λ„ 참이닀. 절차적인 μ½”λ“œλŠ” μƒˆλ‘œμš΄ 자료 ꡬ쑰λ₯Ό μΆ”κ°€ν•˜κΈ° μ–΄λ ΅λ‹€. 그러렀면 λͺ¨λ“  ν•¨μˆ˜λ₯Ό 고쳐야 ν•œλ‹€. 객체 μ§€ν–₯ μ½”λ“œλŠ” μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜κΈ° μ–΄λ ΅λ‹€. 그러렀면 λͺ¨λ“  클래슀λ₯Ό 고쳐야 ν•œλ‹€.

// 절차적인 λ„ν˜•
public class Square {
    public Point topLeft;
    public double side;
}

public class Rectangle {
    public Point topLeft;
    public double height;
    public double width;
}

public class Circle {
    public Point center;
    public double radius;
}

public class Geometry {
    public final double PI = 3.141592653589793;
    
    public double area(Object shape) throws NoSuchShapeException {
        if (shape instanceof Square) {
            Square s = (Square)shape;
            return s.side * s.side;
        }
        else if (shape instanceof Rectangle) {
            Rectangle r = (Rectangle)shape;
            return r.height * r.width;
        }
        else if (shape instanceof Circle) {
            Circle = (Circle)shape;
            return PI * c.radius * c.radius;
        }
        throw new NoSuchShapeException();
    }
}

  λ§Œμ•½ Geometry ν΄λž˜μŠ€μ— λ‘˜λ ˆ 길이λ₯Ό κ΅¬ν•˜λŠ” perimeter() ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄ λ„ν˜• ν΄λž˜μŠ€λŠ” 아무 영ν–₯도 λ°›μ§€ μ•ŠλŠ”λ‹€. λ°˜λŒ€λ‘œ μƒˆ λ„ν˜•μ„ μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄ Geometry ν΄λž˜μŠ€μ— μ†ν•œ ν•¨μˆ˜λ₯Ό 고쳐야 ν•œλ‹€.

 

// λ‹€ν˜•μ μΈ λ„ν˜•
public class Square implements Shape {
    private Point topLeft;
    private double side;
    
    public double area() {
        return side * side;
    }
}

public class Rectangle implements Shape {
    private Point topLeft;
    private double height;
    private double width;
    
    public double area() {
        return height * width;
    }
}

public class Circle implements Shape {
    private Point center;
    private double radius;
    public final double PI = 3.141592653589793;
    
    public double area() {
        return PI * radius * radius;
    }
}

  μ—¬κΈ°μ„œ area()λŠ” λ‹€ν˜•(polymorphic) λ©”μ„œλ“œλ‹€. Geometry ν΄λž˜μŠ€λŠ” ν•„μš” μ—†λ‹€. κ·ΈλŸ¬λ―€λ‘œ μƒˆ λ„ν˜•μ„ 좔가해도 κΈ°μ‘΄ ν•¨μˆ˜μ— μ•„λ¬΄λŸ° 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠλŠ”λ‹€. 반면 μƒˆ ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜κ³  μ‹Άλ‹€λ©΄ λ„ν˜• 클래슀 μ „λΆ€λ₯Ό 고쳐야 ν•œλ‹€.

 

  이런 ν˜Όλž€μœΌλ‘œ 말미암아 λ•Œλ•Œλ‘œ μ ˆλ°˜μ€ 객체, μ ˆλ°˜μ€ 자료 ꡬ쑰인 μž‘μ’… ꡬ쑰가 λ‚˜μ˜¨λ‹€. μ΄λŸ¬ν•œ μž‘μ’… κ΅¬μ‘°λŠ” μƒˆλ‘œμš΄ ν•¨μˆ˜λŠ” 물둠이고 μƒˆλ‘œμš΄ 자료 ꡬ쑰도 μΆ”κ°€ν•˜κΈ° μ–΄λ ΅λ‹€. μ–‘μͺ½ μ„Έμƒμ—μ„œ λ‹¨μ λ§Œ λͺ¨μ•„놓은 ꡬ쑰닀. κ·ΈλŸ¬λ―€λ‘œ μž‘μ’… κ΅¬μ‘°λŠ” λ˜λ„λ‘ ν”Όν•˜λŠ” 편이 μ’‹λ‹€.

 

6μž₯ κ²°λ‘ 

  κ°μ²΄λŠ” λ™μž‘μ„ κ³΅κ°œν•˜κ³  자료λ₯Ό μˆ¨κΈ΄λ‹€. κ·Έλž˜μ„œ κΈ°μ‘΄ λ™μž‘μ„ λ³€κ²½ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μƒˆ 객체 νƒ€μž…μ„ μΆ”κ°€ν•˜κΈ° μ‰¬μš΄ 반면, κΈ°μ‘΄ 객체에 μƒˆ λ™μž‘μ„ μΆ”κ°€ν•˜κΈ°λŠ” μ–΄λ ΅λ‹€. 자료 κ΅¬μ‘°λŠ” 별닀λ₯Έ λ™μž‘ 없이 자료λ₯Ό λ…ΈμΆœν•œλ‹€. κ·Έλž˜μ„œ κΈ°μ‘΄ 자료 ꡬ쑰에 μƒˆ λ™μž‘μ„ μΆ”κ°€ν•˜κΈ°λŠ” μ‰¬μš°λ‚˜, κΈ°μ‘΄ ν•¨μˆ˜μ— μƒˆ 자료 ꡬ쑰λ₯Ό μΆ”κ°€ν•˜κΈ°λŠ” μ–΄λ ΅λ‹€. 

  (μ–΄λ–€) μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•  λ•Œ, μƒˆλ‘œμš΄ 자료 νƒ€μž…μ„ μΆ”κ°€ν•˜λŠ” μœ μ—°μ„±μ΄ ν•„μš”ν•˜λ©΄ 객체가 더 μ ν•©ν•˜λ‹€. λ‹€λ₯Έ 경우둜 μƒˆλ‘œμš΄ λ™μž‘μ„ μΆ”κ°€ν•˜λŠ” μœ μ—°μ„±μ΄ ν•„μš”ν•˜λ©΄ 자료 ꡬ쑰와 절차적인 μ½”λ“œκ°€ 더 μ ν•©ν•˜λ‹€. μš°μˆ˜ν•œ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμžλŠ” 편견 없이 이 사싀을 이해해 μ§λ©΄ν•œ λ¬Έμ œμ— 졜적인 해결책을 μ„ νƒν•œλ‹€.

'πŸ“‚ 개발 μ„œμ  > 클린 μ½”λ“œ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

클린 μ½”λ“œ(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) - 7μž₯  (0) 2023.01.10
클린 μ½”λ“œ(Clean Code) - 1μž₯, 2μž₯, 3μž₯  (0) 2023.01.08
    'πŸ“‚ 개발 μ„œμ /클린 μ½”λ“œ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • 클린 μ½”λ“œ(Clean Code) - 10μž₯
    • 클린 μ½”λ“œ(Clean Code) - 8μž₯, 9μž₯
    • 클린 μ½”λ“œ(Clean Code) - 7μž₯
    • 클린 μ½”λ“œ(Clean Code) - 1μž₯, 2μž₯, 3μž₯
    Amenable
    Amenable
    CS, μžλ°”, 자료ꡬ쑰, μ•Œκ³ λ¦¬μ¦˜, μŠ€ν”„λ§, μŠ€ν”„λ§ λΆ€νŠΈμ— ν•΄λ‹Ήν•˜λŠ” κ°œλ°œμ— κ΄€ν•œ λ‚΄μš©μ„ κ³΅μœ ν•©λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”