Questions tagged «design-principles»

2
是否有实际上适用于Java的OO原理?
Javascript是一种基于原型的面向对象语言,但是可以通过以下多种方式变为基于类的语言: 自己编写要用作类的函数 在框架中使用漂亮的类系统(例如mootools Class.Class) 从Coffeescript生成 一开始,我倾向于使用Javascript编写基于类的代码,并高度依赖它。但是最近我一直在使用Javascript框架和NodeJS,它们脱离了类的概念,而更多地依赖于代码的动态特性,例如: 异步编程,使用和编写使用回调/事件的编写代码 使用RequireJS加载模块(以便它们不会泄漏到全局名称空间) 功能编程概念,例如列表推导(映射,过滤器等) 除其他事项外 到目前为止,我所收集的是,我已阅读的大多数OO原理和模式(例如SOLID和GoF模式)都是为基于类的OO语言(例如Smalltalk和C ++)编写的。但是其中有哪些适用于基于原型的语言(例如Javascript)? 是否有特定于Java的原则或模式?避免回调地狱,邪恶的eval或任何其他反模式的原则。



6
面向对象设计中的松耦合
我正在尝试学习GRASP,我发现了有关低耦合的解释(在第3页上),当我发现这一点时,我感到非常惊讶: 考虑addTrack一个Album类的方法,两种可能的方法是: addTrack( Track t ) 和 addTrack( int no, String title, double duration ) 哪种方法可以减少耦合?第二个则需要,因为使用Album类的类不必知道Track类。通常,方法的参数应使用基本类型(int,char ...)和java。*包中的类。 我倾向于不同意这一点。我相信addTrack(Track t)胜于addTrack(int no, String title, double duration)各种原因: 最好总是使用尽可能少的参数的方法(根据Bob叔叔的“清洁代码”,最好是无或一个,在某些情况下为2,在特殊情况下为3;超过3的需求需要重构-这些当然是建议,而不是冬青规则) 。 如果addTrack是接口的一种方法,并且要求a Track应该具有更多的信息(例如年份或类型),则需要更改接口,以便该方法应支持另一个参数。 封装破裂;如果addTrack在接口中,则它不应该知道的内部Track。 实际上,它在第二种方式中与许多参数耦合在一起。假设no参数需要被改变,从int到long,因为有超过MAX_INT轨道(或无论何种原因); 则Track必须同时更改和方法,而如果addTrack(Track track)仅更改方法,则需要Track更改。 这四个参数实际上是相互关联的,其中一些是其他因素的结果。 哪种方法更好?

4
得墨meter耳定律如何适用于有关耦合和内聚的面向对象系统?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 得墨meter耳定律如何应用于具有耦合和凝聚力的面向对象系统? 我正在读一本书“软件开发和专业实践”,偶然发现了有关LoD的一章,并对如何将这一原理应用于面向对象的系统感到好奇。

3
接口隔离原理的两个矛盾定义–哪个正确?
在阅读有关ISP的文章时,似乎对ISP有两个相互矛盾的定义: 根据第一定义(见1,2,3),ISP指出,实现该接口的类不应该被迫实施的功能,他们并不需要。因此,胖界面IFat interface IFat { void A(); void B(); void C(); void D(); } class MyClass: IFat { ... } 应该分成较小的接口,ISmall_1并且ISmall_2 interface ISmall_1 { void A(); void B(); } interface ISmall_2 { void C(); void D(); } class MyClass:ISmall_2 { ... } 因为这样我MyClass能够实现只需要(方法D()和C()),而无需被迫还提供了虚拟实现A(),B()并且C(): 但根据第二个定义(见1, 2,通过纳扎尔Merza答案),ISP指出MyClient调用方法MyService不应该知道的有关方法MyService,它不需要。换句话说,如果MyClient只需要的功能C()和D(),然后代替 class MyService { public void …

1
如何在继承层次结构中验证Liskov替换原理?
灵感来自这个答案: 里氏替换原则要求 是 前提条件不能在子类型中得到加强。 子条件不能弱化后置条件。 超类型的不变量必须保留在子类型中。 历史记录约束(“历史记录规则”)。只能通过对象的方法(封装)将其视为可修改的对象。由于子类型可能会引入父类型中不存在的方法,因此这些方法的引入可能会导致子类型中状态不允许在父类型中发生变化。历史记录约束禁止这样做。 我希望有人能发布违反这4点的类层次结构,以及如何相应地解决它们。 我正在寻找出于教育目的的详细说明,以了解如何识别层次结构中的四个点以及解决该问题的最佳方法。 注意: 我希望发布代码示例供人们使用,但是问题本身是关于如何识别错误的层次结构的:)


5
什么时候停止继承?
很久以前,我在Stack Overflow上问了一个关于继承的问题。 我说过我以OOP方式设计国际象棋引擎。因此,我继承了Piece抽象类的所有片段,但继承仍然存在。让我按代码显示 public abstract class Piece { public void MakeMove(); public void TakeBackMove(); } public abstract class Pawn: Piece {} public class WhitePawn :Pawn {} public class BlackPawn:Pawn {} 程序员发现我的设计超出了工程学,建议删除有色块类,并保留色块作为属性成员,如下所示。 public abstract class Piece { public Color Color { get; set; } public abstract void MakeMove(); public abstract void …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.