Один из способов написания более чистого кода (на мой взгляд) - это обернуть информационный словарь внутри класса.
Вот мой простой пример кода:
# These assignment are arbitrary,
# but my calculate() method is more complex
def calculate(a, b, logger):
logger.log("a", a)
logger.log("b", b)
c = 2*a+b
d = a-b
logger.log("c", c)
logger.log("d", d)
if c > d+10:
logger.log("switch", "entered c")
g = another_calc(a, c)
else:
logger.log("switch", "entered d")
g = another_calc(a, d)
return c, d, g
def another_calc(a, c_d, logger):
e = a+c_d
f = a*c_d
g = e+f
logger.log("e", e)
logger.log("f", f)
logger.log("g", g)
return g
class Logger(object):
data = []
def log(self, key, value):
self.data.append({key: value})
def getLog(self):
return self.data
logger = Logger()
print(calculate(4, 7, logger))
print(logger.getLog())
Плюсы и минусы
Я использую отдельный класс логгера, потому что тогда мне не нужно знать, как реализован логгер.В этом примере это просто словарь, но при необходимости вы можете просто изменить реализацию создания нового регистратора.
Кроме того, у вас есть способ выбрать способ печати данных или выбрать вывод.Возможно, у вас может быть интерфейс для Logger.
Я использовал словарь, потому что выглядело так, как будто вам просто нужны пары ключ-значение.
Теперь, используя регистратор, нам нужно изменить сигнатуру метода,Конечно, вы можете определить значение по умолчанию как None, например.Тогда значение None следует проверять постоянно, но именно поэтому я не определил значение по умолчанию.Если вы владеете кодом и можете изменить каждую ссылку для метода calculate()
, тогда это не должно быть проблемой.
Есть еще одна интересная вещь, которая может быть важна позже.Когда вы отладили свой вывод и вам больше не нужно ничего регистрировать, тогда вы можете просто реализовать Нулевой объект .Используя Null object
, вы можете просто удалить все записи, не меняя код снова.
Я пытался придумать, как использовать декоратор, но сейчас нашел какой-то хороший способ.Если только выходные данные должны быть зарегистрированы, то декоратор может работать.