代码之家  ›  专栏  ›  技术社区  ›  Phillip Wells

接口隔离原则背后的原因是什么?

  •  24
  • Phillip Wells  · 技术社区  · 16 年前

    7 回复  |  直到 7 年前
        1
  •  34
  •   aku    16 年前

    ISP声明:

    不应强迫客户依赖

    ISP与重要特性有关- cohesion coupling .
    理想情况下,您的组件必须高度定制。它提高了代码的健壮性和可维护性。

    • 高的
    • 低的 耦合 -更好的可维护性,高抗更改性

    如果您想了解更多关于软件设计原则的信息,请获取一份副本 属于 Agile Software Development, Principles, Patterns, and Practices

        2
  •  10
  •   T.S.    11 年前

    Struts可以被认为是专家们提出的一组最佳实践和建议(也就是说它们已经被证明),以便为我们设计应用程序提供可靠的基础。这些实践力求使我们的应用程序更易于维护、扩展、调整和扩展。

    我为什么要关心SOLID编程?

    首先,你必须意识到你不会永远停留在你现在的位置。如果我们使用标准和众所周知的体系结构,我们可以确信我们的代码将很容易被我们之后的其他开发人员维护,而且我确信您不会想处理修复一个没有应用任何已知方法的代码的任务,因为这将很难理解。

    界面分离原则。

    知道我们知道什么是坚实的原则,我们可以更详细地了解接口隔离原则,但接口隔离到底说了什么?

    不应强制客户机实现不必要的方法 他们不会使用

    这意味着,有时我们倾向于使用许多方法制作接口,这些方法在一定程度上是好的,但这很容易被滥用,最终我们可能会得到实现空方法或无用方法的类,这当然会给我们的应用程序增加额外的代码和负担。 假设您在单个接口中声明了许多方法,如果您喜欢visual aids,那么一个正在实现接口但实际上需要几个方法的类将如下所示:

    enter image description here

    另一方面,如果您正确地应用接口隔离并将接口拆分为更小的子集,您可以确保实现那些只需要的:

    enter image description here

    看见这样更好!实施这一原则将使您具有低耦合,这有助于更好的可维护性和高抗更改性。因此,您可以真正利用接口的使用,并在真正应该的时候实现方法。 现在让我们回顾一个不那么抽象的示例,比如您声明了一个名为Reportable的接口

    public interface Reportable {
    
            void printPDF();
            void printWord();
            void printExcel();
            void printPPT();
            void printHTML();
    
    
    }
    

    如果您有一个客户端,它只需要以Excel格式导出一些数据,您可以实现该接口,但您只需要实现Excel方法吗?答案是否定的,即使您不打算使用这些方法,您也必须为所有方法的实现编写代码,这可能会导致大量垃圾代码,从而使代码难以维护。。

    记住保持简单,不要重复你自己,你会发现你已经在不知不觉中使用了这个原则。

        3
  •  5
  •   Bill the Lizard    16 年前

        4
  •  4
  •   Mark Cidade    16 年前

    一个原因是,拥有多个接口,每个接口的方法数量最少,这使得实现每个接口和正确实现它们更容易。大型接口可能难以控制。此外,在场景中使用聚焦接口使代码更易于维护,因为您可以看到对象的哪个方面正在被使用(例如,IComparable接口让您知道对象仅用于给定场景中的比较)。

        5
  •  3
  •   ChrisF    11 年前

    这一原则主要有两个目的

    • 促进类的单一责任(高内聚性)。当然,为什么一个类应该有一个没有行为影响的方法呢?为什么不干脆把它拿走呢。这就是ISP的意义所在

    设计师必须向ISP提出一些问题

    • 如何分析已存在的任何ISP违规代码

    为了进一步讨论这个问题,我还必须补充一点,这个原则在严格意义上并不是一个“原则”,因为在某些情况下,将ISP应用到设计中,而不是提高可读性,可能会使对象结构不可读,并被不必要的代码弄乱。 您可以在java.awt.event包中观察到这一点

    更多信息请访问我的博客: http://design-principle-pattern.blogspot.in/2013/12/interface-segregation-principle.html

        6
  •  3
  •   Community CDub    4 年前

    ISP 这很重要。

    ISP的基本思想:客户端不应该被迫依赖于它不使用的方法。

    这一原则似乎更符合逻辑。理想情况下,客户端不应该实现客户端未使用的方法。

    有关代码示例,请参阅以下SE问题:

    Interface Segregation Principle- Program to an interface

    优势:

    1. 使用ISP,您可以将通用FAT接口划分为细粒度的小接口。如果小粒度接口发生变化,则只有实现该接口的类才会受到影响。

    2. 可维护性和易用性 :由于更改仅限于细粒度接口而不是通用事实接口,因此代码维护更容易。不相关的代码不再是实现类的一部分。

        7
  •  2
  •   Scott Hannen    3 年前

    Robert Martin's paper 关于该主题,给出了一个较少提及的解释:

    客户端对接口施加的反向力。

    如果两个类直接依赖于第三个类的两个不同方法,则前两个类中的任何一个的更改都会影响另一个类。

    假设我们有三个类: Red , Green Blue

    红色 绿色 蓝色 取决于一种方法 蓝色 但不使用其他方法。同样地 绿色 蓝色

    违反这一原则的行为正在发生 绿色 因为每个都取决于一个类- -但是

    这可能会造成什么问题?

    • 我需要换衣服 ,我也改变了 满足 红色 .
    • 我没有改变具体的方法 蓝色 那个 绿色 绿色 取决于 蓝色 蓝色 ,这仍然会影响 .
    • 红色 有可能影响 因为他们让我改变了一个我们都依赖的班级。

    这就是“向后的力量”。我们有时会因为客户的需要而改变一个类。如果该类有不同的客户端将其用于不同的事情,我们就有可能影响它们。

    如上所述,接口隔离原则的简单定义为:

    任何客户端都不应被迫依赖于它不使用的方法。

    在这一点和罗伯特·马丁论文中的上述观点之间,很明显,对ISP的许多解释实际上是在谈论其他原则。

    • 具有大量方法的类或接口是不可取的,但这并不是因为ISP。他们可能违反单一责任。但是ISP违规不在大接口或大类中,而是在 依靠 在大界面上,如果他们不使用它的所有方法。如果他们使用所有的方法,听起来仍然很混乱,但这与ISP无关。
    • 实现接口但对某些方法抛出异常的类是不好的,但这也不是ISP。ISP是关于 依赖 在接口上,而不是在 使生效

    如果我们在谷歌上搜索“接口隔离”,那么大多数包含代码示例的顶级结果都显示了 接口,这不是ISP的重点。有些人甚至错误地重申了这一原则:

    接口隔离原则规定,不应强制客户机实现他们不使用的接口

    …但那是 原则。定义文件提到了违反ISP的副作用,但指出它们是违反Liskov替换的。

    此外,每次向基类添加新接口时,该接口必须 在派生类中实现(或允许默认)。实际上,一个相关的实践是将这些接口作为nil虚拟函数而不是纯虚拟函数添加到基类中;具体来说,这样派生类就不需要实现它们。正如我们在本专栏的第二篇文章中了解到的,这种做法

    更重要的是,说客户机不应该实现它不使用的方法是没有意义的。这个 一个接口的成员不实现他们使用或不使用的方法-他们使用它的方法。客户 List<E> 使生效 方法与性质 . 信息技术 电话 .

    我并不想夸大其词地引用这份报纸,好像它是一份神圣的令状或什么的。但是,如果我们要使用文章中所描述的原则(文章本身的名称),那么我们也应该考虑文章中所包含的实际定义和解释。