0

我们正在一个项目中工作,其中将有一个共享配置,需要由解决方案的多个部分访问。

负责 Config 模块的团队实现了一个只包含 2 个类的接口。2 个类,负责获取、缓存和提供特定值(通过属性)。

我觉得这是一个糟糕的设计,在我看来,最好定义一个可以通过接口访问的所有配置值,而不是实现这种行为的实际类。

在我看来,对于诸如获取配置值之类的事情,提供一个接口来显示我将能够访问哪些值而不是类(例如属性不受接口控制的实现)会更合乎逻辑。

-edit- 界面如下所示:

public interface IConfigurationResolver
{
    GeneralConfiguration GetGeneralConfiguration(string Id);
    SpecificConfiguration GetSpecificConfiguration(string Id);
}

它由一个类实现。我的意思是这个接口实际上只是定义了两个类,每个类都负责提供配置值,而我认为如果接口不关心这些细节并且应该自己提供配置值会更好

这些都是非常有经验的开发人员,而我不是,那么您对此有何立场?

4

3 回答 3

1

这里发生了很多事情……

接口中非抽象类的引用IConfigurationResolver是代码异味,违反了“程序到接口,而不是实现”的原则(“编程到接口”是什么意思?)。

您希望通过界面显式显示配置参数是一件好事,并且符合Intention Revealing Interface的概念(如 Eric Evans 的领域驱动设计中所讨论的)。

然而,如果你有很多配置值,这个接口最终可能会有很多方法。这就是你的领域知识的用武之地——将“配置的世界”分解为一组有凝聚力的接口,每个接口都用于配置应用程序的一个单独方面,这本身就是一项技能,并且与'我' 在SOLID中。Lowy 的Programming .NET components讨论了契约重构的问题,并作为粗略的指南建议每个接口使用 3-5 个方法。

我猜想“重构配置”的愿望是当前界面上两种方法存在的根源。

于 2013-05-20T13:59:36.220 回答
0

SOLID 原则之一是接口隔离原则“许多特定于客户端的接口优于一个通用接口。”</p>

http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

“仅包含 2 个类的接口”是什么意思?只有两个类实现了这个接口?

我觉得这是一个糟糕的设计,在我看来,最好定义一个可以通过接口访问的所有配置值,而不是实现这种行为的实际类。

不确定我是否理解您的问题 - 是的,您应该引用界面而不是直接引用类?

于 2013-05-20T11:31:27.817 回答
0

我认为这种方法没有任何问题。一个面向对象的原则是隐藏。只要用私有方法或子类隐藏类的内部结构,就根本不需要使用任何接口。

只要您想为单一行为(如 Bean Validation API)提供多个实现,或者如果您想限制应该对类的不同用户可用的方法,接口就很有意义。

于 2013-05-20T11:36:24.337 回答