Уведомления

Группа в Telegram: @pythonsu

#1 Март 17, 2019 10:31:38

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

Как подружить SRP и OCP?

Пытаюсь написать пример, который будет соответствовать принципам единой ответственности и открытости/закрытости. вот неправильный пример:

 #!/usr/bin/env python3
class Product:
    def __init__(self, title):
        self.title = title
    def setPrice(self, price):
        try:
            if price <= 0: raise Exception('wrong price!')
            self.price = price
        except Exception as e:
            print('error: ', e)
product = Product('phone')
product.setPrice(-10)

Вот пример получше, но тоже неправильный:

 #!/usr/bin/env python3
class Product:
    def __init__(self, title, logger):
        self.title = title
        self.logger = logger
    def setPrice(self, price):
        try:
            if price <= 0: raise Exception('wrong price!')
            self.price = price
        except Exception as e:
            self.logger.fillLog(e)
class Logger:
    def __init__(self):
        self.log = []
    def makeLog(self, message):
        print('error: ', message)
    def fillLog(self, message):
        self.log.append(message)
logger = Logger()
product = Product('phone', logger)
product.setPrice(-10)

LIVE DEMO

во втором примере меня больше всего беспокоит несоответствие принципу открытости/закрытости. как видите, логгер имеет два способа логирования, но чтобы из переключать всё равно приходится править метод setPrice класса Product. то есть здесь явное несоотвтетсвие принципу открытости/закрытости.

помогите пожалуйста найти приемлемое для SRP и OCP решение.

Отредактировано zlodiak (Март 17, 2019 10:32:09)

Офлайн

#2 Март 17, 2019 10:40:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Как подружить SRP и OCP?

zlodiak
Посмотрите как собственно реализован модуль logging в питоне и вопросы отпадут. Способ логгирования задается на уровне конфига, а не хардкодится в классе.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version