4

在我的项目中,我有一组通过调用外部命令来完成某些工作并返回结果的类。我们称它们为“报告”。

我想将日志记录添加到这些报告中,但是,将在运行时而不是在定义类时定义具体的记录器对象。

所以,现在我看到了两个如何实现日志记录的变体:

I. 在运行时,实例化一些ReportLogger类实例,它可以使用给定的具体记录器对所有给定的报告实例进行猴子修补,并具有日志记录功能。

优点:

  • 可以将日志记录应用到我真正需要的任何子报表类,而不涉及其他类。

缺点:

  • 魔法!猴子修补不是明确的做事方式。
  • 日志记录实际上是在运行时应用的,因此在查看报告类代码时很难理解是否存在一些日志记录。

二、单例ReportLogger类,在创建时通过装饰器包装所有报告,但在运行时接受具体记录器。

优点:

  • 明确和干净的方式来标记这些报告需要记录(以及实际应用它)。

缺点:

  • 处理从基本类继承的子类更难Report。例如,如果在基Report类中,某些方法(如collect_data()用 装饰@log_collect_data),那么对于子类,日志记录将与collect_data(). 或者,也许,我必须将实际代码从 to 拆分collect_data(),例如,_collect_data()在子类中修改它,调用_collect_data()from collect_data(),然后collect_data()@log_collect_data.

我喜欢第二种方法,但我想要更好的方法来处理子类,而不是使用 _collect_data()。欢迎任何建议!

4

0 回答 0