Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 使用记录器的最有凝聚力的位置是什么?_Design Patterns_Cohesion_Grasp - Fatal编程技术网

Design patterns 使用记录器的最有凝聚力的位置是什么?

Design patterns 使用记录器的最有凝聚力的位置是什么?,design-patterns,cohesion,grasp,Design Patterns,Cohesion,Grasp,我使用Java编写了一个任务管理器程序,并在swing中实现了一个UI。该程序目前有3层。通过用例控制器与域层交互的表示层,最后是用于持久性的技术服务层。此时,用户可以执行多个操作,例如添加任务、编辑任务状态等。。。在这个方案中,我的记录器的目的是跟踪用户采取的所有操作。因此,有几个地方我可以调用记录器来编写命令。我不会在表示层中做任何日志记录,因为这将是一个糟糕的设计决策,因此我只剩下控制器、命令接口(实现来处理所有命令的执行,以实现撤销/重做功能)或实际被操作的低级类,比如说任务类 我认为控

我使用Java编写了一个任务管理器程序,并在swing中实现了一个UI。该程序目前有3层。通过用例控制器与域层交互的表示层,最后是用于持久性的技术服务层。此时,用户可以执行多个操作,例如添加任务、编辑任务状态等。。。在这个方案中,我的记录器的目的是跟踪用户采取的所有操作。因此,有几个地方我可以调用记录器来编写命令。我不会在表示层中做任何日志记录,因为这将是一个糟糕的设计决策,因此我只剩下控制器、命令接口(实现来处理所有命令的执行,以实现撤销/重做功能)或实际被操作的低级类,比如说任务类

我认为控制器是一个相对合适的选择,因为它充当UI层和域之间的接触点,因此所有值得注意的命令最终都会通过控制器,从而很容易验证是否记录了所有重要方法。不在控制器中执行此操作的原因是,它将降低内聚性,增加耦合,并可能导致控制器膨胀

具体的命令是另一个可能的位置,因为它们也具有日志记录所需的所有信息。这将再次导致命令的内聚性降低,并增加耦合。此外,如果我不使用命令界面对域对象执行操作,那么我将丢失日志记录

最后,这将引导我在较低级别的域对象方法中实现记录器。这是一个很好的备选方案,因为如果程序正在使用并且所需的所有信息都可用,那么日志记录总是会发生的。唯一的负面影响是,记录器命令将分散在较低级别的域对象中,这使得更难确保记录所有正确的方法


我希望能就这类决策展开辩论,并感谢您的所有评论。

首先考虑实用性。日志记录通常是一个维护和管理问题。设计中的每一层都是日志记录的候选层,但原因有所不同

在不真正了解对象层次结构和设计的情况下


从域到UI,每一层都是前一层行为的抽象或集合。你必须问问自己,你在寻找什么样的粒度级别?查看命令的日志记录是否有用?查看每个相关域层调用的日志记录是否也有用?破译域调用并将其与特定命令关联可能并不总是容易的。

首先考虑实用性。日志记录通常是一个维护和管理问题。设计中的每一层都是日志记录的候选层,但原因有所不同

在不真正了解对象层次结构和设计的情况下


从域到UI,每一层都是前一层行为的抽象或集合。你必须问问自己,你在寻找什么样的粒度级别?查看命令的日志记录是否有用?查看每个相关域层调用的日志记录是否也有用?破译域调用并将其与特定命令关联可能并不总是那么容易。

好的,很公平。。。但我想特别记录在域层中操纵低级对象的操作。虽然说实话,你的剧本可能有点过头了。说得好。。。我想现在我所关心的只是在最低级别的域对象上调用命令的时间,而不是命令是否正确地传递了调用,或者是否在这些对象的级别之上进行了其他操作。您的推理似乎使我得出结论,在这种情况下,应该在最低级别的对象中使用记录器。谢谢你的推动,你帮我解除了分析的瘫痪:我们都去过那里;)干杯。我从未想到过这一点,但使用装饰图案可能是这里最合适的解决方案之一。我可以避免将我的记录器耦合到最低级别的域对象,而只是修饰稍微高一点的级别对象来操作较低级别的对象。链接到装饰图案:好的,很公平。。。但我想特别记录在域层中操纵低级对象的操作。虽然说实话,你的剧本可能有点过头了。说得好。。。我想现在我所关心的只是在最低级别的域对象上调用命令的时间,而不是命令是否正确地传递了调用,或者是否在这些对象的级别之上进行了其他操作。您的推理似乎使我得出结论,在这种情况下,应该在最低级别的对象中使用记录器。谢谢你的推动,你帮我解除了分析的瘫痪:我们都去过那里;)干杯。我从未想到过这一点,但使用装饰图案可能是这里最合适的解决方案之一。我可以避免将我的记录器耦合到最低级别的域对象,而只是修饰稍微高一点的级别对象来操作较低级别的对象。指向装饰图案的链接: