소프트웨어에 대한 모든 것

[디자인패턴][SOLID] 단일 책임 원칙 본문

시스템 설계 및 디자인/객체지향 SOLID

[디자인패턴][SOLID] 단일 책임 원칙

앤테바 2022. 3. 23. 17:11
반응형

SRP, 출처 - https://medium.com/@learnstuff.io/single-responsibility-principle-ad3ae3e264bb

 

객체는 단 하나의 책임만 가져야 한다는 원칙

단일 책임 원칙 목적

  • 클래스를 변경하는 이유는 단 하나여야 한다.
  • 응집력이 높고 강력한 classes, methods, functions을 생성한다.
  • 클래스 composition(구성) 사용 촉진
  • 코드 중복을 피함

단일 책임 원칙 위반 악취

  • 한 클래스가 너무 많은 책임을 가지고 있다.
  • 책임을 제대로 식별하지 않고 여러 클래스에 흩뿌려 놓는 것 또한 문제가 있다

 

Person 클래스 예제를 살펴 보겠습니다.

class Person:
    def __init__(self,name):
        self.name = name

    def __repr__(self):
        return f'name={self.name}'

    @classmethod
    def save(cls, person):
        print(f'save the {person} to the database')

Person 클래스는 두 가지 역할을 합니다.

  1. Person's의 기본 정보 관리
  2. Person 정보를 DB에 저장

 

나중에, Person 객체를 DB가 아닌 file 형태로 저장해야 한다면 save() 함수를 수정해야 합니다. 이것은 Person 객체의 변경을 의미합니다.

 

Person 클래스가 단일 책임 원칙을 따르도록 하려면, Person 정보를 DB에 저장하는 역할을 하는 새로운 클래스를 생성해야 합니다.

class Person:
    def __init__(self,name):
        self.name = name

    def __repr__(self):
        return f'name={self.name}'


class PersonDB:
    def save(self, person):
        print(f'save the {person} to the database')


if __name__ == '__main__':
    p = Person('James')

    db = PersonDB()
    db.save(p)

 

응집도 : 하나의 클래스가 하나의 기능(책임)을 온전히 순도 높게 담당하고 있는 정도

결합도 : 클래스 간의 서로 다른 책임들이 얽혀 있어서 상호의존도가 높은 정도

 

위의 디자인은 Person 클래스를 두 개의 클래스로 분리 하였습니다. (Person, PersonDB)

  • Person: Person's properties를 관리
  • PersonDB: Person 정보를 DB에 저장

위 디자인에서 Person 정보를 다른 곳에 저장하는 요구 사항이 발생하면 어떨까요? 그 역할을 하는 다른 클래스를 추가하면 됩니다. 더 이상 Person 클래스를 수정 할 필요는 없습니다.

 

요약

  • 모든 클래스는 단 한 가지의 책임만 갖는다.
  • 클래스 안에 정의되어 있는 모든 기능은 하나의 책임을 수행하는데 집중되어야 한다.
  • 하나의 클래스로 너무 많은 일을 하지 말고 딱 한 가지 책임만 수행하라!

 

함께 보면 좋은 글:

https://www.pythontutorial.net/python-oop/python-single-responsibility-principle/

 

Python Single Responsibility Principle

In this tutorial, you'll learn about the Single Responsibility Principle and how to implement it in Python.

www.pythontutorial.net

https://medium.com/@learnstuff.io/single-responsibility-principle-ad3ae3e264bb

 

 

 

반응형
Comments