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
Oop 每个公共方法都包含在一个接口中,这是一个好的实践吗?_Oop_Design Patterns_Coding Style_Solid Principles - Fatal编程技术网

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()
    放在另一个类中)
让接口没有覆盖的方法感觉像是代码的味道。或者我是不现实的?

< P>我认为它是“过度使用”界面。

接口只能让您访问有限的功能,因此它有助于将更多具有类似功能的类收集到一个
列表中并使用它们,例如

或者,如果您想保持松散耦合原则,您宁愿给另一个组件一些接口,而不是整个类

另外,一些类应该限制对其他类的访问,这也可以通过接口实现


然而,如果两个类彼此“强”连接并且应该“强”连接,那么高内聚性原则(通常连接到松耦合)并不会阻止您使用类本身。

我认为接口的目的不在于此。如果您实际上讨论了类之间的“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。如果类对接口定义的行为做了额外的事情,那么类似乎做得太多了。如果两个类具有高内聚性,那么它们可能不需要使用接口是有道理的,但这仍然会降低可测试性。如果类需要这些方法,我更感兴趣的是创建新接口