- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试理解和应用 SOLID 原则。关于依赖倒置原则,这是否意味着禁止对对象进行组合/聚合?因此必须始终使用接口(interface)来访问另一个类方法?
我的意思是:
class ServiceClass {
void serviceClasshelper();
}
class MainClass {
void MainClass(ServiceClass service); // To use serviceClasshelper
}
必须改为:
class ServiceInterface {
virtual void interfaceHelper() =0;
}
class ServiceClass : public ServiceInterface {
void serviceClasshelper();
void interfaceHelper() { serviceClasshelper(); };
}
class MainClass {
void MainClass(ServiceInterface service); // Uses interfaceHelper
}
我认为(或者至少我希望)我理解这个原理。但是想知道是否可以这样改写。事实上,我读到的有关 DIP 的文章建议使用接口(interface)。
谢谢!
最佳答案
基本上,DIP 的主要思想是:
- High-level modules should not depend on low-level modules. Both should depend on abstractions.
- Abstractions should not depend on details. Details should depend on abstractions.
如您所见,它说的是应该而不是必须。它不禁止你做任何事情。
如果您的类组合/聚合到
其他特定的类
(不是接口(interface)/抽象类
),那很好!您的代码仍会编译和运行,不会显示任何警告告诉您:“嘿,您违反了 DIP”。所以我认为您的问题的答案是:不,不是。
假设您的系统由一千个类组成,您可以只将 DIP 应用于 2 个类,并让其中一个依赖于第三个特定类(不是接口(interface)/抽象类
)。只要你的问题解决了,什么都不重要。因此,请尽量使您的解决方案简短明了 -> 易于理解。相信我,当您在 1 个月后回顾您的解决方案时,您会发现它很有值(value)。
DIP 是一个指南,它告诉您在遇到一组特定问题时该怎么做才能解决这些问题。这不是一个神奇的指南,它是有代价的:复杂性。您应用 DIP 的次数越多,您的系统就会越复杂。所以明智地使用它。为了进一步支持这一点,我建议您查看此引用资料(摘自 Head First: Design Patterns
一书)。访问此 link (它是一个 PDF 文件)并在顶部栏导航到页面 635/681
。或者,如果您足够懒惰,只需阅读以下引述:
Your Mind on Patterns
The Beginner uses patterns everywhere. This is good: the beginner gets lots of experience with and practice using patterns. The beginner also thinks, “The more patterns I use, the better the design.” The beginner will learn this is not so, that all designs should be as simple as possible. Complexity and patterns should only be used where they are needed for practical extensibility.
As learning progresses, the Intermediate mind starts to see where patterns are needed and where they aren’t. The intermediate mind still tries to fit too many square patterns into round holes, but also begins to see that patterns can be adapted to fit situations where the canonical pattern doesn’t fit.
The Zen mind is able to see patterns where they fit naturally. The Zen mind is not obsessed with using patterns; rather it looks for simple solutions that best solve the problem. The Zen mind thinks in terms of the object principles and their trade-offs. When a need for a pattern naturally arises, the Zen mind applies it knowing well that it may require adaptation. The Zen mind also sees relationships to similar patterns and understands the subtleties of differences in the intent of related patterns. The Zen mind is also a Beginner mind — it doesn’t let all that pattern knowledge overly influence design decisions.
最后,我将向您介绍一个使用 DIP 的四人组设计模式:Strategy
示例问题:一个角色
可以使用3种武器:手
、剑
和枪
。他(角色
)可以随时更换他当前的武器。
分析:这是一个很典型的问题。棘手的部分是如何在运行时处理武器交换。
候选解决方案与策略:(只是草图):
weapon = new Hand();
weapon.Attack(); // Implementation of Hand class
weapon = new Sword();
weapon.Attack(); // Implementation of Sword class
weapon = new Gun();
weapon.Attack(); // Implementation of Gun class
其他使用 DIP 的设计模式和框架:
关于c++ - 固体 : Does DIP mean that composition/aggreation to an object is forbidden?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40573392/
将常规像素转换为 DIP 的公式是什么? 假设我有一个 photoshop 文件,里面有一个设计用于 Galaxy Tab(例如),实际像素为 600x1024。 这些与 DIP 之间的比率是多少?我
本文实例讲述了PHP面向对象五大原则之依赖倒置原则(DIP)。分享给大家供大家参考,具体如下: 什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于下
我已经读过很多次了,CN.convertToPixels (float dipCount) 等方法中使用了 dipCount 参数。指的数量物理毫米 转换为像素,具体取决于屏幕的密度。 然而,java
我正在尝试制作dip::EuclideanSkeleton。但是,在执行时,它引发了一个未处理的异常。返回类型和传递给函数的类型是否不匹配?如果是这样,我该如何解决?我没有更多的猜测了。如果没有dip
我是 Android 开发的新手,我正在努力使我的应用程序适应各种分辨率。我最近听说了 dip 的概念,但我不明白这个单元的目的。我知道无论屏幕分辨率如何,它都允许显示具有相同物理尺寸的内容。 但问题
如果在布局 xml 文件中,我将大小设置为,例如 12dip。在 mdpi 中总是 12px 而在 hdpi 中总是 18px 吗? 那么对于 mdpi 来说 dip 总是正确的并且对于其他密度会相应
我可以在 android 上使用显示独立像素的 DrawBitmap 吗? 如果没有,是否有合适的替代方案? 谢谢。 最佳答案 您是否正在寻找如何将像素更改为倾斜?那么你可以使用下面的代码 int p
我如何指定一个 int 参数在 dip 中?具体来说,如何写相当于: android:layout_width="50dip" android:layout_height="50dip" 类似...:
计量单位之间有什么区别px、dip、dp、sp? 最佳答案 来自 Android Developer Documentation : px Pixels - corresponds to actual
我最近在 Robert.C.Martin 的优秀著作《C# 中的敏捷原则、模式和实践》中读到了依赖倒置原则。然而,我觉得我不完全理解这个原则的一个方面。 Robert 解释说,当高层模块依赖于低层模块
这个问题在这里已经有了答案: What is the difference between px, dip, dp, and sp? (32 个答案) 关闭 9 年前。 我目前正在使用以下 Imag
既然 dip 代表“设备独立像素”,那么是否有适用于每个 android 设备的标准 dip 数量? 示例:如果 hdpi 设备具有 X dp/width 和 Y dp/height,那么 ldpi
我想问一下 Genotypes 和 Individual 类的实现是否违反了依赖倒置原则?如果是,如何解决? 代码如下: public interface IGenotype { //some
IoC = 控制反转 DIP = 依赖倒置原则(S.O.L.I.D. 中的 D) IoC == DIP?我认为是的,是真的。 构建软件的世界已经这么乱了,为什么要说同样的话那么多话? (我知道DI(依
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我在看 dp, dip, px, sp measurements ,但我仍然有一些关于 dp/dpi vs ppi vs px vs inch 的问题。我无法比较它们……一英寸是最大的吗? 他们说 1
我正在构建 Windows 应用商店应用程序。我正在使用 Windows 8 和 WPF 以及 Visual Studio .net 2012。 此应用程序的 UI 应可扩展到不同的屏幕。我创建了一个
如何修改此类以遵循 DIP(依赖倒置原则),以便删除构造函数中的两个 ArrayList 依赖项?接口(interface)应该如何? 令我困惑的一件事是新引用指向 ArrayList不仅仅是类的构造
有没有办法以编程方式将 dip 转换为 px,因为我需要在 webview 中设置字体大小,但我认为 dip 不会很好。 最佳答案 来自 Overview of Screens Support 的密度
过去几个小时我一直在努力寻找解决这个问题的方法,但我似乎找不到任何东西。 我正在使用 LibGDX 为 Android 开发游戏。在模拟器中,游戏看起来不错,但是当我在手机上玩时,一切都不一样而且放错
我是一名优秀的程序员,十分优秀!