Questions tagged «object-oriented»

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

3
使用接口而不是一般约束类型的原因是什么
在支持通用类型参数(也称为类模板和参数多态性,尽管每个名称当然都带有不同含义)的面向对象的语言中,通常可以在类型参数上指定类型约束,以便将其约束从另一种类型。例如,这是C#中的语法: //for classes: class ExampleClass<T> where T : I1 { } //for methods: S ExampleMethod<S>(S value) where S : I2 { ... } 在那些接口所约束的类型上使用实际接口类型的原因是什么?例如,进行方法签名的原因是什么I2 ExampleMethod(I2 value)?

3
面向对象语言的非面向对象编程
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 最近,我被分配了一项任务,即使用面向对象编程来创建具有加,减,乘,除和乘幂功能的计算器。我成功完成了这项任务。但是之后,我重新编程了整个程序,而没有使用面向对象的技术/方法。 我注意到我的代码长度大大减少了,这是可以理解的。所以我的问题是,什么时候应该使用面向对象编程?是否可以使用面向对象的语言来创建没有面向对象的程序?请帮助我解决这一问题。 PS:我不是要在这里告诉我面向对象编程优于过程编程的优点。

4
仅出于更好的可读性而将集合包装在一个简单的类中是否为时过早?
我有以下地图: Map<Double, List<SoundEvent>> soundEventCells = new HashMap<Double, List<SoundEvent>>(); 这HashMap会将double值(它们是时间点)映射到相应的SoundEvent“单元格”:每个“单元格”可以包含多个SoundEvent。这就是为什么将其实现为的原因List<SoundEvent>,因为这正是它的本质。 为了提高代码的可读性,我考虑过实现一个非常简单的静态内部类,如下所示: private static class SoundEventCell { private List<SoundEvent> soundEvents = new ArrayList<SoundEvent>(); public void addEvent(SoundEvent event){ soundEvents.add(event); } public int getSize(){ return soundEvents.size(); } public SoundEvent getEvent(int index){ return soundEvents.get(index); } // .. remove() method unneeded } 并且比地图声明(以及许多其他代码)看起来更好,例如: Map<Double, SoundEventCell> soundEventCells …

4
一流的功能是否可以代替战略模式?
该战略的设计模式通常被认为是在缺乏这些语言的一流功能的替代品。 例如,说您想将功能传递给对象。在Java中,您必须向该对象传递另一个封装了所需行为的对象。在诸如Ruby之类的语言中,您只是以匿名函数的形式传递功能本身。 但是我在考虑它,因此决定也许Strategy提供的功能比普通的匿名功能还多。 这是因为对象可以保持独立于其方法运行时间的状态。但是,匿名函数本身只能保持在函数完成执行后就不复存在的状态。 在支持一流功能的面向对象语言中,策略模式相对于使用功能是否有任何优势?

4
在运行时将字段添加到类中-设计模式
想象一下,您的客户希望有可能在其CMS的eshop中为产品添加新属性(例如颜色)。 而不是将属性作为字段: class Car extends Product { protected String type; protected int seats; } 您可能最终会做类似的事情: class Product { protected String productName; protected Map<String, Property> properties; } class Property { protected String name; protected String value; } 也就是说,在现有系统之上创建自己的类型系统。在我看来,这可以看作是创建域特定的语言,还是不能? 这种方法是已知的设计模式吗?您会以不同的方式解决问题吗?我知道可以在运行时中添加字段的语言,但是数据库呢?您是愿意添加/更改列还是使用上图所示的内容? 感谢您的时间 :)。

3
为什么接口在实现松散耦合方面比父类更有用?
(出于这个问题的目的,当我说“接口”时,我的意思是语言结构interface,而不是用另一种意义上的“接口”,即,一个类提供了与外界进行交流的外部方法,并且操纵它。) 松散耦合可以通过使对象依赖于抽象而不是具体类型来实现。 这允许松散耦合,主要有两个原因:1-与具体类型相比,抽象的更改可能性较小,这意味着从属代码中断的可能性较小。2-不同的具体类型可以在运行时使用,因为它们都适合抽象。以后也可以添加新的具体类型,而无需更改现有的从属代码。 例如,考虑一个类Car和两个子类Volvo和Mazda。 如果您的代码依赖于Car,则可以在运行时使用Volvo或Mazda。同样,以后可以添加其他子类,而无需更改从属代码。 另外,Car-是一种抽象-,更改的可能性小于Volvo或Mazda。汽车在相当长的一段时间内大体相同,但沃尔沃和马自达的变化可能性更大。即抽象比具体类型更稳定。 所有这些都是为了表明我理解什么是松散耦合以及如何通过依赖抽象而不是依赖具体实现来实现松耦合。(如果我写的东西不准确,请这样说)。 我不明白的是: 抽象可以是超类或接口。 如果是这样,为什么接口因其允许松耦合而受到特别赞扬?我没有看到它与使用超类有什么不同。 我看到的唯一区别是:1-接口不受单一继承的限制,但这与松耦合这一主题无关。2-接口更加“抽象”,因为它们根本没有实现逻辑。但是,我仍然不明白为什么会有如此大的不同。 请向我解释为什么说接口在允许松散耦合方面是很棒的,而简单的超类却不是。

1
团队工作(在OO项目中)如何工作?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我自己用非常面向对象的风格用Java编程。从来没有机会与其他程序员合作(至少我还不是专业人士)。 出于好奇,我想问:与团队一起进行项目工作如何工作,尤其是在进行OO项目时? 拆分任务如何工作?您如何开发可以与其他程序员开发的产品一起成功使用的产品? 程序员如何以及何时进行交流? 谢谢

2
哪个更好:一堆吸气剂或带有选择字符串参数的1个方法?
我们的知识领域涉及人们赤脚行走在压力记录板上。如果在传感器数据中识别出人脚,我们会进行图像识别,从而产生“脚”类对象。 必须对脚的数据执行一些计算。 现在,哪种API更好: class Foot : public RecognizedObject { MaxPressureFrame getMaxPressureFrame(); FootAxis getFootAxis(); AnatomicalZones getAnatomicalZones(); // + similar getters for other calculations // ... } 要么: class Foot : public RecognizedObject { virtual CalculationBase getCalculation(QString aName); // ... } 现在,我可以提出很多优点和缺点,但是我不能真正决定哪个最重要。请注意,这是最终用户应用程序,而不是我们出售的软件库。 有什么建议吗? 第一种方法的一些专家可能是: 吻-一切都非常具体。API,但实施也是如此。 强类型返回值。 从此类继承是万无一失的。什么都不能覆盖,只能添加。 API是非常封闭的,什么都不会进入,什么都不能被覆盖,所以更少的地方会出错。 一些缺点: 随着我们发明的每一项新计算都被添加到列表中,吸气剂的数量将会增加 API更可能会更改,如果引入了重大更改,我们需要一个新的API版本,即Foot2。 如果在其他项目中重复使用该类,我们可能不需要进行所有计算 …


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

5
什么是第三方代码?
受此问题启发使用第三方库-始终使用包装器吗? 我想知道人们实际上认为第三方库是什么。 来自PHP的示例: 如果我正在使用Zend框架构建应用程序,是否应该将Zend框架库视为第三方代码? C#中的示例: 如果正在构建桌面应用程序,是否应该将所有.Net类都视为第三方代码? Java示例: 是否应将JDK中的所有库都视为第三方库? 有人说,如果一个库是稳定的并且不会经常更改,那么就不需要包装它。但是我看不到如何包装不依赖第三方代码的类。

10
下一级别的抽象是什么?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 由于编程语言最初只使用顺序执行的代码行,后来演变为包含了第一批抽象级别之一的功能,然后创建了类和对象以进一步抽象它。下一级别的抽象是什么? 还有什么比类还抽象的呢?

3
为什么我们最好使用一流的收藏?
根据The ThoughtWorks Anthology中Jeff Bay (RTF)的对象健美操规则第4条规则,建议一个人应该“ 使用一流的收藏集 ”。 规则4:一流的收藏 该规则的应用很简单:任何包含集合的类都不应包含其他成员变量。每个集合都包装在自己的类中,因此与集合相关的行为现在有了归属。您可能会发现过滤器成为此新类的一部分。同样,您的新类可以处理诸如将两个组连接在一起或将规则应用于该组的每个元素的活动。 从中我可以理解的是,我们应该使用一个单独的类来包装该集合,并使用添加,删除该集合的数据的方法。 并且我们需要它,以便我们确定什么数据类型进入集合,什么结果出来。 如果我们使用通用集合(在适用的语言中),是否需要遵循此规则? 如果我没有重要意义,请澄清。

3
纯虚拟或抽象,名称是什么?
在讨论有关Stack Overflow上的虚拟功能的问题时,我想知道是否对纯(抽象)和非纯虚拟功能进行了正式命名。 我始终依靠Wikipedia来获取信息,其中指出纯虚函数和非纯虚函数是通用术语。不幸的是,本文没有使用来源或引用来进行备份。 引用乔恩·斯凯特(Jon Skeet)对我的答复的回答,即使用纯净和非纯净的通用术语: @Steven:嗯...可能,但是我以前只在C ++的上下文中看过它。我怀疑任何谈论他们的人都有C ++背景:) 这些术语是否起源于C ++,或者它们是首先以较早的语言定义或实现的,并且它们是“官方”科学术语吗? 更新: 弗兰克·希亚尔(Frank Shearar)有用地提供了指向SIMULA 67 Common Base Language(1970)的描述的链接。该语言似乎是第一种将OO关键字引入为class,object以及虚拟的形式概念的语言。它没有定义纯/非纯或抽象,但确实支持这些概念。 谁定义的?

3
简洁的代码:使用较少参数的简短方法的后果
最近,在代码审查期间,我遇到了一个新同事写的代码,其中包含带有气味的模式。我怀疑我同事的决定是基于著名的《清洁法规》(也许还有其他类似书籍)提出的规则。 据我了解,类构造函数完全负责创建有效对象,并且其主要任务是分配对象的(私有)属性。当然,可能会通过类构造器以外的方法设置可选属性值,但是这种情况很少见(尽管不一定是错误的,只要类的其余部分都考虑了此类属性的可选性)。这很重要,因为它可以确保对象始终处于有效状态。 但是,在我遇到的代码中,大多数属性值实际上是由构造方法以外的其他方法设置的。计算得出的值被分配给属性,以便在整个类的多个私有方法中使用。作者似乎在使用类属性,好像它们是应在整个类中访问的全局变量一样,而不是将这些值参数化为需要它们的函数。此外,应按特定顺序调用类的方法,因为否则该类不会做很多事情。 我怀疑这段代码是受建议的启发而提出的,即应保持方法简短(<= 5行代码),以避免大的参数列表(<3个参数),并且构造函数一定不能工作(例如执行某种计算)这对于对象的有效性至关重要。 现在,如果可以证明当未按特定顺序调用方法时,可能会出现各种不确定的错误,那么我当然可以反对这种模式。但是,我预测对此的响应将是添加验证,以验证一旦调用需要设置那些属性的方法,就必须设置属性。 但是,我宁愿建议完全更改代码,以使该类成为实际对象的蓝图,而不是应按特定顺序调用(过程上)的一系列方法。 我觉得我遇到的代码有异味。实际上,我相信在何时将值保存在类属性中以及何时将其保存到参数中以供不同方法使用方面存在明显的区别-我真的不相信它们可以彼此替代。我正在寻找这种区别的词。

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.