我正在使用Zend Framework,并尝试采用DDD方法(域驱动设计)。我有域对象的模型,映射器和DbTable。
在很多情况下,我需要获取同一时间的多个实体,例如系统内所有用户的列表 - 所以我的用户模型将有一个方法'getAllUsers',它将返回所有用户(现在它返回所有用户的数组,但我正在考虑制作一个集合类)。到目前为止,我使用普通方法(非静态)来获取集合,为此,我需要创建一个“空”对象。另一种选择是将其转换为静态方法。
我不确定,哪种方法更好,保留非静态方法或将它们转换为静态方法。什么是更好的方法/实践,为什么?还有哪种方法严格遵循DDD方法。
PS:如果你能想到一个更好的头衔,请告诉我。不,这不是课程问题。答案 0 :(得分:1)
首先,我认为这不是与DDD相关的问题。使用或不使用静态方法更像是OOP或设计问题。
基本上使用类静态方法实际上不是OOP而是程序编程,因为您不能使用任何OOP范例,如封装或继承。它指出了可能的设计缺陷/代码气味。
它还使单元测试变得困难,因为mocking of static方法更复杂,并且添加了AFAIK只是为了允许通过单元测试覆盖遗留代码。
如果发布了一些代码示例,那么回答你的问题会更容易。
答案 1 :(得分:0)
在域驱动设计中,应将持久的用户集合表示为UserRepository
接口。该接口的具体实现具有状态,包括例如数据库连接的状态。因此,您需要一个存储库实现的实例,其方法将是实例方法而不是静态方法。
答案 2 :(得分:0)
静态方法意味着不需要实例化对象来调用它。通常,静态方法用于对与整个类相关的方法进行分组,而不仅仅是特定的类实例。相反,非静态方法用于对与特定单个对象相关的方法进行分组。
因此,如果您将getAllUsers()标记为非静态并将其置于用户下方,那么基本上您要求某个特定用户了解其他所有用户。使用类比 - 这就像从一个公民那里询问有关全国所有公民的完整信息一样(你们在你们国家都知道吗?)。
将其标记为静态就像是要求citizen definition in encyclopedia中有关所有公民的信息。它比将它标记为非静态更好,但仍然有点奇怪和尴尬。
通常,国家/地区的人口登记册负责处理有关公民的信息。转换类比 - 你会有“别的东西”,类似集合的寄存器负责这个。