Swift_단일 책임 원칙

7과11사이·2023년 7월 19일
0
post-thumbnail

이전에 코드 리뷰를 받을 때 혼났던 적이 있었다.
꾸짖음보다 '이걸 모르면 안돼요~' 같은 느낌이 더 강했는데,
단일 책임 원칙을 따르지 않았기 때문이었다.

아- 물론 함수 관련해서 피드백을 받았지만,
결과적으로 코드를 짤 때 고려해야한다는 점에서 남긴다.

하나의 함수는 하나의 일만 해야 하듯, 클래스도 변경되야 하는 이유가 하나여야 한다!

  1. What is SOLID?

    솔리드 원칙은 2000년대 초반, '클린 코드'로 유명한 로버트 마틴이 말한
    "깔끔한 코드를 작성하는 5가지 원칙" "객체 지향 프로그래밍을 위한 5가지 설계 원칙"이다.
    이 원칙을 따르면, 시간이 지나도 유지 보수가 쉽고, 확장하기 좋은 시스템을 돕는다고 한다.

    1. Single Responsibility Principle
    2. Open / Closed Principle
    3. Liskov Substituation Principle
    4. Interface segregation Principle
    5. Dependency Inversion Principle


    여기서 첫번째가 단일 책임 원칙이다.
    원문은 아래와 같이 설명한다.
    "A class should have one and only one reason to change, meaning that a class should only have one job."
    즉, 단일 원칙 책임은 말 그대로
    하나의 클래스는 하나의 책임을 담당하도록 짜는 구조 다.

  2. 단일 책임 원칙은 왜 중요할까?

    내가 느끼기로 함수가 하나의 역할을 해야하는 이유와 비슷한다.
    클래스가 담당하기로 한 역할이 다른 클래스와 상충하면 안되기 때문이다.

    자연스럽게 네이밍의 중요성이 언급되는데,
    함수나 클래스의 네이밍이 이상하게 되어 있거나 개발자가 의도한 책임보다 더 넓은 개념으로 작성이 되어 있다면, 다른 개발자들이 동일한 코드를 읽었을 때 이해를 하지 못할 가능성이 크다.


    개발자가 작성하는 코드의 스타일이 모두 다르고 서로 이해하는 관계도나 내용이 다를 수 있기 때문에 명확하게 전달 되도록, clear delivery를 위해, 다들 노력하는 것으로 이해한다.

  3. 단일 원칙 예시

    나 스스로 헷갈려 하듯, 많은 분들도 헷갈릴 것 같다.
    "하나의 책임을 담당한다는게 뭐야?"
    "하나의 함수만 클래스에 넣으면 단일 책임 원칙은 충족하는 거 아냐?"


    사실 어느정도 그래도 맞지 않을까 싶다!

    클래스가 하나의 책임을 가진다와 함수는 하나의 행동을 담당한다는 비슷한 느낌이다.
    적절한 예시가 있어서 가져와 봤다!
    class Employee {
    	var name: String
       var position: String
       
       init(name: String, position: String) {
       	self.name = name
           self.position = position
       }
       
       func calculateOvertime() {
       // 내부 실행 코드
       }
       
       // 인사팀에서 급여 계산
       func calculatePay() {
       		self.calculateOvertime()
       }
       
       // 회계팀에서 근무 시간 계산
       func findWorkingHour() {
       		self.calculateOvertime()
       }
       
       // 기술팀에서 시간을 DB에 저장
       func saveToDatabase() {
       }
    }
    위에서는 직장인 클래스가 존재하는데, 각 함수는 하나의 역할을 가진다.
    하지만, 자세히 보면 인사팀과 회계팀에서 동일한 메서드를 다른 메서드 내부에서 실행한다.
    이럴 경우, DB가 저장된다고 하더라도 어떤 값이 누구에게 저장되는지 명확하게 드러나지 않을 수 있다.


    그렇다면 Employee 클래스의 객체는 누구의 역할을 하고 있는걸까?
    회계팀? 인사팀? 기술팀?

    지금은 모든 인원의 책임이 묶여있다.

    함수들은 단일 역할을 준다하더라도 어떤 클래스인지 모호한 지금 이 상황은
    단일 책임과 어긋나고 있다.

0개의 댓글