Найти - Пользователи
Полная версия: Как подружить SRP и OCP?
Начало » Python для новичков » Как подружить SRP и OCP?
1
zlodiak
Пытаюсь написать пример, который будет соответствовать принципам единой ответственности и открытости/закрытости. вот неправильный пример:

 #!/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 решение.
FishHook
zlodiak
Посмотрите как собственно реализован модуль logging в питоне и вопросы отпадут. Способ логгирования задается на уровне конфига, а не хардкодится в классе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB