我已经使用Java编写了一个任务管理器程序,并且暂时实现了单个UI实现。该计划目前有3层。通过用例控制器与域层交互的表示层,最后是用于持久性的技术服务层。此时用户可以采取多种操作,例如添加任务,编辑任务状态等等......我的记录器在此方案中的目的是跟踪用户采取的所有操作。因此,有几个地方我可以调用记录器来编写命令。我不会在表示层中进行任何记录,因为这将是一个糟糕的设计决策,所以我留下了控制器,命令接口(实现为处理所有命令的执行以实现撤消/重做功能) ),或者在实际被操作的较低级别的类中,比如说任务类。
我认为控制器是一个相对不错的选择,因为它充当UI层和域之间的接触点,因此所有值得注意的命令最终通过控制器,使得易于验证所有重要方法正在登录。不在控制器中执行此操作的原因是它会降低内聚力,增加耦合并可能导致控制器膨胀。
具体命令是另一个潜在的位置,因为它们也具有记录所需的所有信息。这将再次导致命令变得不那么紧密并增加耦合。此外,如果我不使用命令界面对域对象执行操作,则会丢失我的日志记录。
最后,这使我在低级域对象方法中实现了记录器。这是一个很好的选择,因为如果正在使用程序并且所需的所有信息都可用,则始终会发生日志记录。唯一不利的一点是,记录器命令将稀疏地分散在较低级别的域对象中,这使得更难确保记录所有正确的方法。
我很乐意就此类决定进行辩论,并感谢您的所有评论。
答案 0 :(得分:1)
首先考虑实用性。记录通常是维护和维护。行政关注。您的设计中的每一层都是日志记录的候选者,但原因有所不同。
没有真正了解您的对象层次结构和设计......
从域到UI,每个层都是前一层的抽象或行为集合。你必须问问自己,你在寻找什么样的粒度?查看命令的记录是否有用?查看每个关联的域层调用的日志记录是否也有用?解密域调用并将其与特定命令相关联可能并不总是容易的。