Questions tagged «object-oriented-design»

面向对象的设计是规划用于解决软件问题的交互对象系统的过程。

6
函数式编程会增加问题和解决方案之间的“代表性差距”吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 由于机器语言(例如0110101000110101)计算机语言通常已经演化为更高形式的抽象,因此通常将其应用于问题时更易于理解代码。汇编器是对机器代码的抽象,C是对汇编器的抽象,等等。 面向对象的设计似乎非常擅长于使我们能够根据对象对问题进行建模,例如,可以使用Course类,Student类等对大学课程注册系统的问题进行建模。然后,当我们编写解决方案时在OO语言中,我们有类似的类来承担责任,并且通常对设计特别是模块化代码有帮助。如果我将这个问题交给使用OO方法解决此问题的10个独立团队,通常这10个解决方案将具有与该问题相关的类。当您开始接触这些类的耦合和相互作用时,可能会有很多差异,因此不存在“零代表间隙”之类的问题。 我对函数式编程的经验非常有限(没有实际使用,只有Hello World类型的程序)。我没有看到这样的语言如何像OO语言那样轻松地将FP解决方案映射到问题(具有较小的表示差距)。 我了解FP在并发编程方面的优势。但是我是否缺少某些东西,或者FP是否不是要缩小代表差距(使解决方案更容易理解)? 提出另一种方式是:10个不同团队解决同一现实问题的FP代码有很多共同点吗? 摘自维基百科上的抽象(计算机科学)(重点是我的): 函数式编程语言通常会展示与函数相关的抽象,例如lambda抽象(将术语变成某些变量的函数),高阶函数(参数是函数),括号抽象(将术语变成变量的函数)。 由于[某些]现实世界中的问题很难用这种抽象模型来建模,因此代表性的差距可能会增加。 我看到减小代表性差距的另一种方法是将解决方案元素追溯到问题所在。在0年代和1S IN的机器代码是很难追溯,而Student类是容易追溯。并非所有的OO类都可以轻松地跟踪到问题空间,但是许多类都可以。 FP抽象不是总是需要解释以找出他们要解决的问题空间的哪一部分(除了数学问题)?好的-这方面我很好。在查看了更多示例之后,我将看到FP抽象对于在数据处理中表达的问题的一部分非常清晰。 对相关问题的可接受答案UML可以用于对功能程序进行建模吗?-说“功能程序员在图表中没有太多用处。” 我真的不在乎它是否是UML,但是这使我想知道,如果没有被广泛使用的图,那么FP抽象是否易于理解/交流(假设这个答案是正确的)。同样,我对FP的使用/理解水平是微不足道的,因此我了解不需要简单FP程序的图表。 OO设计具有抽象的功能/类/包级别,每个级别都有封装(访问控制,信息隐藏),这使得管理复杂性变得更加容易。这些是使问题从解决方案回到解决方案的要素。 许多答案都谈到了如何以类似于OO的方式在FP中完成分析和设计,但是到目前为止,没有人引用任何高级信息(保罗引用了一些有趣的东西,但它是低级的)。昨天我做了很多谷歌搜索,发现了一些有趣的讨论。以下摘自Simon Thompson(2004)的“重构功能程序”(重点是我的) 在设计面向对象的系统时,理所当然的是,设计将优先于编程。设计将使用诸如Eclipse之类的工具支持的UML之类的系统编写。入门程序员可能会使用BlueJ之类的系统很好地学习视觉设计方法。FAD:Functional Analysis and Design中报告了类似的函数编程方法的工作,但几乎没有其他工作。可能有许多原因。 现有的功能程序具有不需要设计的规模。许多功能程序都很小,但其他功能程序(例如格拉斯哥Haskell编译器)则很实用。 功能程序直接为应用程序领域建模,因此使设计无关紧要。虽然功能语言提供了各种强大的抽象,但是很难说这些提供了对现实世界建模所需的全部和唯一的抽象。 功能程序是作为一系列不断发展的原型而构建的。 在以上引用的博士学位论文中,概述了使用分析和设计方法(ADM)的好处,而与范式无关。但是有人提出ADM应该与实现范例保持一致。也就是说,OOADM最适合用于OO编程,并且不能很好地应用于诸如FP之类的另一范式。我认为这是一个很好的报价,这就是我所说的代表性差距: 人们可以就哪种范式为软件开发提供最好的支持进行详尽的争论,但是当一个范式停留在从问题描述到实施和交付的单一范式中时,就可以实现最自然,有效和有效的开发包。 以下是FAD提出的一组图表: 功能依赖关系图,提供功能及其在实现中使用的功能; 类型依赖图,为类型提供相同的服务;和, 模块依赖关系图,显示系统模块结构的视图。 FAD论文的第5.1节中有一个案例研究,该系统可以自动生成与足球(足球)联赛有关的数据。这些要求具有100%的功能,例如输入足球结果,产生联赛表,得分表,出勤表,在团队之间转移球员,在新结果后更新数据等。没有记录FAD如何解决非功能性要求除了声明“应该以最低的成本允许使用新功能”之外,几乎无法进行测试。 遗憾的是,除了FAD之外,我没有看到任何针对FP提出的现代建模语言(可视化)参考。UML是另一个范例,因此我们应该忘记这一点。

6
多重继承是否违反单一责任原则?
如果您有一个从两个不同的类继承的类,这是否意味着您的子类自动(至少)自动做2件事,每个超类都做一件? 我相信,如果您有多个接口继承,也没有什么区别。 编辑:明确地说,我认为如果子类化多个类违反了SRP,则实现多个(非标记或基本接口(例如,可比较)接口)也违反了SRP。

3
国家模式是否违反《里斯科夫替代原则》?
该图像取自“ 应用域驱动的设计和模式:带有C#和.NET中的示例” 这是状态模式的类图,其中a SalesOrder在生命周期内可以具有不同的状态。在不同状态之间仅允许某些转换。 现在,OrderState该类是一个abstract类,并且其所有方法都继承为其子类。如果我们将子类视为Cancelled最终状态,不允许将其转换为其他任何状态,则必须对override此类中的所有方法进行抛出。 现在,这不是违反Liskov的替代原则吗,因为sublcass不应改变父级的行为吗?将抽象类更改为接口是否可以解决此问题? 如何解决?

5
SRP(单一责任原则)是客观的吗?
考虑两个想要设计“吸引用户”设计的UI设计师。“吸引用户”是一个不客观的概念,仅存在于设计师的脑海中。因此,设计师A可以选择红色,而设计师B可以选择蓝色。设计器A创建的布局与设计器B完全不同,依此类推。 我读到有关SRP(单一责任原则)的知识,我理解的是一种主观分析或对职责的分解,这些职责可能因OO设计者而异。我对吗?换句话说,是否有可能有两个优秀的面向对象的分析器和设计人员针对一个基于SRP原理的系统提出两种不同的设计?

4
Java-拥有完全静态的类是一个坏主意吗?
我正在一个更大的单独项目中工作,并且现在有几个类,在这些类中我看不到创建其实例的任何理由。 例如,我现在的骰子类静态地存储其所有数据,并且其所有方法也都是静态的。我不需要初始化它,因为当我想掷骰子并获得新值时,我只是使用Dice.roll()。 我有几个类似的类,它们只有一个这样的主要功能,我将开始研究一种“控制器”类,它将负责所有事件(例如,玩家移动时以及当前的转弯方向)是的),而且我发现我可以针对这一堂课遵循相同的想法。我从来没有打算为这些特定的类创建多个对象,因此使它们完全静态将是一个坏主意吗? 我想知道当涉及到Java时,这是否被视为“不好的做法”。从我所看到的,社区似乎在这个话题上有些分歧?无论如何,我希望对此进行一些讨论,并且与资源的链接也很棒!

4
无法解决Javascript函数之谜
我试图了解Javascript幕后的景象,并迷恋于了解内置对象的创建,尤其是对象和函数以及它们之间的关系。 当我读取到所有内置对象(如Array,String等)都是从Object扩展(继承)时,我假定Object是第一个被创建的内置对象,其余对象都继承自该对象。但是,当您知道对象只能由函数创建时,然后函数也不过是Function的对象而已,这没有任何意义。听起来开始像母鸡和鸡肉的困境。 另一个非常令人困惑的事情是,如果我console.log(Function.prototype)打印了一个函数,但是当我打印时console.log(Object.prototype)它打印了一个对象。为什么Function.prototype当它打算成为一个对象时是一个函数? 同样,根据Mozilla文档,每个javascript function都是Function对象的扩展,但是当您console.log(Function.prototype.constructor)再次将其作为函数时。现在,您如何使用自己创建的东西(思维=吹动)。 最后一件事Function.prototype是一个函数,但是我可以constructor使用来访问该函数Function.prototype.constructor,这意味着Function.prototype一个返回prototype对象的函数

5
如何为代表自身或另外两件事的事物创建数据类型
背景 这是我正在研究的实际问题:我想要一种在纸牌游戏“ 魔术:聚会”中表示纸牌的方法。游戏中的大多数卡都是外观正常的卡,但其中有些分为两部分,每部分都有自己的名称。这些分为两部分的卡的每半都被视为卡本身。因此,为清楚起见,我将Card仅指代普通卡或两部分卡的一半(换句话说,只有一个名字的东西)。 因此,我们有一个基本类型Card。这些对象的目的实际上只是为了保留卡的属性。他们自己根本不做任何事情。 interface Card { String name(); String text(); // etc } Card我称之为的两个子类PartialCard(两部分的卡的一半)和WholeCard(普通卡)。 PartialCard还有两个附加方法:PartialCard otherPart()和boolean isFirstPart()。 代表 如果我有一个牌组,它应该由WholeCards而不是Cards组成,因为a Card可能是a PartialCard,这没有任何意义。因此,我想要一个表示“物理卡”的对象,即可以表示一个WholeCard或两个PartialCards的对象。我暂时称呼这种类型Representative,并Card有方法getRepresentative()。A Representative几乎不会在其代表的卡上提供任何直接信息,而只会指向它/它们。现在,我的聪明/疯狂/愚蠢的想法(由您决定)是WholeCard继承自两个 Card和Representative。毕竟,它们是代表自己的卡片!WholeCards可以实现getRepresentative为return this;。 至于PartialCards,它们并不代表自己,但是它们的外部Representative不是Card,而是提供了访问这两个PartialCard的方法。 我认为这种类型的层次结构很有意义,但是很复杂。如果我们将Cards视为“概念卡”而将Representatives视为“物理卡”,那么,大多数卡都是!我认为您可以提出一个论点,即物理卡实际上包含概念卡,并且它们不是一回事,但我认为它们是相同的。 类型转换的必要性 因为PartialCards和WholeCards都是Cards,通常没有充分的理由将它们分开,所以我通常只使用Collection<Card>。所以有时我需要转换PartialCards才能访问它们的其他方法。现在,我正在使用此处描述的系统,因为我真的不喜欢显式强制转换。和一样Card,Representative需要将其强制转换为WholeCard或Composite,以访问Card它们所代表的实际。 所以仅作总结: 基本类型 Representative 基本类型 Card 类型WholeCard extends Card, Representative(无需访问,它代表自己) 类型PartialCard extends Card(允许访问其他部分) 类型Composite extends Representative(允许访问两个部分) 这是疯了吗?我认为这实际上很有意义,但是老实说我不确定。

1
了解访客模式
我有一个代表GUI控件的类层次结构。像这样: Control->ContainerControl->Form 我必须实现一系列算法,这些算法可以与处理各种任务的对象一起使用,并且我认为“访客”模式将是最干净的解决方案。让我们举个例子,该算法创建对象层次结构的Xml表示。使用“经典”方法,我可以这样做: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : Control { public override XmlElement ToXML(XmlDocument document) { XmlElement xml = base.ToXML(document); // …

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更改。 这四个参数实际上是相互关联的,其中一些是其他因素的结果。 哪种方法更好?

2
PHP中的非法:是否存在OOP设计原因?
下面的接口继承在PHP中是非法的,但我认为它在现实生活中将非常有用。下面的设计是否存在实际的反模式或已记录的问题,PHP正在保护我免受其侵扰? <?php /** * Marker interface */ interface IConfig {} /** * An api sdk tool */ interface IApi { public __construct(IConfig $cfg); } /** * Api configuration specific to http */ interface IHttpConfig extends IConfig { public getSomeNiceHttpSpecificFeature(); } /** * Illegal, but would be really nice to have. …

6
策略模式的优势
如果仅在if / then情况下编写代码,使用策略模式为什么有好处? 例如:我有一个TaxPayer类,它的一种方法使用不同的算法来计算税收。那么,为什么不具有if / then情况并找出在该方法中使用哪种算法而不是使用策略模式呢?另外,为什么不能只为TaxPayer类中的每个算法实现单独的方法? 另外,算法在运行时更改意味着什么?

6
抽象类,接口和何时使用它们之间有什么区别
最近,我开始全神贯注于OOP,现在到了这样的地步,我越了解抽象类和接口之间的差异,就越会感到困惑。到目前为止,都无法实例化。接口或多或少是结构的蓝图,它们通过能够部分实现代码来确定骨架和摘要是否不同。 我想通过我的具体情况了解更多有关这些的信息。这是我第一个问题的链接,如果您需要更多背景信息:新班级的良好设计模型是什么? 这是我创建的两个类: class Ad { $title; $description $price; function get_data($website){ } function validate_price(){ } } class calendar_event { $title; $description $start_date; function get_data($website){ //guts } function validate_dates(){ //guts } } 因此,如您所见,这些类几乎是相同的。这里没有显示,但也有其他的功能,like get_zip(),save_to_database()跨越我的课是常见的。我还添加了其他类“汽车”和“宠物”,这些类具有所有常用方法,并且当然具有这些类的特定属性(例如,里程,重量)。 现在,我违反了DRY原则,并且正在多个文件中管理和更改相同的代码。我打算开设更多课程,例如船,马或其他。 那么这是我要使用接口或抽象类的地方吗?根据我对抽象类的了解,我将使用超类作为模板,并将所有常见元素内置到抽象类中,然后仅添加将来类中特别需要的项目。例如: abstract class content { $title; $description function get_data($website){ } function common_function2() { } function common_function3() …

6
我可以将接口方法视为抽象方法吗?
我正在考虑这一点,我对此有些怀疑。 当我声明一个接口时,例如: public interface MyInterface { public void method1(); public void method2(); } 这些接口方法可以被认为是抽象的吗?我的意思是抽象方法的概念是: 抽象方法是已声明但不包含任何实现的方法。 那么,可以将这些方法视为抽象方法吗?它们不是“纯”抽象方法,因为我没有使用这个abstract词,但从概念上讲,它们看起来像是。 您能告诉我些什么? 谢谢。


2
存储库真正应该做什么?
我听说过很多存储库模式,但是我完全不了解存储库应该真正做什么。当我说“存储库应该真正做什么”时,我主要是在担心它应该提供哪些方法。例如,存储库应该真正提供CRUD方法,还是应该提供某种其他方法? 我的意思是,存储库应包含业务逻辑,还是应仅包含与数据存储进行通信并管理要保存或加载的实体的逻辑? 我还听说存储库是聚合的持久性单位。那怎么了 我不明白这在实践中是如何工作的。我认为我们应该只有一个IRepository包含CRUD方法的接口,然后对于任何实体,实现都将仅包含用于保存和从数据存储中检索此类的逻辑。

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.