Oop 每个公共方法都包含在一个接口中,这是一个好的实践吗?
由接口定义类的实现是一个很好的实践。如果一个类有任何接口未覆盖的公共方法,那么它们就有可能泄漏其实现 例如,如果类Oop 每个公共方法都包含在一个接口中,这是一个好的实践吗?,oop,design-patterns,coding-style,solid-principles,Oop,Design Patterns,Coding Style,Solid Principles,由接口定义类的实现是一个很好的实践。如果一个类有任何接口未覆盖的公共方法,那么它们就有可能泄漏其实现 例如,如果类Foo具有方法bar()和baz(),但接口仅涵盖bar(),则baz()的任何使用都不使用接口 感觉得到更干净的代码是有意义的: 如果类必须具有这些方法,则创建额外的接口(例如,一个单独的接口来覆盖上面的baz()的行为) 或者理想情况下重构(例如使用更多的组合),这样类就不需要有那么多方法(将baz()放在另一个类中) 让接口没有覆盖的方法感觉像是代码的味道。或者我是不现实的
Foo
具有方法bar()
和baz()
,但接口仅涵盖bar()
,则baz()
的任何使用都不使用接口
感觉得到更干净的代码是有意义的:
- 如果类必须具有这些方法,则创建额外的接口(例如,一个单独的接口来覆盖上面的
的行为)baz()
- 或者理想情况下重构(例如使用更多的组合),这样类就不需要有那么多方法(将
放在另一个类中)baz()
列表中并使用它们,例如
或者,如果您想保持松散耦合原则,您宁愿给另一个组件一些接口,而不是整个类
另外,一些类应该限制对其他类的访问,这也可以通过接口实现
然而,如果两个类彼此“强”连接并且应该“强”连接,那么高内聚性原则(通常连接到松耦合)并不会阻止您使用类本身。我认为接口的目的不在于此。如果您实际上讨论了类之间的“is-a”和“has-a”关系,那么类不一定需要涵盖接口中的所有公共方法。这就像是把概念看得太远了
一个类可以有描述其行为的方法,但是,有些方法并不确切地描述类的行为,而是描述类还可以做什么
如果出现关于SRP的关于“可以做”行为的问题,那么类可能会使用组件来执行这些行为,而不是在自己内部实现
例如,我有一个DataGrid类,为什么我需要一个名为IDataGrid的接口来公开所有公共方法。但是可能还有一个附加的功能DataGrid可以做,那就是导出数据。在这种情况下,我可以让它实现IExportData,并实现ExportData方法,该方法不导出数据,而是使用一个组件,比如说DataExportHelper,来实际执行任务。
DataGrid只将数据传递给组件
我认为在上述示例中不会违反SRP
编辑:
我是一名.Net开发人员,所以我想给您介绍MS library类中的示例。例如,该类不实现任何具有Close()方法的接口。我不明白为什么它应该成为任何演讲者的一部分
此外,可能有些东西看起来像是代码气味,但不一定是错误的。代码气味本身并不意味着有问题,而是存在问题的可能性。
我在软件设计中从未遇到过任何原则或指南,其中提到类的所有公共成员都需要在某些或其他接口中公开。可能是因为它可能是一个糟糕的设计。 < P>不,我绝对不会考虑一个接口没有覆盖代码的方法。p>
这似乎取决于您正在构建的对象基础设施,但在我熟悉的基础设施中,接口的真正意义在于提供一种可管理的多重继承形式。我认为多重遗传的过度使用是一种显著的气味。
至少在.NET中,抽象类是公开抽象(而不是接口)的首选构造。NET设计指南说:确实倾向于定义类而不是接口。,其基本原理如下所述
即使在COM中(任何外部可见的功能都必须在接口中定义),也有充分的理由使用非公开的功能:限制实现细节的可见性。COM最初是用C(而不是C++)定义的,C缺乏较新语言更丰富的访问修饰符集,但概念就在这里:发布的接口成员是公共的,其他所有内容都是内部的 您的问题看起来几乎与此类似:您所说的“泄漏其实现”到底是什么意思?如果一种方法被宣布为公共的,其基本原理是让全世界都知道它。如果不想公开该方法,则应使用不同的可见性修改器。但我可能误解了让每个公共方法都包含在接口中的好处。@NilsGöde-有一个好处-整个类完全可以与实现相同接口的另一个类交换。然而,若接口包含所有具体类的方法,那个么这是不可能的。一个如此大的接口,以至于创建一个实现它的具体类是困难的,这肯定是一种代码味道。接口应该是好的和小的。@libik:我认为这个问题假设可以有多个包含公共方法的接口。这个接口应该给你有限的访问权限,但是这个类不应该违反SRP。如果类对接口定义的行为做了额外的事情,那么类似乎做得太多了。如果两个类具有高内聚性,那么它们可能不需要使用接口是有道理的,但这仍然会降低可测试性。如果类需要这些方法,我更感兴趣的是创建新接口