04-03.eri-test Piyush谈论SOLID原则

Just making sure

这必须是您在面试中会听到的常见问题之一。 但是显然您只有5分钟的时间证明您知道这一点。

我在这里的目的是确保您拥有这个!
固体是面向对象编程世界中最重要的缩写之一。

Why should you care about 固体 programming?
首先,您必须意识到自己永远不会永远存在。 如果我们使用标准和著名的体系结构,我们可以确保我们的代码将易于跟随我们的其他开发人员进行维护,并且我确定您将不想处理修复代码的任务。 没有应用任何已知的方法,因为很难理解它。

让我们跳进去。

一世 know you've been waiting

小号Ø大号一世d代表什么?
小号—单一责任原则。
Ø—开放封闭原则。
大号— Liskov替代原则。
I—接口隔离原理。
d—依赖倒置原则。

单一责任原则:

一个班级只有一个改变的理由。

顾名思义,该原则意味着一个类/模块只能做一件事情,只有一个责任。 如果我们的课程不仅仅要做一件事,那么我们应该将功能划分为不同的课程。
在单一责任原则(SRP)的背景下,我们将责任定义为“变革的原因”。 如果您想到换班的动机不止一个,那么该班就负有不止一个责任。

例。假设我们有一个电话具有不同的功能,如呼叫,消息传递,计算器,FlashLight等。现在,当我们定义此类时,我们将拥有一个电话.java文件,其中将包含所有功能。 现在,该类违反了SRP原则,因为该类已被分配了多个职责。 为了使类不再违反该原则,我们应该在单独的类(如Calling.java,Messaging.java,Calculator.java)中定义职责,从而使组件/类简短并划分职责。

Android specific 例。方法onBindViewHolder回收站视图小部件。 的作用onBindViewHolder是将列表项映射到视图。 这种方法应该没有逻辑。 因此,如果有任何与逻辑相关的代码,您可能应该从那里删除。

开闭原则:

软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改。

基本上,这意味着我们应该在实现因业务领域的不稳定而本质上不稳定的需求的类中添加扩展点,并重构代码部分,并在这些部分证明不稳定时引入其他扩展点。

特定于Android的示例。延伸回收站视图.Adapter类很简单,我们可以轻松创建自定义适配器。 开发人员可以轻松扩展此类并使用自定义行为创建自己的自定义适配器,而无需修改现有的RecyclerView.Adapter类。
另一个例子。 可以看纽扣开关选框从所有继承文字检视类。 这意味着文字检视对扩展程序开放,但对修改不开放。

里斯科夫替代原理:

程序中的对象应该可以用其子类型的实例替换,而无需更改该程序的行为。

This means that a subclass should override the methods from a parent class that does not break the functionality的parent类。

例。 In mathematics,a Square is a Rectangle. Indeed it is a specialization of a rectangle. The “is a” makes you want to model this with inheritance. However if in code you made Square derive from Rectangle,then a Square should be used anywhere you expect a Rectangle. This makes for some strange behavior. Imagine you had SetWidth和SetHeight methods on your Rectangle base class; this seems perfectly logical. However, if your Rectangle reference pointed to a Square, then SetWidth 和 SetHeight do not make sense because setting one would change the other to match it. In this case, Square fails the Liskov Substitution Test with Rectangle 和 the abstraction of having Square inherit from Rectangle is a bad one.

特定于Android的示例。我们应该以仍然可以与RecyclerView一起使用的方式编写自定义RecyclerView适配器类。 我们不应该写一些会导致RecyclerView异常的内容。

接口隔离原理:

实现接口的类不应被强制实现其不使用的方法。

这意味着,如果接口变得太胖,则应将其拆分为较小的接口,以使实现该接口的客户端不会实现对它无用的方法。
ISP与重要特性-凝聚力和耦合力有关。
理想情况下,您的组件必须高度定制。 它提高了代码的健壮性和可维护性。

实施ISP可为您带来以下好处:
高凝聚力-更好的易懂性,鲁棒性。
低耦合-更好的可维护性,高抗变化性。

例。 再次转到电话的上一个示例,如果我们具有用于整个功能的公共接口,例如:
Alt Text

现在,如果您想实现一个计算器,这些功能拨号(),点亮() and lightOff()没有用。 因此,我们应该将代码重构为如下形式:
Alt Text

现在,所需的类可以根据需要实现一个或多个接口。 这就是我们可以防止违反ISP的方式。

依赖倒置原则:

高级模块不应依赖于低级模块。 两者都应依赖抽象。

and

抽象不应依赖细节。 细节应取决于抽象。

如果在另一个类中使用一个类,则该类将取决于注入的类。 DIP的重要性可以归结为一个单一目标,即能够重用依赖于外部依赖性的软件组件来实现其部分功能。

例.如果我们有一个包含以下代码的Bank类,则Bank的调用类不会意识到隐藏的依赖关系,因此这违反了DIP。
Alt Text

另一方面,如果我们将代码重构为如下形式:
Alt Text

在这种情况下,我们让Bank的调用类知道所涉及的依赖关系,而不是让该类本身创建依赖关系。 这在测试的情况下也有帮助!

结论:
固体如果遵循面向对象设计,则原则是需要学习和实现的一些最重要的原则。 最初看起来似乎有些不知所措,但是随着实践和时间的推移,您将基于这些原理进行编码,甚至没有意识到。 (从StackOverflow:D复制)

Alt Text

请享用! 编码愉快!
如果有不清楚的地方或有疑问,请随时发表评论。

-Piyush Maheswari。

如果您想伸出手:推特

from: https://dev.to//piyush2769/piyush-talks-about-solid-principles-4h1m

发布了0 篇原创文章 · 获赞 0 · 访问量 124

猜你喜欢

转载自blog.csdn.net/cunbang3337/article/details/105558814
今日推荐