설계패턴 3. SOLID 원칙 - SRP

LSDrug·2024년 6월 7일

설계패턴(完)

목록 보기
3/26

SOLID Principles

  • 로버트 C. 마틴이 명명한 객체지향 프로그래밍 및 설계의 기본 원칙이다.
  • 프로그래머가 유지보수가 쉽기 때문에 확장성이 있는 프로그램을 개발하려 할 때 이 원칙들을 적용할 수 있다.
  • 해당 원칙은 총 5개가 존재하며, 이번에 알아볼 것은 아래와 같다.

Single Responsibility Principle(SRP)

  • 단일 책임 원칙이란 모든 클래스는 하나의 책임만 가진다는 법칙이다.
  • 클래스를 구현할 때, 한가지 기능에만 중점을 둬야 한다. 두 가지 이상의 기능이 필요하다면 클래스를 나눠야 한다.
  • 만약, 해당하는 법칙을 지키지 않는 경우, 즉 한 개의 클래스에 여러 가지 기능이 있다면, 관련된모든 클래스를 수정해야 하는 상황이 발생할 수 있다.
  • 특정기능을 수정할 때, 관련 클래스 외에는 건드릴 필요가 없다.
# SRP를 잘 지킨 경우 -> 수정이 용이하다.
def add(num1, num2):
  return num1 + num2

def numPrint(num):
  print(num)
#SRP를 잘 지키지 못한 경우 -> 수정이 용이하지 않다.
def addPrint(num1, num2):
  num = num1 + num2
  print(num)
  return num

해당 원칙은 클래스에서도 적용시킬 수 있다.

# 고양이를 나타내는 클래스의 예시
# 원칙을 잘 지킨 경우. 
# 한 메서드 당 하나의 일만 담았다.

class Cat: # 고양이 클래스
  # 생성자
  def __init__(self, age, name) :
    self.age = age
    self.name = name

  # 고양이의 행동 -> 먹기, 단순한 구조를 알기 위해서 구체적 코드는 생략.
  def eat(self, food):
    pass # 해당 오버라이드를 통해 메소드를 재설정 할 수 있다. 

  # 고양이의 행동 -> 걷기
  def walk(self):
    pass

  # 고양이의 발성 -> 말하기
  def speak(self):
    pass

  # 정보 출력
  def repr(self):
    return f"age:{self.age} name: {self.name}"

# 메인 함수
kitty = Cat()
print(kitty.repr())
logger.log(kitty.repr())
# 원칙을 잘 지키지 않은 경우. 
# 한 메서드 당 여러가지 경우가 있다.
# 정보 출력 메소드와 그렇지 않은 메소드가 같은 행동을 하는 코드로 이루어져 있다. 

class Cat: # 고양이 클래스
  # 생성자
  def __init__(self, age, name) :
    self.age = age
    self.name = name

  # 고양이의 행동 -> 먹기, 단순한 구조를 알기 위해서 구체적 코드는 생략.
  def eat(self, food):
    pass # 해당 오버라이드를 통해 메소드를 재설정 할 수 있다. 

  # 고양이의 행동 -> 걷기
  def walk(self):
    pass

  # 고양이의 발성 -> 말하기
  def speak(self):
    pass

  # 정보 출력
  def print(self):
    return f"age:{self.age} name: {self.name}"

  # 로그 출력
  def log(self, logger):
    logger.log(f"age:{self.age} name: {self.name}")
    logger.log(datetime.now())

마지막으로 하나의 예시를 더 들어보자.

# 전등의 스위치에 관련된 클래스
# 원칙을 잘 따른 경우
# 복잡해진다.

class LightSwitch:
  # 생성자
  def __init__(self):
    self.light_on = False # 전등이 꺼져 있다는 것을 의미

  def turn_on(self): # 전등을 켜는 메소드
    self.light_on = True
    print("Light turned on")

  def turn_off(self): # 전등을 끄는 메소드
    self.light_on = False
    print("Light turned on")

class Logger: # 상태를 출력
   def log(self, message):
    print(f"Logging: {message}")

# 예시의 사용
switch = LightSwitch()
switch.turn_on()
switch.turn_off()

logger = Logger()
logger.log("Light switch action prformed.")
# 전등의 스위치에 관련된 클래스
# 원칙을 잘 따르지 않은 경우

class LightSwitch:
  # 생성자
  def __init__(self):
    self.light_on = False # 전등이 꺼져 있다는 것을 의미

  def turn_on(self): # 전등을 켜는 메소드
    self.light_on = True
    print("Light turned on")
    self.log("Light turned on,")

  def turn_off(self): # 전등을 끄는 메소드
    self.light_on = False
    print("Light turned on")
    self.log("Light turned off")

  def log(self, message):
    print(f"Logging: {message}")

# 예시의 사용
switch = LightSwitch()
switch.turn_on()
switch.turn_off()

profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글