Questions tagged «object-oriented»

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

4
那么,“艾伦·凯”这个真正的“面向对象”是什么意思?
据报道,艾伦·凯(Alan Kay)是“面向对象”一词的发明者。人们经常引用他所说的话,今天我们所说的面向对象不是他的意思。 例如,我刚刚在Google上找到了这个: 我用“面向对象”这个词来形容,我可以告诉你我没有C ++ -艾伦·凯(Alan Kay),OOPSLA '97 我依稀记得听到一些非常有见地的关于他没有意思。类似于“消息传递”的东西。 你知道他的意思吗?您能否详细说明他的意思以及它与当今常见的OO有何不同?如果有的话,请分享一些参考。 谢谢。

10
OOP中的零行为对象-我的设计难题
OOP背后的基本思想是数据和行为(基于数据)是不可分割的,并且它们与类对象的思想联系在一起。对象具有与之配合使用的数据和方法(以及其他数据)。显然,根据OOP的原理,仅仅是数据的对象(如C结构)被视为反模式。 到现在为止还挺好。 问题是我注意到我的代码最近朝着这种反模式的方向发展。在我看来,我越努力实现隐藏在类与松散耦合设计之间的信息,我的类就越成为纯数据无行为类和所有行为无数据类的混合。 我通常以一种使类对其他类的存在的意识最小化并且对其他类的接口的知识最小化的方式设计类。我特别以自上而下的方式执行此操作,较低级别的类不了解较高级别的类。例如: 假设您有一个通用的纸牌游戏API。你上课了Card。现在,该Card课程需要确定玩家的可见度。 一种方法是有boolean isVisible(Player p)对Card类。 另一种是有boolean isVisible(Card c)对Player类。 我特别不喜欢第一种方法,因为它将有关较高级别的知识授予Player较低级别的知识Card。 取而代之的是,我选择了第三个选项,在该选项中,我们有一个Viewport类,给定一个,Player并且卡片列表确定了哪些卡片是可见的。 然而这种做法剥夺了两个Card和Player一个可能的成员函数的类。一旦完成了除卡片可见性之外的其他工作,就剩下了Card和Player类,它们仅包含数据,因为所有功能都是在其他类中实现的,这些类大多是没有数据的类,只是Viewport上面的方法。 这显然与OOP的主要思想背道而驰。 哪种方法正确?我应该如何进行最小化类相互依赖性和最小化假定的知识和耦合的任务,而又不会陷入怪异的设计中,其中所有低层类仅包含数据,而高层类包含所有方法?是否有人对类设计有任何第三种解决方案或观点可以避免整个问题? PS这是另一个例子: 假设您的类DocumentId是不可变的,只有一个BigDecimal id成员和该成员的吸气剂。现在,您需要在某处有一个方法,该方法会从数据库中获得该ID 的DocumentId返回值Document。 你呢: Document getDocument(SqlSession)在DocumentId类中添加方法,突然介绍有关您的persistence("we're using a database and this query is used to retrieve document by id"),用于访问数据库的API等知识。现在,此类也需要持久性JAR文件才能进行编译。 使用method添加其他类Document getDocument(DocumentId id),将DocumentId类保持为无效,无行为,类似于结构的类。


12
为什么C不被视为“面向对象”语言?
C似乎有自己的准对象,例如“结构”,可以将其视为对象(以我们通常认为的高级方式)。 而且,C文件本身基本上是单独的“模块”,对吗?那模块不是也像“对象”吗?我对为什么C(看上去与C ++如此相似)为何被视为低级“过程”语言感到困惑,而C ++却是高级“面向对象”语言。 *编辑:(澄清)为什么和在哪里,画线,什么是“对象”,什么不是?

15
是什么让C在OOP时代如此受欢迎?[关闭]
我用C和C ++编写了大量代码,但是没想到C是第二大流行语言,仅次于Java。 TIOBE编程社区索引 我很好奇为什么在这个OOP时代,C仍然如此流行?请注意,在前5种流行的编程语言中,有4种是“现代”的,面向对象的语言。 现在,我同意您可以在C中使用OOP,但这有点痛苦和不雅(至少与我猜想的C ++相比)。那么,是什么使C如此受欢迎?是效率吗?低级 绝大多数已经存在的库或其他库?

22
为什么OOP困难?[关闭]
当我开始使用一种面向对象的语言(Java)时,我几乎就成了“酷”并开始编码。在阅读了许多有关OOP的问题之后,直到最近我才真正考虑过它。我得到的总体印象是人们对此感到挣扎。既然我没有这么难过,也不会说我是个天才,所以我想我一定错过了一些东西或误解了。 为什么OOP难以理解?是很难理解?

22
因为不自然,OOP难吗?
人们常常可以听到,OOP自然对应于人们对世界的思考方式。但是我强烈不同意这种说法:我们(或者至少我)根据我们遇到的事物之间的关系来概念化世界,但是OOP的重点是设计各个类及其层次结构。 注意,在日常生活中,关系和动作主要存在于对象之间,这些对象本来是OOP中无关类的实例。这样的关系的示例是:“我的屏幕在桌子的顶部”;“我(一个人)坐在椅子上”;“道路上有汽车”;“我正在键盘上打字”;“咖啡机煮水”,“文本显示在终端窗口中”。 我们以二价(有时是三价,例如“我给你送花”一词)动词来思考,其中动词是对两个对象进行操作以产生某种结果/动作的动作(关系)。的焦点是关于动作,两个(或三个)[语法]对象具有同等的重要性。 与OOP相反,在OOP中,您首先必须找到一个对象(名词),并告诉它对另一个对象执行某些操作。思维方式从对名词进行操作的动作/动词转变为对名词进行操作的名词-好像一切都是被动或反身的声音所说的,例如,“文本正在终端窗口中显示”。或者也许是“文本在终端窗口上绘制自身”。 不仅焦点转移到了名词上,而且一个名词(我们称其为语法主语)比另一个名词(语法对象)具有更高的“重要性”。因此,必须决定是说terminalWindow.show(someText)还是someText.show(terminalWindow)。但是,当一个人真正表示show(terminalWindow,someText)时,为什么要给这些琐碎的决定加重负担却又没有任何操作后果呢?[结果在操作上无关紧要-在两种情况下,文本都显示在终端窗口上-但是在类层次结构的设计中可能非常严重,并且“错误”的选择可能导致复杂的代码和难以维护的代码。] 因此,我要指出,进行OOP(基于类,单派遣)的主流方法很困难,因为它是不自然的,并且与人类对世界的看法不符。CLOS的通用方法更接近于我的思维方式,但是,可惜,这不是普遍的方法。 鉴于这些问题,为什么/为什么发生当前流行的OOP方式如此流行?可以采取什么行动来废除王位呢?

10
您如何避免吸气剂和吸气剂?
我在以oo方式设计类时遇到了一些困难。我已经读过对象暴露了他们的行为,而不是数据。因此,给定类的方法应该是“动词”或对对象执行的操作,而不是使用getter / setter修改数据。例如,在“帐户”对象,我们将有方法Withdraw()和Deposit(),而不是setAmount()等请参见:为什么getter和setter方法是邪恶的。 因此,例如,给定一个Customer类,该类保留了大量有关客户的信息,例如Name,DOB,Tel,Address等,那么如何避免使用getter / setter来获取和设置所有这些属性?一个人可以写哪种“行为”类型的方法来填充所有数据?

4
富域模型-行为如何准确地适应?
在Rich与Anemic领域模型的辩论中,互联网充满了哲学上的建议,但缺乏权威的例子。这个问题的目的是找到适当的领域驱动设计模型的明确指南和具体示例。(理想情况下为C#。) 对于一个实际示例,这种DDD实现似乎是错误的: 下面的WorkItem域模型不过是属性包,由Entity Framework用于代码优先数据库。按照福勒的说法,这是贫血的。 WorkItemService层显然是对域服务的常见误解。它包含WorkItem的所有行为/业务逻辑。Per Yemelyanov等人认为,这是程序性的。(第6页) 因此,如果以下内容是错误的,我该怎么做呢? 该行为,即AddStatusUpdate或Checkout,应该属于WorkItem类吗? WorkItem模型应具有哪些依赖关系? public class WorkItemService : IWorkItemService { private IUnitOfWorkFactory _unitOfWorkFactory; //using Unity for dependency injection public WorkItemService(IUnitOfWorkFactory unitOfWorkFactory) { _unitOfWorkFactory = unitOfWorkFactory; } public void AddStatusUpdate(int workItemId, int statusId) { using (var unitOfWork = _unitOfWorkFactory.GetUnitOfWork<IWorkItemUnitOfWork>()) { var workItemRepo = unitOfWork.WorkItemRepository; var workItemStatusRepo …

13
OOP中的对象是否必须代表实体?
对象是否必须代表实体? 由一个实体我的意思是这样一个Product,Motor中,ParkingLot等,物理,或甚至一个明确的非物理概念对象-这被很好地定义,其中一些核心数据清楚地属于对象的东西,以及一些功能/方法显然对核心数据起作用。 例如,我可以有一个对象,Demon它本身是一个实体,一个虚构的对象,也许不是物理的,但仍然是一个实体 一个对象可以仅仅是方法的集合,一组与一个共同目标相联系的通用过程吗? 示例:可以在没有实体的情况下调用MotorOperations或的类MotorActions,但是该类内部的方法可以执行以下操作 getMotorDataFromHTMLForm() getMotorManufacturers() selectMotorFromUserRequirements($ requirements) canMotorCanHandleOperatingConditions($ conditions) computePowerConsumptionForMotor($ id) 通常将类定义为对象的中心数据+数据操作。因此,Motor对于可能存在一些与电动机规格有关的电动机变量,并且可能存在将这些数据组合以产生某些结果的操作。 就我而言,这更像是我有一个对数据+ 通过该类传递数据的操作的类,除了临时传递类数据之外,没有任何以“ Motor Operations”为中心的数据。 题 类可以表示无实体的对象吗?如果不是,为什么它们不好/不完整/不以OOP为中心?有什么方法需要在概念上进行更改/改进以符合OOP?

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

12
面向对象编程比过程编程有什么好处?
我试图了解过程语言(例如C)和面向对象的语言(例如C ++)之间的区别。我从未使用过C ++,但我一直在和朋友们讨论如何区分两者。 有人告诉我C ++具有面向对象的概念以及定义变量的公共模式和私有模式:C语言没有。在Visual Basic.NET中开发程序时,我从来不需要使用它们:这些有什么好处? 我还被告知,如果变量是公共变量,则可以在任何地方访问它,但是尚不清楚它与C之类的语言中的全局变量有何不同。还不清楚私有变量与局部变量有何不同。 我听到的另一件事是,出于安全原因,如果需要访问某个函数,则应首先继承该函数。用例是管理员应该只拥有所需的权限,而不是所有的权限,但是似乎有条件的也可以工作: if ( login == "admin") { // invoke the function } 为什么这不理想? 鉴于似乎有一种方法性的方法可以完成所有面向对象的编程,所以我为什么要关心面向对象的编程?


4
为什么许多软件开发人员违反开放/封闭原则?
为什么许多软件开发人员通过修改诸如重命名功能之类的东西在升级后会破坏应用程序而违反了开放/关闭原则? 在React库中出现快速和连续版本之后,这个问题就跳到了我的头上。 每隔一小段时间,我就会注意到语法,组件名称等方面的许多更改。 即将发布的React版本中的示例: 新的弃用警告 最大的变化是我们将React.PropTypes和React.createClass提取到了自己的包中。两者仍然可以通过主React对象访问,但是在开发模式下,使用其中任何一个都会将一次性弃用警告记录到控制台。这将使将来的代码大小优化成为可能。 这些警告将不会影响您的应用程序的行为。但是,我们意识到它们可能会引起一些挫败感,特别是如果您使用将console.error视为失败的测试框架。 这些更改是否被视为违反该原则? 作为React之类的初学者,我如何通过库中的这些快速更改来学习它(这是如此令人沮丧)?

7
为什么要使用私有静态方法?
我只是想解决一个问题。与具有私有可见性的普通方法相比,拥有私有静态方法有什么意义? 我本来以为拥有静态方法的一个优点是可以在没有类实例的情况下调用它,但是由于它的私有性,甚至有一点是静态的吗? 我能想到的唯一原因是,它有助于从概念上理解类级别(而不是对象级别)上的方法。

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.