SRP(Single Responsibility Principle)

A class should have only one reason to change. // ν΄λž˜μŠ€κ°€ 변경될 μ΄μœ λŠ” 단 ν•˜λ‚˜μ—¬μ•Ό ν•œλ‹€.

Example

μ•„λž˜μ˜ Bookμ΄λΌλŠ” ν΄λž˜μŠ€λŠ” 맀우 논리적이고 κ°„λ‹¨ν•œ 클래슀처럼 λ³΄μž…λ‹ˆλ‹€. 클래슀λ₯Ό 톡해 제λͺ©μ„ 얻을 μˆ˜λ„ 있고, μž‘κ°€, λ‹€μŒνŽ˜μ΄μ§€, ν˜„μž¬ νŽ˜μ΄μ§€ λ‚΄μš©μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

class Book {
 
    function getTitle() {
        return "A Great Book";
    }
 
    function getAuthor() {
        return "John Doe";
    }
 
    function turnPage() {
        // pointer to next page
    }
 
    function printCurrentPage() {
        echo "current page content";
    }
}

ν•˜μ§€λ§Œ μž‘μ€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ μ‰½κ²Œ μƒκ°ν•΄λ³΄μ•˜μ„λ•Œ Book 클래슀λ₯Ό λ‹€λ£¨λŠ” ν–‰μœ„μžκ°€ 책을 κ΄€λ¦¬ν•˜λŠ” μ‚¬λžŒμ΄κ±°λ‚˜, 책을 λ³΄μ—¬μ£ΌλŠ” μ‚¬λžŒ 두 λΆ„λ₯˜λ‘œ λ‚˜λˆŒ 수 μžˆμŠ΅λ‹ˆλ‹€.

두 λΆ„λ₯˜μ˜ ν–‰μœ„μžκ°€ μ›ν•˜λŠ” bussiness logic이 Bookν΄λž˜μŠ€μ— μ„žμ—¬μžˆμŠ΅λ‹ˆλ‹€. 이런 κ²½μš°λŠ” SRPλ₯Ό μœ„λ°˜ν•œ 경우라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

class Book {
 
    function getTitle() {
        return "A Great Book";
    }
 
    function getAuthor() {
        return "John Doe";
    }
 
    function turnPage() {
        // pointer to next page
    }
 
    function getCurrentPage() {
        return "current page content";
    }
 
}
 
interface Printer {
 
    function printPage($page);
}
 
class PlainTextPrinter implements Printer {
 
    function printPage($page) {
        echo $page;
    }
 
}
 
class HtmlPrinter implements Printer {
 
    function printPage($page) {
        echo '<div style="single-page">' . $page . '</div>';
    }
 
}

두 κ°€μ§€μ˜ bussiness logic을 λΆ„λ₯˜ν•¨μœΌλ‘œμ¨ design의 μœ μ—°μ„±μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•„λž˜μ˜ 경우 μ €μž₯ν•˜λŠ” κΈ°λŠ₯이 μΆ”κ°€λœ Bookμž…λ‹ˆλ‹€.

class Book {
 
    function getTitle() {
        return "A Great Book";
    }
 
    function getAuthor() {
        return "John Doe";
    }
 
    function turnPage() {
        // pointer to next page
    }
 
    function getCurrentPage() {
        return "current page content";
    }
 
    function save() {
        $filename = '/documents/'. $this->getTitle(). ' - ' . $this->getAuthor();
        file_put_contents($filename, serialize($this));
    }
 
}

μš°λ¦¬κ°€ μ €μž₯ν•˜λŠ” 방법을 바꿀땐 Book 클래슀λ₯Ό λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ μš°λ¦¬κ°€ λ‹€μŒ νŽ˜μ΄μ§€λ₯Ό λ„˜κΈ°λŠ” 과정을 바꿀땐 Book 클래슀λ₯Ό λ°”κΏ”μ•Ό ν•©λ‹ˆλ‹€. 이 클래슀λ₯Ό λ°”κΏ”μ•Όν•˜λŠ” μ΄μœ λŠ” μ—¬λŸ¬κ°€μ§€μ˜ λ³€κ²½μ˜ 좕이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

saveλ₯Ό SimpleFilePersistence 클래슀둜 λΆ„λ¦¬μ‹œμΌœ 각 ν΄λž˜μŠ€κ°€ 변경될 이유λ₯Ό μ΅œμ†Œν™”ν•©λ‹ˆλ‹€.

class Book {
 
    function getTitle() {
        return "A Great Book";
    }
 
    function getAuthor() {
        return "John Doe";
    }
 
    function turnPage() {
        // pointer to next page
    }
 
    function getCurrentPage() {
        return "current page content";
    }
 
}
 
class SimpleFilePersistence {
 
    function save(Book $book) {
        $filename = '/documents/' . $book->getTitle() . ' - ' . $book->getAuthor();
        file_put_contents($filename, serialize($book));
    }
}

κ²°λ‘ 

  • SRP을 μ§€ν‚΄μœΌλ‘œμ¨ low coupled design을 얻을 수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ κ³Όλ„ν•œ SRPλŠ” μ΅œμ ν™” λ””μžμΈ λŒ€μ‹  λ―Έμ™„μ„±λœ μ΅œμ ν™” λ””μžμΈμœΌλ‘œ 이끌 수 μžˆλ‹€.
  • λ˜ν•œ λΆ„μ‚°λœ μž‘μ€ class둜 인해 μ΄ν•΄ν•˜κΈ° νž˜λ“  λ””μžμΈμ΄ 될 수 μžˆλ‹€.

Reference