Questions tagged «object-oriented»

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

1
包装第三方代码是否是对用户进行单元测试的唯一解决方案?
我正在进行单元测试,并且在我的一个类中,我需要从一种方法中发送邮件,因此使用构造函数注入,我将注入Zend_MailZend框架中的类的实例。 现在有人认为,如果一个库足够稳定并且不会经常更改,那么就无需对其进行包装。因此,假设这Zend_Mail是稳定的并且不会改变并且完全满足我的需求,那么我就不需要包装器了。 现在看一下我的课程Logger,该课程取决于Zend_Mail: class Logger{ private $mailer; function __construct(Zend_Mail $mail){ $this->mail=$mail; } function toBeTestedFunction(){ //Some code $this->mail->setTo('some value'); $this->mail->setSubject('some value'); $this->mail->setBody('some value'); $this->mail->send(); //Some } } 但是,单元测试要求我一次测试一个组件,因此我需要模拟Zend_Mail该类。另外,我违反了依赖倒置原则,因为我的Logger课程现在依赖于具体而非抽象。 现在,我如何Logger在不进行包装的情况下进行隔离测试Zend_Mail? 该代码在PHP中,但不一定必须提供答案。这更多的是设计问题,而不是特定于语言的功能

5
术语“纯OO语言”的正式定义?
我想不出SO兄弟姐妹之间有更好的位置提出这样的问题。最初,我想问“ python是纯OO语言吗?” 但是在尝试定义术语时,考虑到麻烦和人们的不适感,我决定从为术语本身获得明确的定义开始。 从创造该术语的Alan Kay博士的来信开始,这是相当公平的(请注意在生物学上类似于细胞或其他生物的灵感)。 有以下几种方法可以完成任务: 通过列出可以表现出(或不能表现出)某些独特且足以定义该术语的属性的编程语言来进行比较分析(尽管Smalltalk,Scala,Java等)是可能的示例,但IMO这种方式似乎并没有真正完成也不富有成果) 给出一个正式的定义(或接近它,例如以学术或数学的风格)。 给出一个完全依赖于具体语言的语义上下文或先验编程经验的哲学定义(社区一定有一定的成功解释的机会)。 我当前的版本:“如果某种编程(形式化)语言可以(在语法上)区分操作数和操作数,并推断每个操作数的类型是否是对象(就OOP而言),那么我们称之为只要该语言中至少有一种类型是对象,那么这种语言就是一种面向对象的语言。最后,如果所有类型的语言都是对象,我们将这种语言定义为纯(强)面向对象的语言。” 将不胜感激。如您所见,我只是根据术语“对象”(通常完全称为对象类)来进行定义。 [编辑] 另外,我使用(很容易理解的)类型概念,就像在类型化语言中一样。数据类型编程或面向类型的编程不仅是对程序文本的语法解释(即,如何处理文字和数据变量的某些值-演变为类型安全性的某种东西),而且可以归因于语言语法并以正式方式进行研究(使用数学逻辑)称为类型系统。注意,要求特定类型系统具有所谓的通用类型是定义OO语言纯净性的方法之一(有一些方法可以在语义上进行扩展)。 NB 如何回答: 如果您指定支持或解释您对术语和概念的理解的书或参考文献(通常是一个好的定义涵盖或参考了除基础知识以外的所有相关概念),它会有所帮助。 如果不清楚,请在可能的情况下注明答案/定义的缩进类别(请参见上文:1-以语言为例,2-数学逻辑,3-技术描述和编程原理) 分类很重要(也是因为术语OO包含在术语OO中),同时回答尝试将OO范式的元素与其他众所周知的方法进行混合(并且绝不会造成混淆/重叠),例如,通常可以覆盖模块化编程的元素/包含OO编程):尝试将OOP与功能编程,逻辑编程(尤其是高度专业化的),Abstarct数据类型(ADT),模块化,元编程(泛型和LISP的宏扩展时间)(包括或作为其一部分)进行区分,合同(例如Eiffel),面向方面(AO)(声明性和功能性分类之间的差异以及Dijkstra结构化的历史定义很明显) 关于难以给出正式定义的困难:令人惊讶的是,以某种逻辑(正式)系统(最有可能基于类型)的形式给出OOP的数学描述,并一个接一个地定义一个概念非常容易。甚至可以尝试通过将形式主义应用于类型安全检查或新的语言设计方面来做一些更实际的事情,而不仅仅是抽象的娱乐或练习(还包括在直觉类型理论中对OOP的查找公式,从属类型,在FOL形式主义中独立地作为lambda计算)并仅使用类别理论)。这里的重点是毫不奇怪IMO最初对OOP的最不完全了解(在计算机工程中),使IMO的这种表达有很大的偏颇(有缺陷),并最终在之后几乎无法访问(因此几乎不对编程世界有所贡献-也许除了某些百分比会通过从应用程序世界中找回应用程序)集成到流行语言中)。 因此,是的,很难给出一个准确的“好”定义,而不仅仅是给出定义。但是我很高兴在这里提出这个问题,因为你们的经验和直接参与,伙计们。

5
函数式程序的可读性
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我对此感到很好奇,因为我在学习任何功能语言之前都回想起它们,我认为它们全都是可怕,可怕,难以理解的。既然我已经知道Haskell和f#,我发现花更少的时间来阅读更少的代码,但是那一点代码的功能远比命令语言中的等效功能要多得多,因此感觉像是纯收益,而且我并不是很极端在功能上练习。 这是我的问题,我不断地从OOP人士那里听到,功能样式非常难以理解。我很好奇是否是这种情况,并且我在自欺欺人,或者如果他们花时间学习一种功能语言,那么整个样式将不再比OOP更难以理解? 是否有人看到过任何证据或轶事,他们以一种或另一种方式频繁地说这句话?如果实际上编写功能的可读性较低,那么我不想继续使用它,但是我真的不知道是否是这种情况。

5
经典OOP优于Go语言
我一直在思考语言设计以及“理想”编程语言所必需的要素,而对Google Go的研究使我提出了很多其他常识。 具体来说,Go似乎从面向对象的编程中获得了所有有趣的好处,而实际上没有任何面向对象语言的结构。没有类,只有结构。没有类/结构继承-仅结构嵌入。没有任何层次结构,没有父类,没有显式的接口实现。取而代之的是,类型转换规则基于类似于鸭子类型的松散系统,因此,如果结构实现“阅读器”,“请求”或“编码”的必要元素,则可以对其进行转换并使用它作为一个。 用C ++和Java和C#实现的OOP是否具有某种固有的功能,更可维护,更强大的功能,而在转向Go这样的语言时,您必须放弃这些功能?为了获得这种新范例所代表的简单性,您必须放弃什么好处? 编辑 消除了读者似乎过分迷恋和激怒的“过时”问题。 问题是,在普通语言实现中经常看到的传统的面向对象范式(具有层次结构等)必须提供哪些在这种简单模型中无法轻松实现的范式?或者,换句话说,如果您今天要设计一种语言,是否有理由要包含类层次结构的概念?

5
单元测试程序代码有效吗?
在当前的项目中,希望将单元测试纳入我们的开发周期,以避免似乎不断渗入我们的代码中的错误数量。问题在于,意大利面条代码的程序化程度为95%,我从来没有使用过单元测试(我所有的单元测试经验都使用过OOP代码) 因此,我的问题简而言之是用我们当前的代码库进行单元测试,还是建议将其推迟到将应用程序迁移到适当的OOP框架后才是明智的选择? PS:当我尝试将这个问题的样式与语言无关时,我认为说明所涉及的应用程序使用PHP和javascript将有助于提供更具体的答案,从而可以回答该问题,因为从经验来看,此类应用程序大多会发生这种情况。

7
单例,抽象类和接口的作用是什么?
我正在学习C ++中的OOP,即使我知道这3个概念的定义,我也无法真正意识到何时或如何使用它。 让我们以此类为例: class Person{ private: string name; int age; public: Person(string p1, int p2){this->name=p1; this->age=p2;} ~Person(){} void set_name (string parameter){this->name=parameter;} void set_age (int parameter){this->age=parameter;} string get_name (){return this->name;} int get_age (){return this->age;} }; 1. 单身人士 类的限制如何只有一个对象起作用? CAN你设计一个类,将有只有 2个实例?也许3? 何时 /建议何时使用单例?这是好习惯吗? 2. 抽象类 据我所知,如果只有一个纯虚函数,则该类将变为抽象。因此,添加 virtual void print ()=0; 会做到的,对吧? 为什么需要一个不需要其对象的类? …

2
我对演员模型的描述正确吗?
据我了解,参与者模型就像对象模型一样,但是有一些区别: 每个对象都产生它自己的单独线程,即使有成千上万个对象,也不是问题。 参与者不是通过调用函数和获取返回值来进行交互,而是通过发送和接收消息来进行交互。 如果您不违反该模型,则您的应用将充分利用并发功能,而不会出现竞争状况的风险。 在OO中可以执行的所有操作都可以使用actor来完成,但更好的是,问题在于最近几年我们编写的所有内容都是基于OO的-但即将进行过渡。 因此,举例来说,假设我必须定义3d向量类/角色,创建两个实例,并对它们调用求和运算。 面向对象: class V3d { constructor V3d(x,y,z) //bla float x,y,z; function sum(V3d b) { return V3d(x+b.x,y+b.y,z+b.z); } } //using: mySum = V3d(1,2,3).sum(V3d(3,2,1)) //creates 2 instances, sum, returns instantly drawPoint(mySum) //uses the result 演员模型: actor V3d { constructor V3d(x,y,z) //bla float x,y,z; loop { receive 'sum',b:V3d …

3
应用SOLID原则
我对SOLID设计原则很陌生。我了解它们的原因和好处,但是我未能将它们应用到一个较小的项目中,我想将其重构为使用SOLID原理的实际练习。我知道没有必要更改运行正常的应用程序,但是无论如何我都希望对其进行重构,这样我才能获得未来项目的设计经验。 该应用程序具有以下任务(实际上还有很多任务,但让我们保持简单):它必须读取一个包含数据库表/列/视图等定义的XML文件,并创建一个SQL文件,该文件可用于创建ORACLE数据库架构。 (注意:请不要讨论为什么我需要它或为什么我不使用XSLT等,这是有原因的,但是它们不在主题之列。) 首先,我选择仅查看表和约束。如果忽略列,则可以通过以下方式声明它: 约束是表的一部分(或更准确地说,是CREATE TABLE语句的一部分),并且约束也可以引用另一个表。 首先,我将说明应用程序现在的外观(不应用SOLID): 目前,该应用程序具有“表”类,该类包含表所拥有的约束的指针列表以及引用该表的约束的指针列表。每当建立连接时,也会建立向后连接。该表具有createStatement()方法,该方法依次调用每个约束的createStatement()函数。所述方法本身将使用到所有者表和引用表的连接,以检索它们的名称。 显然,这根本不适用于SOLID。例如,存在循环依赖关系,这些依赖关系根据所需的“添加” /“删除”方法和一些大型对象析构函数使代码膨胀。 所以有两个问题: 我应该使用依赖注入来解决循环依赖吗?如果是这样,我想约束应该在其构造函数中接收所有者(以及可选的被引用)表。但是,如何在单个表的约束列表上运行呢? 如果Table类都存储自身的状态(例如,表名,表注释等)以及到约束的链接,那么考虑“单一职责原则”,这是一个还是两个“职责”? 如果情况2是正确的,我是否应该在管理链接的逻辑业务层中创建一个新类?如果是这样,1.显然不再相关。 应该将“ createStatement”方法作为Table / Constraint类的一部分,还是应该将它们移出?如果是这样,去哪儿?每个数据存储类(例如,表,约束等)一个管理器类?还是为每个链接创建一个管理器类(类似于3)? 每当我尝试回答这些问题之一时,我都会发现自己在某个地方盘旋。 如果您包括列,索引等,问题显然变得更加复杂,但是如果你们帮助我解决简单的Table / Constraint问题,我也许可以自己解决其他问题。

5
可以将面向对象的程序视为有限状态机吗?
这可能是一个哲学/基本问题,但我只想澄清一下。 在我的理解中,有限状态机是一种对系统建模的方式,其中系统的输出不仅取决于当前的输入,而且还取决于系统的当前状态。另外,顾名思义,可以将有限状态机及其各自的状态和行为划分为有限的N个状态。 如果这是正确的,难道不是每个带有数据和函数成员的对象都是我们的面向对象模型中的一个状态,从而使任何面向对象的设计成为有限状态机吗? 如果这不是对象设计中FSM的解释,那么人们在软件中实现FSM时到底意味着什么?我错过了什么吗? 谢谢

7
绕过不变性
我是面向对象编程的新手,一个需要我花一段时间才能掌握的概念是不变性。我认为昨晚灯泡熄灭了,但我想验证一下: 当我遇到无法更改不可变对象的声明时,我会感到困惑,因为例如,我可以执行以下操作: NSString *myName = @"Bob"; myName = @"Mike"; 在那里,我刚刚更改了不可变类型NSString的myName。我的问题是,“对象”一词可以指代内存中的物理对象,也可以指代“ myName”。前一个定义适用于不变性的概念。 对于变量,(对我而言)对不变性的更清楚的定义是,不变对象的值只能通过更改其在内存中的位置(即其引用(也称为指针))来更改。 这是正确的,还是我仍然迷失在树林中?

7
将压倒性代码分解为可管理块的最佳方法?
一旦大型项目达到一定程度的复杂性,我就会变得不知所措。一旦到达项目中的某个特定点,我的进度就会缓慢地爬行,并且发现自己不断地追踪自己的步骤并理清各种混乱。 由于我的这个弱点,我真的很擅长重构。而且我总是尝试将对象分解为更小,更易于管理的对象。这种弱点也可能导致我过多地注意正确设计事物。 我知道如果我可以将问题分解为较小的问题,那么我将能够顺利完成任务。想到的一种策略是测试驱动的开发。我还可以做些什么?

8
PHP如何面向对象?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我有机会与同事进行了有趣的对话。他们大多数是Flash操作脚本或Java开发人员。 我们讨论了php处理OOP的能力。我说过,PHP 5.2或5.3可以处理几乎所有OOP内容。我错了吗?我并不想获得是/否的答案,但我想听听开发人员的更多意见。

4
FP和OO正交?
我一次又一次听到,我试图理解和验证FP和OO是正交的。 首先,两个概念正交是什么意思? FP尽可能地鼓励不变性和纯度。OO似乎是为状态和突变而构建的(命令式编程的稍微组织的版本?)。而且我确实意识到对象可以是不可变的。但是OO似乎意味着对我声明/更改。 他们似乎是相反的。这是否意味着它们是正交的? 像Scala这样的语言可以轻松实现OO和FP两者,这是否会影响这两种方法的正交性?

6
通过逆转关系可以解决圆椭圆问题吗?
具有CircleextendEllipse违反了Liskov替换原理,因为它修改了后置条件:即,可以独立设置X和Y来绘制椭圆,但是对于圆,X必须始终等于Y。 但是,不是因为Circle是Ellipse的子类型引起的问题吗?我们不能扭转这种关系吗? 因此,Circle是超类型-它只有一个方法setRadius。 然后,椭圆通过添加setX和扩展Circle setY。调用setRadiusEllipse将同时设置X和Y-意味着保留setRadius的后置条件,但是现在您可以通过扩展接口独立设置X和Y。

1
我们在滥用静态方法吗?
几个月前,我开始从事一个新项目,在遍历代码时,它使我震惊了所使用的静态方法。它们不仅保留了实用程序方法collectionToCsvString(Collection<E> elements),而且还保留了大量业务逻辑。 当我问负责背后原因的那个人时,他说这是逃避斯普林暴政的一种方式。它围绕着这个思考过程进行了一些操作:要实现客户收据创建方法,我们可以提供服务 @Service public class CustomerReceiptCreationService { public CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } 现在,那个家伙说他不喜欢让Spring不必要地管理类,主要是因为它强加了限制,即客户类必须是Spring bean本身。我们最终将一切都由Spring管理,这几乎迫使我们以过程方式使用无状态对象。或多或少在这里说了什么https://www.javacodegeeks.com/2011/02/domain-driven-design-spring-aspectj.html 因此,除了上面的代码,他有 public class CustomerReceiptCreator { public static CustomerReceipt createReceipt(Object... args) { CustomerReceipt receipt = new CustomerReceipt(); // creation logic return receipt; } } …

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.