Questions tagged «object-oriented»

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


2
Monad是继承层次结构的可行替代方法吗?
我将使用像monads这样的语言不可知的描述,首先描述monoid: 甲独异是(大约)的一组需要一些类型作为参数并返回相同的类型的功能。 甲单子是(大约)的一组需要的功能封装器类型作为参数并返回相同的包装类型。 注意这些是描述,而不是定义。随意攻击该描述! 因此,在OO语言中,monad允许以下操作组合: Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land() 请注意,monad定义并控制这些操作的语义,而不是所包含的类。 传统上,在OO语言中,我们将使用类层次结构和继承来提供这些语义。因此,我们将有一个Bird带有方法takeOff(),flyAround()和的类land(),而Duck将继承这些方法。 但是后来我们遇到了不能飞的鸟,因为penguin.takeOff()失败了。我们必须求助于异常抛出和处理。 另外,一旦我们说企鹅是a Bird,我们就会遇到多重继承问题,例如,如果我们也有的层次结构Swimmer。 本质上,我们试图将类归类(对“分类论”的人道歉),并按类别而不是单个类来定义语义。但是,与层次结构相比,monad似乎是一种更清晰的机制。 因此,在这种情况下,我们将有一个Flier<T>单子,如上面的示例: Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land() ...而且我们永远不会实例化一个Flier<Penguin>。我们甚至可以使用静态类型来防止这种情况的发生,也许使用标记接口。或运行时功能检查以纾困。但是,实际上,程序员切勿将企鹅放入Flier,从同样的意义上讲,它们切勿除以零。 而且,它更普遍适用。飞行器不必一定是鸟。例如Flier<Pterodactyl>或Flier<Squirrel>,而不更改这些单个类型的语义。 一旦我们通过容器上的可组合函数对语义进行了分类(而不是按类型层次结构进行分类),它就解决了“某种行为,某种行为不适合”特定类的旧问题。它还轻松明确地为一个类提供了多种语义,例如Flier<Duck>和Swimmer<Duck>。似乎我们一直在通过按类层次结构对行为进行分类来应对阻抗不匹配的问题。Monad优雅地处理它。 因此,我的问题是,就像我们倾向于偏爱组成而非继承一样,偏爱单子而不是继承是否也有意义? (顺便说一句,我不确定是应该在这里还是在Comp Sci中使用,但这似乎更像是一个实际的建模问题。但是也许在那儿会更好。)

4
空接口以合并多个接口
假设您有两个接口: interface Readable { public void read(); } interface Writable { public void write(); } 在某些情况下,实现对象只能支持其中之一,但在很多情况下,实现将支持两个接口。使用界面的人员将必须执行以下操作: // can't write to it without explicit casting Readable myObject = new MyObject(); // can't read from it without explicit casting Writable myObject = new MyObject(); // tight coupling to actual implementation MyObject myObject …

5
实体组件系统体系结构对象是否按定义定向?
按照定义,实体组件系统体系结构是否面向对象?对我来说,这似乎更具程序性或功能性。我的观点是,它不会阻止您以OO语言实现它,但是以坚定的OO方式实现它并不是惯用的。 似乎ECS会将数据(E&C)与行为(S)分开。作为证据: 这个想法是在实体中没有嵌入任何游戏方法。 和: 该组件包含用于特定目的的最少数据集 系统是具有一组具有特定组件的实体的单一目的功能 我认为这不是面向对象的,因为面向对象的很大一部分是将您的数据和行为结合在一起。 作为证据: 相反,面向对象的方法鼓励程序员将数据放置在程序其余部分无法直接访问的位置。而是通过调用专门编写的函数(通常称为方法)来访问数据,这些函数与数据捆绑在一起。 另一方面,ECS似乎只不过是将数据与行为分开。

5
为什么现代图书馆不使用OOP
我是初学者级C ++程序员,但是我对语言的概念非常了解。当我开始学习外部C ++库(例如SDL,OpenGL)(也许还有其他东西)时,令我惊讶的是,我发现它们根本不使用C ++概念。 例如,SDL和OpenGL都不使用类或异常,而倾向于使用函数和错误代码。在OpenGL中,我看到过诸如glVertex2f之类的函数,该函数需要2个float变量作为输入,并且作为模板可能会更好。而且,这些库有时使用marcos,而使用宏函数似乎是一个坏习惯,这是一个普遍的共识。 总而言之,它们似乎更多地是用C风格而不是C ++风格编写的。但是它们是完全不同的语言,不是吗? 问题是:为什么现代图书馆没有利用它们所写语言的优势?

5
关联,聚合和组合的用途是什么?
我研究了很多关于封装的理论以及实现封装的三种技术,即关联,聚合和组合。 我发现的是: 封装形式 封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术。如果某个字段被声明为私有,那么该类之外的任何人都无法访问该字段,从而将这些字段隐藏在该类中。因此,封装也称为数据隐藏。 封装可以描述为一种保护性屏障,可以防止该代码和数据被该类外部定义的其他代码随机访问。通过接口严格控制对数据和代码的访问。 封装的主要好处是能够修改我们已实现的代码,而不会破坏其他使用我们代码的人的代码。通过此功能,封装使我们的代码具有可维护性,灵活性和可扩展性。 协会 关联是一种关系,其中所有对象都有其自己的生命周期,并且没有所有者。让我们以老师和学生为例。多个学生可以与一个老师联系,一个学生可以与多个老师联系,但是对象之间没有所有权,并且都有自己的生命周期。两者都可以独立创建和删除。 聚合 聚合是协会的一种特殊形式,其中所有对象都有其自己的生命周期,但是有所有权,子对象不能属于另一个父对象。让我们以一个系和一个老师为例。一个老师不能属于多个部门,但是如果我们删除该部门,则该教师对象不会被销毁。我们可以将其视为“具有”关系。 组成 组合还是聚集的一种特殊形式,我们可以称其为“死亡”关系。这是一种很强的聚合。子对象没有生命周期,如果删除父对象,则所有子对象也将被删除。让我们再次以房屋与房间之间的关系为例。房屋可以包含多个房间,但是没有一个房间的独立生活,任何房间都不能属于两个不同的房屋。如果我们删除房屋,房间将被自动删除。 问题是: 现在这些都是真实的例子。我正在寻找有关如何在实际的类代码中使用这些技术的描述。我的意思是,使用三种不同的封装技术有什么意义,如何实现这些技术以及如何选择适用的技术。

11
信息隐藏不仅仅是一种约定吗?
在Java,C#和许多其他强类型,静态检查的语言中,我们习惯于编写如下代码: public void m1() { ... } protected void m2() { ... } private void m2() { ... } void m2() { ... } 一些动态检查的语言不提供关键字来表达给定类成员的“私有性”级别,而是依靠编码约定。例如,Python为私有成员添加下划线前缀: _m(self): pass 可以争论的是,以动态检查的语言提供这样的关键字只会增加用处,因为它只能在运行时检查。 但是,我也找不到以静态检查的语言提供这些关键字的充分理由。我发现需要用相当冗长的关键字(例如protected烦人和分散注意力)填充代码。到目前为止,我还没有遇到过由这些关键字引起的编译器错误会使我免于错误的情况。相反,我一直处在错误放置位置的情况下,protected使我无法使用库。 考虑到这一点,我的问题是: 信息隐藏不仅仅是程序员之间用来定义类正式接口的一部分的约定吗? 可以用来保护班级的秘密状态免遭攻击吗?反射可以覆盖此机制吗?什么使编译器强制实施信息隐藏值得?

11
OOP是现实世界中占主导地位的编程模型吗?
对象永不?好吧,几乎没有 在ACM通讯的VIEWPOINT部分中,我找到了一篇有趣的文章,标题为“ Objects Never?Well,Hardever Ever ”。这与“对象优先”或“对象迟”的观点截然不同。他建议“从不设对象”或“由对象开设研究生院”。 作者讨论了OOP,并提出了有关在现实世界编程环境中如何使用OOP的问题。他认为OOP不是主要的编程模型。他声称,例如,有70%的编程是针对OOP不太适合的嵌入式系统完成的。 当一些大学的教授想谈论OOP的好处时,他们谈论的是代码重用。他又说,作为另一个例子,这不是现实世界中的真实情况。重用代码比大学声称的要难: 我声称使用OOP并不像大多数人所相信的那样普遍,它不如其支持者所声称的那样成功,因此,没有理由证明它在CS课程中的中心地位。 我很高兴知道堆栈溢出中的人们对此有何看法?从程序员的角度来看,OOP是占主导地位的编程模型吗? 如果我应该只选择/学习/使用一种方法,那么它是否是面向对象的?为什么?

9
init()方法有代码味道吗?
声明init()类型的方法是否有目的? 我不是问我们是否应该优先init()于构造函数,或者如何避免声明init()。 我问的是在声明方法(查看它的普遍性)后是否有任何理论依据,init()或者它是否是一种代码味道,应避免使用。 这个init()习语很普遍,但是我还没有看到任何真正的好处。 我说的是鼓励通过方法初始化的类型: class Demo { public void init() { //... } } 什么时候可以在生产代码中使用它? 我觉得这可能是代码的味道,因为它表明构造函数未完全初始化对象,从而导致部分创建了对象。如果未设置状态,则该对象不应存在。 从企业应用的意义上讲,这使我相信它可能是某种用于加速生产的技术的一部分。这是我可以想到的惯用法,这是唯一合乎逻辑的原因,但我不确定是否会有这样的习惯。

7
模式与原理的区别
面向对象的设计模式和原理之间有什么区别?他们是不同的东西吗?据我了解,他们两个都试图实现一些共同的目标(例如灵活性)。那么我可以说模式是原则,反之亦然吗? 设计原理= SOLID(即依赖反转原理) 设计模式= Gof(即抽象工厂模式)

3
谈论C ++“方法”(相对于“成员函数”)有多错误?
我了解,根据C ++规范,不存在“方法”之类的东西,并且一些(很多?大多数?)C ++程序员认为“方法”是一种Java主义。另一方面,即使在C ++论坛上,人们似乎也在谈论方法而不会抽搐。我正在寻找有关此术语的已知约定或惯例。 我正在记录同时具有C ++和Java版本的API。开发人员实际上将类和方法/成员函数的名称在两者之间保持相同,以方便移植和测试。因此,有关这些API的一些文档需要放在语言选择的“上方”。我需要能够大致讨论Foos和Bars及其baz()和mumble()...方法? 如果我谈论Java程序员会认为它很自然的方法,那么看来C ++程序员可能会理解,但是有些人会认为它是不正确的。我的问题是:令人发指这是怎么在实践中?相对于C ++特定的函数,通常如何在“通用OOP”上下文中谈论C ++成员函数?有没有更好的方式来讨论成员函数,而这两种语言都不对吗?(“成员函数”有点冗长。) 这不是意见调查;我正在尝试确定是否存在实际的约定或通用做法来解决此问题。 我知道这个问题,但是它通常是关于OOP的,而不是关于特定语言的。



3
“ Java OOP”和“ Pythonic OOP”之间的区别?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我从ActionScript 2.0开始,然后又从Java开始。从那以后,我已经学习或至少使用了一堆语言,包括Python(可能是我的最爱)。 恐怕我的面向对象编程风格非常不符合Python风格,更像带有Python语法的Java OOP。是什么使Java like和Pythonic OOP彼此不同?用Python编写面向对象的代码时,Java程序员经常做什么?

4
使不依赖实例字段的方法变为静态吗?
最近,我开始在Groovy中为Java项目的集成测试框架进行编程。我将Intellij IDEA与Groovy插件一起使用,我很惊讶地看到所有非静态方法并且不依赖于任何实例字段,这是一个警告。但是,在Java中,这不是问题(至少从IDE的角度来看)。 是否将所有不依赖于任何实例字段的方法都转换为静态函数?如果为true,这是特定于Groovy还是通常可用于OOP?又为什么呢

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.