Tag: 固体原理

依赖倒置原则(SOLID)与封装(OOP的支柱)

最近我正在讨论依赖倒置原理 , 控制反转和dependency injection 。 关于这个话题,我们正在辩论这些原则是否违反了OOP的一个支柱,即封装 。 我对这些事情的理解是: 依赖倒置原则意味着对象应该依赖于抽象而不是结核 – 这是实现控制反转模式和dependency injection的基本原理。 控制反转是依赖反转原理的模式实现,其中抽象依赖关系取代具体的依赖关系,允许在对象之外指定依赖关系的结构。 dependency injection是实现控制反转并提供依赖性parsing的devise模式。 当一个依赖被传递给一个依赖的组件时就会发生注入。 实质上,dependency injection模式提供了一种将依赖抽象与具体实现耦合的机制。 封装是高层对象所需要的数据和function被隔离开来并且不可访问的过程,因此程序员不知道如何实现对象。 辩论得到了一个关键点: IoC不是OOP,因为它打破封装 就我个人而言,我认为所有的OOP开发者都应该遵守依存倒置原则和控制倒置的模式,而且我的观点如下: 如果有(可能)不只一个方法去剥皮,那就不要像只有一个。 例1: class Program { void Main() { SkinCatWithKnife skinner = new SkinCatWithKnife (); skinner.SkinTheCat(); } } 这里我们看到一个封装的例子。 程序员只需要调用Main() ,猫就会被剥皮,但是如果他想要剥皮猫,比如说一组锋利的razor呢? 例2: class Program { // Encapsulation ICatSkinner skinner; public Program(ICatSkinner skinner) { // […]

你如何定义一个单一的责任?

我知道“有单一理由的class级”。 那么究竟是什么呢? 有没有一些气味/迹象可以说明class级没有一个单一的责任? 或者真正的答案可以隐藏在YAGNI中,只有在class级第一次改变时才重构为单一责任?

Liskov替代原则 – 没有压倒性的/虚拟的方法?

我对Liskovreplace原理的理解是,基类的某些属性是真实的,或者基类的某些实现行为,对于派生类也应该是真实的。 我猜这将意味着当一个方法在基类中定义时,它不应该在派生类中被覆盖 – 因为然后replace基类而不是派生类会得到不同的结果。 我想这也意味着,有(非纯)虚拟方法是一件坏事? 我想我可能对这个原理有一个错误的理解。 如果我不这样做,我不明白为什么这个原则是好的做法。 谁可以给我解释一下这个? 谢谢

应用程序体系结构/在F#

在C#中,我一直在做SOLID到最近的一个非常极端的水平,并在某种程度上意识到,我现在基本上没有比现在编写函数更多的东西了。 在我最近又开始研究F#之后,我认为这可能是现在我所做的大部分更合适的语言select,所以我想尝试将一个真实世界的C#项目移植到F#作为概念的certificate。 我想我可以把实际的代码(非常不习惯的方式)拉下来,但我无法想象一个架构是什么样子的,这使得我可以像在C#中一样灵活的工作。 我的意思是,我有很多使用IoC容器编写的小类和接口,而且我也使用Decorator和Composite等模式。 这导致(在我看来)非常灵活和可演化的整体架构,允许我轻松地replace或扩展应用程序的任何点的function。 根据所需更改的大小,我可能只需要编写一个新的接口实现,将其replace为IoC注册并完成。 即使变化较大,我可以replace对象图的一部分,而应用程序的其余部分就像以前一样。 现在用F#,我没有类和接口(我知道我可以,但我认为这是在我想要做实际的函数式编程),我没有构造函数注入,我没有IoC容器。 我知道我可以使用更高阶的函数来做类似Decorator模式的事情,但是这看起来不像给构造函数注入类那样具有同样的灵活性和可维护性。 考虑这些C#types: public class Dings { public string Lol { get; set; } public string Rofl { get; set; } } public interface IGetStuff { IEnumerable<Dings> For(Guid id); } public class AsdFilteringGetStuff : IGetStuff { private readonly IGetStuff _innerGetStuff; public AsdFilteringGetStuff(IGetStuff innerGetStuff) { this._innerGetStuff = innerGetStuff; } […]

什么是Liskov替代原则的例子?

我听说Liskov替代原则(LSP)是面向对象devise的基本原则。 这是什么,它有什么使用的例子?