Questions tagged «object-oriented»

一种使系统能够建模为一组对象的方法论,这些对象可以模块化方式进行控制和操作

8
C ++成为好友还是不成为好友
我在大学这个学期的C ++课程中有一个面向对象的编程,我们正在学习有关朋友函数的知识。 我本能地讨厌它们绕过封装和数据隐藏所提供的安全性的能力,我在互联网上读了几篇文章,有些人认为这是一个合法使用的好主意。 OOP专家会对C ++中的好友功能怎么说?我应该浏览一下还是应该了解更多?

3
是否有OOP过度复杂化的术语?
一两年前,我看到了一篇有关OOP(Java)的出色文章,其中展示了一个简单的两行或三行代码的具体记录器的发展,以及经验不足的开发人员在理论上的过度思考过程,基本上说,哦,我应该添加此以防万一我们想要的! 到本文结尾时,这个简单的记录器是一堆乱七八糟的垃圾,原始开发人员几乎无法理解自己。 这种过度并发症是否有一个通用术语?那篇文章(我非常希望我能再次找到它)很好地展示了一个孤立案例的概念,但是我遇到了整个项目,在这些项目中,开发人员实际上是由于过度使用模式,框架,库和程序而陷入困境。其他问题。用它自己的方式,这比我们继承来替换的旧版VB6意大利面条应用程序糟糕(甚至更糟)。 我真正想要的是在面试时提出这个问题。我想知道是否有人意识到并意识到缺乏架构/预先规划就容易陷入这种困境(并且因为他们似乎没有适当的平衡而陷入困境),但这并不是真的我可以找到很多信息。

2
在类中定义一个大型私有函数以保持有效状态(即更新对象的数据成员)是否是一个好主意?
尽管在下面的代码中使用的是在电子商务站点中简单的单项购买,但我的一般问题是有关更新所有数据成员以始终保持对象数据处于有效状态的信息。 我发现“一致性”和“国家是邪恶的”是相关的短语,在这里进行了讨论:https : //en.wikibooks.org/wiki/Object_Oriented_Programming#.22State.22_is_Evil.21 <?php class CartItem { private $price = 0; private $shipping = 5; // default private $tax = 0; private $taxPC = 5; // fixed private $totalCost = 0; /* private function to update all relevant data members */ private function updateAllDataMembers() { $this->tax = $this->taxPC * …

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是另一个范例,因此我们应该忘记这一点。



3
为什么面向对象的数据库没有像关系数据库那样被广泛使用?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我遇到过许多关系数据库管理系统(RDBMS)。但是最近我使用了休眠模式,这使我开始怀疑为什么面向对象的数据库没有那么流行。 如果像Java或C#这样的面向对象语言如此流行,那么为什么面向对象的数据库管理系统(OODBMS)也不那么流行呢?

5
为什么我看到这么多没有状态的可实例化类?
我在C ++和Java世界中看到许多没有任何状态的可实例化类。 我真的不知道为什么人们这样做,他们只能在C ++中使用带有自由函数的名称空间,或者在Java中使用具有私有构造函数和仅静态方法的类。 我能想到的唯一好处是,如果您以后决定在某些情况下需要不同的实现,则不必更改大多数代码。但这不是过早设计的情况吗?当/如果合适的话,以后可以将其变成一堂课。 我搞错了吗?如果我不将所有内容都放入对象(即实例化类)中,这不是OOP吗?那么,为什么在C ++和Java的标准库中有如此多的实用程序名称空间和类? 更新: 在以前的工作中,我当然已经看过很多这样的例子,但是我一直在努力寻找开放源代码的例子,因此也许毕竟不是那么普遍。不过,我想知道人们为什么这么做,以及这种做法有多普遍。

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

3
关于装饰器设计模式的新手问题
我在阅读编程文章,其中提到了装饰器模式。我已经进行了一段时间编程,但没有进行任何形式的教育或培训,但是我正在尝试学习标准模式等。 因此,我抬起头来查看装饰器,并在上面找到了维基百科的文章。我现在了解了装饰器模式的概念,但是我对这段内容感到有些困惑: 例如,考虑一个窗口系统中的一个窗口。为了允许滚动窗口的内容,我们可能希望适当地向其添加水平或垂直滚动​​条。假定窗口由Window类的实例表示,并且假定此类不具有添加滚动条的功能。我们可以创建一个提供它们的子类ScrollingWindow,也可以创建一个ScrollingWindowDecorator将此功能添加到现有的Window对象中。此时,任何一种解决方案都可以。 现在假设我们也希望能够向窗口添加边框。同样,我们原始的Window类不支持。ScrollingWindow子类现在带来了一个问题,因为它有效地创建了一种新型的窗口。如果希望对所有窗口添加边框支持,则必须创建子类WindowWithBorder和ScrollingWindowWithBorder。显然,随着每个新功能的添加,此问题变得更加严重。对于装饰器解决方案,我们只需创建一个新的BorderedWindowDecorator,在运行时,我们可以根据需要使用ScrollingWindowDecorator或BorderedWindowDecorator或两者来装饰现有窗口。 好的,当他们说要向所有窗口添加边框时,为什么不只是在原始Window类中添加功能以允许该选项呢?我所看到的方式是,子类化仅是为类添加特定功能或重写类方法。如果需要向所有现有对象添加功能,为什么不修改超类来这样做呢? 文章中还有另一行: 装饰器模式是子类的替代方法。子类化在编译时增加了行为,并且更改会影响原始类的所有实例;装饰可以在运行时为单个对象提供新的行为。 我不明白他们说“ ...更改影响原始类的所有实例”的原因-子类化如何更改父类?这不是继承的全部重点吗? 我将假设该文章像许多Wiki一样,书写不清晰。我可以在最后一行看到装饰器的用处-“ ...在运行时为单个对象提供新的行为。” 如果不了解这种模式,那么如果我需要在运行时更改单个对象的行为,则可能会在超类或子类中构建一些方法来启用/禁用所述行为。请帮助我真正了解装饰器的用途,为什么我的新手思维有缺陷?

10
为什么继承和多态性被广泛使用?
我越了解不同的编程范例(例如函数式编程),就越开始质疑OOP概念(如继承和多态性)的智慧。我最初在学校学习继承和多态性,当时,多态性似乎是编写允许轻松扩展的通用代码的绝妙方法。 但是面对鸭子类型(动态和静态)以及诸如高阶函数之类的功能特性,我已经开始将继承和多态性视为基于对象之间脆弱的一组关系施加了不必要的限制。多态性背后的一般想法是,您只需编写一次函数,以后便可以在不更改原始函数的情况下向程序中添加新功能-您要做的就是创建另一个实现必要方法的派生类。 但是,无论是使用动态语言(例如Python)还是使用静态语言(例如C ++),通过鸭子输入都可以轻松实现这一点。 例如,请考虑以下Python函数,后跟等效的静态C ++: def foo(obj): obj.doSomething() template <class Obj> void foo(Obj& obj) { obj.doSomething(); } 相当于OOP的类似于以下Java代码: public void foo(DoSomethingable obj) { obj.doSomething(); } 当然,主要区别在于Java版本需要先创建接口或继承层次结构,然后才能起作用。因此,Java版本涉及更多工作,并且灵活性较差。此外,我发现大多数现实世界中的继承层次结构都有些不稳定。我们都已经看到了人为的形状和动物的示例,但是在现实世界中,随着业务需求的变化和新功能的添加,很难真正完成任何工作,然后才能真正扩展子类,或者重新建模/重构层次结构以包含更多的基类或接口,以适应新的需求。使用鸭子类型,您无需担心要建模的任何事情-您只需要担心所需的功能。 但是,继承和多态性是如此流行,以至于我怀疑将它们称为可扩展性和代码重用的主要策略是否过于夸张。那么,为什么继承和多态性如此成功呢?我是否忽略了继承/多态性比鸭子类型具有的一些重要优势?

15
面向对象编程是复杂性的解决方案吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 您是否认为面向对象编程是解决复杂性的一种方法。为什么?这个话题可能有点争议,但是我打算从这里的专家那里了解“为什么”的答案!

5
何时使用继承,何时使用“仅布尔字段”?
在我们的Rails应用程序中,我们正在添加通知。其中一些是blocking:它们会停止添加任何资源的进度,因为缺少该资源的某些信息。 其他通知是简单通知,仅提供信息。 今天,我与团队中的另一个程序员进行了讨论。我创建了这样的继承结构: 但是,他希望我只是blocking在每个Notification上添加为布尔返回方法,并指定在Notification父类内阻塞的子类列表。 这些方法之间的差异不是很大。在我的方法中,不必指定此列表,以使根类保持整洁。另一方面,Notification::Blocking现在发生的特殊逻辑也不是很大。 哪种抽象更适合此问题?

8
一个名为Class的Class?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 这更多是一个风格问题,但这是我目前正在考虑的我的一个项目。 假设您正在创建对学校进行建模的应用程序。因此存在诸如学生,学校等实体。现在,一切都很好而且很直观,直到您上课为止,因为(在大多数语言中)Class是保留字。那么,如果这Class是一个保留关键字,那么您将如何称呼这种模拟学校课程的实体?

4
模式匹配是惯用的类型还是不良的设计?
似乎F#代码经常针对类型进行模式匹配。当然 match opt with | Some val -> Something(val) | None -> Different() 似乎很常见。 但是从OOP的角度来看,这看起来非常像基于运行时类型检查的控制流,通常会对此皱眉。要说明,在OOP中,您可能更喜欢使用重载: type T = abstract member Route : unit -> unit type Foo() = interface T with member this.Route() = printfn "Go left" type Bar() = interface T with member this.Route() = printfn "Go right" 这肯定是更多代码。OTOH,在我的OOP-y看来,它具有结构上的优势: …

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.