๐Ÿ“š/Clean Code(ํด๋ฆฐ ์ฝ”๋“œ)

[ํด๋ฆฐ์ฝ”๋“œ ์Šคํ„ฐ๋””] 3์žฅ. ํ•จ์ˆ˜

z_ero 2025. 4. 30. 23:24

3์žฅ. ํ•จ์ˆ˜

๐ŸŽฏ ํ•จ์ˆ˜๋Š” ์ž‘๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ

  • ํ•จ์ˆ˜๋Š” ์ž‘์•„์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ์ž‘์•„์•ผ ํ•œ๋‹ค.
  • ํ•จ์ˆ˜๊ฐ€ ์งง์„์ˆ˜๋ก, ๋“ค์—ฌ์“ฐ๊ธฐ ๋ ˆ๋ฒจ์ด ์–•์„์ˆ˜๋ก, ์ฝ๊ธฐ ์‰ฌ์šด ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.
  • ํ•œ๋ˆˆ์— ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ํ•œ ๊ฐ€์ง€ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
// ๊ธธ๊ณ  ๋ณต์žกํ•œ ํ•จ์ˆ˜ ์˜ˆ์‹œ
public void processUser(User user) {
    if (user.isActive()) {
        sendEmail(user);
    }
    updateLastLogin(user);
    saveToDatabase(user);
}

// ์ž‘๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ ์˜ˆ์‹œ
public void processUser(User user) {
    if (isActiveUser(user)) {
        notifyUser(user);
    }
    recordLogin(user);
    persistUser(user);
}

private boolean isActiveUser(User user) {
    return user.isActive();
}

private void notifyUser(User user) {
    sendEmail(user);
}

private void recordLogin(User user) {
    updateLastLogin(user);
}

private void persistUser(User user) {
    saveToDatabase(user);
}

 

๐ŸŽฏ ํ•œ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ํ•ด์•ผ ํ•œ๋‹ค

  • ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋ฉด, ์ˆ˜์ •์ด ํ•„์š”ํ•  ๋•Œ ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • ํ•จ์ˆ˜๋Š” ์˜ค์ง ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ์„ ๊ฐ€์ ธ์•ผ ํ•˜๋ฉฐ, ์ด๋ฆ„๋„ ๊ทธ ์ฑ…์ž„์„ ๋ถ„๋ช…ํžˆ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

๐ŸŽฏ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝํžˆ๋Š” ์ฝ”๋“œ

  • ์ฝ”๋“œ๋Š” ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝํ˜€์•ผ ํ•œ๋‹ค.
  • ๊ฐ ํ•จ์ˆ˜๋Š” ๋ฐ”๋กœ ์•„๋ž˜์— ๋“ฑ์žฅํ•˜๋Š” ์„ธ๋ถ€ ๋™์ž‘์„ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค.
public void generateReport() {
    fetchReportData();
    formatReport();
    printReport();
}

private void fetchReportData() { /* ... */ }
private void formatReport() { /* ... */ }
private void printReport() { /* ... */ }

 

๐ŸŽฏ switch ๋ฌธ์€ ์ตœ์†Œํ™”ํ•˜๊ณ  ์ˆจ๊ฒจ๋ผ

  • switch ๋ฌธ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๊ฐ€ ์ปค์งˆ ์œ„ํ—˜์ด ์žˆ๋‹ค.
  • ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•ด switch ๋ฌธ์„ ๊ฐ์ฒด ์ƒ์„ฑ ๋‹จ๊ณ„๋กœ ์ˆจ๊ธฐ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.
// ์ข‹์ง€ ์•Š์€ switch ๋ฌธ
public double calculatePay(Employee e) {
    switch (e.type) {
        case SALARIED: return calculateSalariedPay(e);
        case HOURLY: return calculateHourlyPay(e);
        default: throw new InvalidEmployeeType();
    }
}

// ๋‹คํ˜•์„ฑ์œผ๋กœ ๊ฐœ์„ 
abstract class Employee {
    public abstract double calculatePay();
}

class SalariedEmployee extends Employee {
    public double calculatePay() { /* ... */ }
}

class HourlyEmployee extends Employee {
    public double calculatePay() { /* ... */ }
}

 

๐ŸŽฏ ์ข‹์€ ํ•จ์ˆ˜ ์ด๋ฆ„ ์ง“๊ธฐ

  • ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๊ทธ ์ž์ฒด๋กœ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ์ด๋ฆ„๋งŒ ๋ณด๊ณ ๋„ ๊ธฐ๋Šฅ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ์‹œ:

  • ๋‚˜์œ ์ด๋ฆ„: doStuff(), handleData()
  • ์ข‹์€ ์ด๋ฆ„: saveUserProfile(), validateOrderRequest()

 

๐ŸŽฏ ์ธ์ˆ˜๋Š” ์ตœ๋Œ€ํ•œ ์ค„์—ฌ๋ผ

  • ํ•จ์ˆ˜ ์ธ์ˆ˜๋Š” 0~2๊ฐœ๊ฐ€ ์ด์ƒ์ ์ด๋‹ค.
  • ์ธ์ˆ˜๊ฐ€ ๋งŽ์„ ๊ฒฝ์šฐ, ๊ด€๋ จ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ผ๋ฆฌ ๋ฌถ์–ด ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ข‹๋‹ค.
// ์ธ์ˆ˜๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ
public void registerUser(String name, String email, String password, String phone) {}

// ๊ฐ์ฒด๋กœ ๋ฌถ์–ด ๊ฐœ์„ 
public void registerUser(UserRegistrationInfo info) {}

 

๐ŸŽฏ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ํ”ผํ•˜๋ผ

  • ํ•จ์ˆ˜๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋ฉด ์•ˆ ๋œ๋‹ค.
  • ํŠนํžˆ, ์ž…๋ ฅ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ–‰๋™์€ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ž˜๋ชป๋œ ์˜ˆ์‹œ:

public void updateUser(User user) {
    user.setLastLogin(LocalDate.now());
    database.save(user);
    // ๋ถ€์ˆ˜ ํšจ๊ณผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ
    SessionManager.resetSession(user);
}

๊ฐœ์„ ๋œ ์˜ˆ์‹œ:

public void updateUser(User user) {
    user.setLastLogin(LocalDate.now());
    database.save(user);
}

public void resetSessionIfNeeded(User user) {
    SessionManager.resetSession(user);
}

 

๐ŸŽฏ ๋ช…๋ น๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ผ

  • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ "์ฝ๊ธฐ"์™€ "์“ฐ๊ธฐ" ์—ญํ• ์ด ํ˜ผํ•ฉ๋˜์–ด ์žˆ์œผ๋ฉด ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ์กฐํšŒ ํ•จ์ˆ˜๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๊ณ , ๋ช…๋ น ํ•จ์ˆ˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
// ์ž˜๋ชป๋œ ์˜ˆ์‹œ
public boolean setName(String name) {
    this.name = name;
    return true;
}

// ๊ฐœ์„ ๋œ ์˜ˆ์‹œ
public void setName(String name) {
    this.name = name;
}

public String getName() {
    return this.name;
}

 

 


โœจ ์ •๋ฆฌํ•˜๋ฉฐ

3์žฅ์„ ์ฝ์œผ๋ฉด์„œ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋А๋‚€ ๊ฒƒ์€, ์ข‹์€ ํ•จ์ˆ˜๋Š” '์งง๊ณ  ๋ช…ํ™•ํ•ด์•ผ ํ•œ๋‹ค'๋Š” ๊ธฐ๋ณธ ์›์น™์ด์—ˆ๋‹ค.
๋˜ํ•œ, ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ์ฑ…์ž„์„ ์ง€๋Š” ์ˆœ๊ฐ„ ์ฝ”๋“œ๋Š” ๊ธ‰๊ฒฉํžˆ ๋ณต์žกํ•ด์ง„๋‹ค๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

 

ํŠนํžˆ ์ธ์ƒ ๊นŠ์—ˆ๋˜ ๊ฒƒ์€ "์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝํžˆ๋Š” ํ๋ฆ„" ์ด๋‹ค. ํ•˜๋‚˜์˜ ํฐ ๊ทธ๋ฆผ์„ ๋จผ์ € ๋ณด์—ฌ์ฃผ๊ณ ,
๊ทธ ๋ฐ‘์— ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ๋‹จ๊ณ„์ ์œผ๋กœ ํ’€์–ด๋‚ด๋Š” ๋ฐฉ์‹์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค€๋‹ค.

 

์•ž์œผ๋กœ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์ด ํ•จ์ˆ˜๊ฐ€ ์ •๋ง ํ•˜๋‚˜์˜ ์ผ๋งŒ ํ•˜๋Š”์ง€, ์ด ํ•จ์ˆ˜๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์€์ง€,
ํ•จ์ˆ˜ ์ด๋ฆ„๋งŒ์œผ๋กœ ์˜๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋Š”์ง€, ํ•ญ์ƒ ์Šค์Šค๋กœ ์ ๊ฒ€ํ•ด๊ฐ€๋ฉฐ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•