Questions tagged «object-oriented»

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

3
避免构造函数有很多参数
所以我有一个工厂,可以创建不同类的对象。可能的类都是从抽象祖先派生的。工厂具有配置文件(JSON语法),并根据用户的配置来决定要创建哪个类。 为此,工厂使用boost :: property_tree进行JSON解析。他遍历ptree并决定要创建哪个具体对象。 但是,产品对象具有许多字段(属性)。根据具体的类,对象具有大约5-10个属性,将来可能会更多。 因此,我不确定对象的构造函数应如何。我可以想到两种解决方案: 1)产品的构造函数希望将每个属性作为参数,因此构造函数最终将带有10个以上的参数。这将是丑陋的,并导致较长的,不可读的代码行。但是,优点是工厂可以解析JSON并使用正确的参数调用构造函数。产品类不需要知道由于JSON配置而已创建。不需要知道完全涉及JSON或配置。 2)产品的构造函数只需要一个参数property_tree对象。然后,它可以解析所需的信息。如果配置中的信息丢失或超出范围,则每个产品类别都可以正确响应。工厂不需要知道几种产品需要哪些参数。如果配置错误,工厂也不需要知道如何应对。而且构造函数的接口是统一的,很小的。但是,缺点是,该产品需要从JSON中提取所需的信息,因此,它知道如何构造它。 我倾向于选择解决方案2)。但是,我不确定这是否是好的工厂模式。让产品知道它是用JSON配置创建的,这感觉有点不对劲。另一方面,可以很简单地介绍新产品。 有什么意见吗?

2
为什么我们需要Scanner类的实例才能在Java上获得输入?
Java是面向对象的,但是,为什么我们需要从Scanner类创建一个对象来获取输入?next()例如,方法不能只是静态的吗? C相我很简单,因为你只需要使用scanf(),gets()或fgets()。我确定Java开发人员有理由创建Scanner类,但是这比仅具有正常功能来完成工作更好吗? 我发现此链接似乎在问相同的问题,但答案仅与 “您需要创建一个对象,因为它不是静态的” ... 我的猜测是:由于Java是面向对象的,因此他们决定将所有输入方法放在一个类中。他们没有执行静态方法,因此您可以在不同的对象中拥有各种不同的源(键盘输入,文件输入...)? 如果有人可以编辑问题以使其听起来更加清晰,我将不胜感激!

3
继承:是将代码从超类实际上“复制”到子类,还是“由子类”引用?
类Sub是class的子类Sup。这实际上意味着什么?换句话说,“继承”的实际含义是什么? 选项1:将Sup中的代码虚拟复制到Sub。(如在“复制-粘贴”,但没有复制的代码视觉上在子类中看到的)。 示例:methodA()最初是Sup中的一种方法。Sub扩展了Sup,因此methodA()(实际上)被复制粘贴到Sub。现在Sub具有一个名为的方法methodA()。它methodA()在每一行代码中均与Sup相同,但完全属于Sub,并且不依赖于Sup或以任何方式与Sup相关。 选项2: Sup中的代码实际上没有复制到Sub。它仍然只在超类中。但是该代码可以通过子类访问,并且可以由子类使用。 示例:methodA()是Sup中的一种方法。Sub扩展了Sup,因此现在methodA()可以通过Sub进行访问,如下所示:subInstance.methodA()。但这实际上将methodA()在超类中调用。这意味着methodA()将在超类的上下文中运行,即使它是由子类调用的。 问题:这两个选项中的哪一个实际上是如何工作的?如果它们都不是,那么请描述这些事情实际上是如何工作的。

4
在创建松耦合设计上应该投入多少精力?
我目前正在学习设计模式。 我认为大多数人都同意这些模式是很好的工具,但应谨慎使用,而不是所有问题的答案。过多使用它们会使应用程序过于复杂,几乎没有好处。模式应仅在可能是最佳解决方案或有助于创建好的解决方案的地方使用(您同意吗?)。 考虑到这一点: 我正在阅读的书(Head First设计模式)经常强调松散耦合的重要性。这种松散耦合是通过遵循以下原则来实现的,例如“对接口编程,而不是实现”和“封装变化的内容”。 基本上,到目前为止,我学到的大多数模式都主要用于使设计能够松散耦合,从而更加灵活。 我了解松耦合的重要性和好处。 但是我的问题是,一个人应该实际投入多少精力来创建松耦合,灵活的设计? 那些反对设计模式的人说,使用这些模式的成本通常会超过收益。您需要花费大量时间来使用某种模式来创建松耦合的设计,而实际上-松耦合,“编程到接口而不是实现”以及所有这些原理实际上可能并不那么重要。 我想知道的是,我实际上应该在创建附加级别的抽象和设计上付出多少努力,才允许我的应用程序遵循OO原则,例如松散耦合,接口编程等,这真的值得吗?它?我应该为此付出多少努力?

12
“如果重新使用某个方法而不进行更改,将该方法放在基类中,否则创建一个接口”是否是一种很好的经验法则?
我的一位同事想出了一个在创建基类或接口之间进行选择的经验法则。 他说: 想象一下您将要实现的每个新方法。对于它们中的每一个,请考虑以下问题:是否可以由多个类以完全相同的形式实现此方法,而无需进行任何更改?如果答案为“是”,则创建一个基类。在其他所有情况下,请创建一个接口。 例如: 考虑类cat和dog,它们扩展了类mammal并具有一个方法pet()。然后我们添加类alligator,该类不会扩展任何内容并且具有一个方法slither()。 现在,我们要eat()为所有这些方法添加一个方法。 如果实施eat()方法将是完全一样的cat,dog而且alligator,我们应该创建一个基类(比方说,animal),它实现了这个方法。 但是,如果它的实现alligator有丝毫不同,我们应该创建一个IEat接口并制作mammal和alligator实现它。 他坚持认为这种方法适用于所有情况,但对我来说似乎过于简化了。 遵循此经验法则是否值得?

3
Ruby和C ++中的OOP术语
我正在学校上C ++课程。由于我使用Ruby编程,因此我了解一些OOP知识。 但是在C ++中,有成员函数,成员变量和静态函数。在Ruby中,我们有实例方法,实例变量和类变量。还有更多... 他们有什么不同的原因吗?它们的OOP级别是否完全不同?还是这些生态系统在传统上存在一些差异?


4
如何避免抽象类的通用名称?
通常,最好避免将诸如“ handle”或“ process”之类的单词作为例程名称和类名称的一部分,除非您要处理(例如)文件句柄或(例如)unix进程。但是,抽象类通常并不真正知道它们除了处理之外还打算做什么。在当前情况下,我有一个“ EmailProcessor”,它可以登录到用户的收件箱并处理来自该收件箱的消息。尽管我注意到出现了以下样式问题,但我仍然不清楚如何给它一个更精确的名称: 更好地将派生类视为客户端,并通过其实现的功能的一部分来命名基类?给它更多的含义,但会违反is-a。例如,EmailAcquirer是一个合理的名称,因为它是为派生类获取的,但是派生类将不会为任何人获取。 或只是名字含糊不清,因为谁知道派生类将做什么。但是,“处理器”仍然过于笼统,因为它正在执行许多相关的操作,例如登录和使用IMAP。 摆脱这种困境有什么办法吗? 对于抽象方法,问题更加明显,在抽象方法中,您不能真正回答“这是做什么的”问题。因为答案仅仅是“客户想要的任何东西”。

9
如果全局变量有意义?
我拥有许多对象所需的价值。例如,一个以不同投资为对象的金融应用程序,其中大多数需要当前利率。 我希望将我的“金融环境”封装为一个对象,而利率作为一种属性。但是,需要该值的同级对象无法实现。 那么,如何在多个对象之间共享价值却又不会过度耦合我的设计?显然我在想这个错误。

4
处理响应的设计模式
大多数时候,当我编写一些代码来处理某个函数调用的响应时,我会得到以下代码结构: 示例:此功能将处理登录系统的身份验证 class Authentication{ function login(){ //This function is called from my Controller $result=$this->authenticate($username,$password); if($result=='wrong password'){ //increase the login trials counter //send mail to admin //store visitor ip }else if($result=='wrong username'){ //increase the login trials counter //do other stuff }else if($result=='login trials exceeded') //do some stuff }else if($result=='banned ip'){ //do …

2
在php中初始化类成员的最佳实践
我的构造函数中有很多这样的代码:- function __construct($params) { $this->property = isset($params['property']) ? $params['property'] : default_val; } 这样做比在属性定义中指定默认值好吗?即public $property = default_val?有时默认值存在逻辑,某些默认值取自其他属性,这就是为什么我在构造函数中执行此操作。 我应该使用设置器,以便将默认值的所有逻辑都分开吗?

3
方法重载什么时候合适?
假设我正在开发一个现有的,相当大的系统。我有一个myObject类的对象MyClass(出于示例的原因,假设我正在Java中工作)。myObject是一种含有一种组合物Collection,比方说,一个List和其它目的(我认为)是无关紧要的。它包含委托方法,这些委托方法仅用于调用List它所组成的方法,以确保List它所具有的不暴露(对不起,如果我的术语错误)。 假设这List是一个,List<String>但是由于某种原因,主要的访问方法是class的mask方法SomeOtherClass。如果要在其中插入一个新的值对List,则需要一个SomeOtherClass名为的对象someObject。我会打电话给,myObject.insert(someObject)并且在insert方法内部将有一些魔术可以检索String到中放入List<String>。 现在假设我只有一个String值,没有SomeOtherClass要插入的对象。假设我无法修改该insert方法,因为它会破坏系统中的所有内容。那我应该重载该insert方法吗?还是应该在SomeOtherClass每次调用时创建一个新对象insert? 我想如果我确实超载了,它会看起来像这样…… public void insert(String s) { ... } public void insert(SomeOtherObject obj) { this.insert(obj.magicStringMethod()); } (此示例是一个人为的难题,它基于我昨天遇到的关于超载的类似(稍微复杂一些)情况。如果有不清楚的地方,我将对其进行扩展) 这是重载方法的合适地方吗?如果没有,我什么时候应该重载方法?

9
我应该将对象传递给构造函数,还是在类中实例化?
考虑以下两个示例: 将对象传递给构造函数 class ExampleA { private $config; public function __construct($config) { $this->config = $config; } } $config = new Config; $exampleA = new ExampleA($config); 实例化课程 class ExampleB { private $config; public function __construct() { $this->config = new Config; } } $exampleA = new ExampleA(); 处理将对象添加为属性的正确方法是哪种?我什么时候应该使用另一个?单元测试会影响我应该使用的内容吗?

2
扩展类以重用单个函数是否合理?
我正在为wordpress网站开发一系列的帖子过滤器,并且已经用一个类构建了前四个。 最后两个在作用域上有足够的不同,以使其类中仅共享一个函数(用于产生最终链接的函数)。 在这种情况下或在任何数量的类似假设情况下,扩展原始类以具有该功能是否合理,还是有更好的方法?

3
如何删除重复的代码(通常)?
使用OO语言(例如但不限于Java),如何根据重复发生的范围来修复重复的代码?我将从(例如)开始 在同一个类(范围)中执行提取方法重构(修复) 在相同层次结构的类(范围)中执行提取方法和上拉(修复) ...

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.