循环依赖,好或坏


Circular dependency, fine or bad?

我正在制作一些个人框架,用于教育和实用目的,并且遇到了一个设计问题,我想分享。

我有一个Component命名空间,它包含各种类,嗯,组件(即可重用的ViewModels位)。其中之一是Component'Form,一个用于从模型构建表单模板的生成器类。一段时间后,我意识到需要一些Validation服务类,这将执行非模型特定的验证,如检查验证码。

问题是,我的默认表单验证会累积错误消息并将它们显示在一个地方。因此,为了实现这一点,我的Validator类需要访问Form, Form类通过setter注入添加Validator类。

因此,这创建了循环依赖。一方面,Form依赖于Validator类(虽然是可选的),另一方面,我必须将Form类注入到我添加的每个Validator中。我想知道,从OOP设计的角度来看,这种方法是否可行,如果不行,可能会产生什么问题,以及我如何解决它。

我很抱歉我没有提供任何相关的代码,我认为这将需要太多的空间是可读的,但如果有必要,我很乐意张贴任何东西来澄清问题的具体时刻。

我认为验证器不应该依赖于表单,因为它不应该显示错误。表单可以要求验证器根据某些规则检查一些原始输入。如果验证失败,验证器可能会返回错误代码或消息,表单可以根据这些代码或消息显示错误。显示错误不是验证器的工作。

我会说你错过了某种mvc。我会保持验证器依赖于表单,因为它必须访问所有数据和传递原始值将是繁琐和复杂的(比较两个密码,验证码,检查一个字段是否长于5,只有当另一个字段短于3)。但我不会使表单依赖于验证器。因为表单不知道它是否需要验证。有时您需要触发验证器A和B,有时需要触发验证器B和c,而表单不具备做出该决定的知识。这是控制器的工作。我会添加一些类型的ValidationGroup/ValidatorHandler等引用表单和(一组)验证器。然后控制器将触发正确的验证器组