Questions tagged «object-oriented»

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


10
是否有任何理由使用“普通旧数据”类?
在旧版代码中,我偶尔会看到只不过是数据包装器的类。就像是: class Bottle { int height; int diameter; Cap capType; getters/setters, maybe a constructor } 我对OO的理解是,类是数据的结构以及对该数据进行操作的方法。这似乎排除了此类对象。对我而言,它们无非是structs一种失败的面向对象的目的。我认为这不一定是邪恶的,尽管它可能是一种代码味道。 是否存在这样的对象必要的情况?如果经常使用,是否会使设计令人怀疑?

7
完整的不变性和面向对象的编程
在大多数OOP语言中,对象通常是可变的,只有少数例外(例如,python中的元组和字符串)。在大多数功能语言中,数据是不可变的。 可变对象和不可变对象都带来了它们自己的优点和缺点的完整列表。 有一些语言试图将两个概念结合起来,例如scala,其中您拥有(明确声明的)可变和不可变的数据(如果我错了,请更正我,我对scala的了解远远超过了限制)。 我的问题是:在OOP上下文中,完全(原文如此)不变性(即对象一旦创建就不能变异)是否有意义? 是否有这种模型的设计或实现? 基本上,(完整的)不变性和OOP是对立的还是正交的? 动机:在OOP中,您通常对数据进行操作,更改(变异)基础信息,并在这些对象之间保留引用。例如,类的对象Person具有father引用另一个Person对象的成员。如果更改父亲的名字,则该子对象立即可见,无需更新。由于不可变,您将需要为父亲和孩子构造新的对象。但是与共享对象,多线程,GIL等相比,您将减少很多麻烦。

3
编程SOLID原理
随着时间的推移,我可以理解SOLID的两个部分-“ S”和“ O”。 “ O” –我在继承和策略模式的帮助下学习了开放式封闭原则。 “ S” –我在学习ORM时学会了单一职责原则(持久性逻辑从领域对象中删除)。 以类似的方式,学习SOLID的其他部分(“ L”,“ I”和“ D”)的最佳区域/任务是什么? 参考文献 msdn-违反C#中的SOLID原则的危险 channel9-在.NET / C#中应用SOLID原理 OOPS原则(SOLID原则)

3
控制器调用存储库而不是服务是不好的做法吗?
控制器调用存储库而不是服务是不好的做法吗? 解释更多: 我发现,在好的设计控制器中,可以调用服务和服务使用存储库。 但有时在控制器中,我不需要任何逻辑,只需要从db中获取并将其传递给视图即可。 而且我可以通过调用存储库来做到这一点-无需调用服务-这是不好的做法吗?

9
“避免溜溜球问题”是允许“原始痴迷”的正当理由吗?
根据什么时候原始的迷恋不是代码气味?,我应该创建一个ZipCode对象来代表一个邮政编码而不是一个String对象。 但是,根据我的经验,我更喜欢看到 public class Address{ public String zipCode; } 代替 public class Address{ public ZipCode zipCode; } 因为我认为后者需要我转到ZipCode类才能理解该程序。 而且我相信如果每个原始数据字段都被一个类替换,那么我需要在许多类之间移动以查看定义,这感觉就像是在遭受溜溜球问题(一种反模式)。 因此,我想将ZipCode方法移到新类中,例如: 旧: public class ZipCode{ public boolean validate(String zipCode){ } } 新: public class ZipCodeHelper{ public static boolean validate(String zipCode){ } } 因此只有需要验证邮政编码的人才能依赖ZipCodeHelper类。而且我发现保持原始痴迷的另一个“好处”是:它使类看起来像其序列化形式(如果有),例如:带有字符串列zipCode的地址表。 我的问题是,“避免溜溜球问题”(在类定义之间移动)是否是允许“原始痴迷”的有效理由?

8
不代表任何内容的类-是否正确?
我只是在设计应用程序,不确定我是否正确理解SOLID和OOP。类应该做一件事情并且做得很好,但另一方面,它们应该代表我们所使用的真实对象。 就我而言,我对数据集进行特征提取,然后进行机器学习分析。我假设我可以创建三个类 FeatureExtractor 数据集 分析仪 但是FeatureExtractor类不代表任何东西,它的作用使它比类更像是一个例程。它只有一个将要使用的函数:extract_features() 创建不代表一件事而是做一件事的类是否正确? 编辑:不确定是否重要,但我正在使用Python 并且如果extract_features()看起来像这样:是否值得创建一个特殊的类来保存该方法? def extract_features(df): extr = PhrasesExtractor() extr.build_vocabulary(df["Text"].tolist()) sent = SentimentAnalyser() sent.load() df = add_features(df, extr.features) df = mark_features(df, extr.extract_features) df = drop_infrequent_features(df) df = another_processing1(df) df = another_processing2(df) df = another_processing3(df) df = set_sentiment(df, sent.get_sentiment) return df

8
一个班级的真正责任是什么?
我一直想知道在OOP中使用基于名词的动词是否合法。 我遇到了这篇精彩的文章,尽管我仍然不同意它的观点。 为了进一步解释该问题,文章指出,例如,不应有一个FileWriter类,但是由于编写是一种动作,因此它应该是该类的方法File。您将认识到它通常与语言相关,因为Ruby程序员可能会反对使用FileWriter类(Ruby使用方法File.open来访问文件),而Java程序员则不会。 我个人的观点(是的,非常谦虚)是,这样做会违反“单一责任”原则。当我用PHP编程时(因为PHP显然是OOP的最佳语言,对吗?),我经常会使用这种框架: <?php // This is just an example that I just made on the fly, may contain errors class User extends Record { protected $name; public function __construct($name) { $this->name = $name; } } class UserDataHandler extends DataHandler /* knows the pdo object */ { public function …


6
如果我的函数很复杂并且有很多变量,我应该创建一个类吗?
这个问题在某种程度上与语言无关,但并非完全与语言无关,因为面向对象编程(OOP)在Java中是不同的,而Java没有Python的一流功能。 换句话说,我对用Java之类的语言创建不必要的类感到内gui,但是我觉得在像Python这样少用的语言中可能会有更好的方法。 我的程序需要多次执行相对复杂的操作。该操作需要大量的“簿记”,必须创建和删除一些临时文件,等等。 这就是为什么它还需要调用许多其他“子操作”的原因-将所有内容放入一个巨大的方法中并不是很好,模块化,可读性强等。 现在这些是我想到的方法: 1.制作一个仅具有一个公共方法的类,并将子操作所需的内部状态保留在其实例变量中。 它看起来像这样: class Thing: def __init__(self, var1, var2): self.var1 = var1 self.var2 = var2 self.var3 = [] def the_public_method(self, param1, param2): self.var4 = param1 self.var5 = param2 self.var6 = param1 + param2 * self.var1 self.__suboperation1() self.__suboperation2() self.__suboperation3() def __suboperation1(self): # Do something with self.var1, self.var2, …

5
将函数作为参数传递给其他函数,不好的做法?
我们一直在改变AS3应用程序与后端通信的方式,并且正在实现REST系统以替换旧系统。 不幸的是,开始工作的开发人员现在正在休长期病假,并且已移交给我。在过去的一周左右的时间里,我一直在使用它,并且我了解该系统,但是有一件事让我感到担心。函数似乎有很多传递给函数。例如,调用服务器的类具有一个函数,该函数将在过程完成且已处理错误时调用并传递对象。 它给我一种“糟糕的感觉”,让我感觉这是一种可怕的做法,我可以想到一些原因,但是在我建议对系统进行重新设计之前,我需要一些确认。我想知道是否有人对这个可能的问题有任何经验?

9
在进行TDD时需要记录日志吗?
在进行红色,绿色和重构循环时,我们应始终编写最少的代码以通过测试。这就是我被教导有关TDD的方式,以及几乎所有书籍都描述该过程的方式。 但是日志记录呢? 老实说,除非发生真正复杂的事情,否则我很少在应用程序中使用日志记录,但是,我看到无数篇文章都谈到了正确日志记录的重要性。 因此,除了记录异常外,我无法证明在适当的经过测试的应用程序(单元/集成/验收测试)中记录日志的真正重要性。 所以我的问题是: 如果正在执行TDD,是否需要记录?失败的测试不会揭示应用程序有什么问题吗? 是否应该在每个类的每个方法中为日志记录过程添加测试? 例如,如果在生产环境中禁用了某些日志级别,这是否会在测试和环境之间引入依赖性? 人们谈论日志如何简化调试,但是TDD的主要优点之一是,我始终知道由于测试失败而出了什么问题。 有什么我想念的吗?

9
为什么要将一个类声明为抽象类?
我知道应用于抽象类的语法,规则,并且想知道抽象类的用法 抽象类不能直接实例化,但可以被其他类扩展 这样做的好处是什么? 它与接口有何不同? 我知道一个类可以实现多个接口,但只能扩展一个抽象类。接口和抽象类之间的唯一区别是吗? 我知道接口的用法。我从Java中AWT的事件委托模型中学到了这一点。 在哪种情况下我应该将类声明为抽象类?那有什么好处?

12
OOP中的文档应避免指定“ getter”是否执行任何计算?
我学校的CS程序避免了任何有关面向对象编程的问题,所以我一直在自己做一些阅读来补充它-特别是Bertrand Meyer的面向对象软件构造。 Meyer反复指出,类应隐藏尽可能多的有关其实现的信息,这是有道理的。特别是,他反复指出,属性(即类的静态,非计算属性)和例程(与函数/过程调用相对应的类的属性)应该是无法区分的。 例如,如果一个类Person具有属性age,他断言,它应该是不可能告诉,从符号,是否Person.age相当于国内喜欢的东西return current_year - self.birth_date或干脆return self.age,其中self.age已被定义为一个常量属性。这对我来说很有意义。但是,他继续声称以下内容: 将设计类的标准客户端文档(称为类的简称),以免透露给定功能是属性还是函数(在可能的情况下)。 即,他声称即使是该类的文档也应避免指定“ getter”是否执行任何计算。 这,我不明白。难道文档不是将这种区别告知用户的重要场所吗?如果我要设计一个包含Person对象的数据库,那么知道是否Person.age是一个昂贵的调用就不重要了,那么我可以决定是否为其实现某种缓存?我是否误解了他的意思,还是他只是OOP设计哲学的一个极端例子?

4
UML类图符号:关联,聚合和组成之间的区别
我对UML类图的某些表示感到困惑。 我很确定我知道协会的意思。两个类的实例之间的任何关系(一个类的实例需要了解第二个类的实例才能执行其工作)都属于关联关系。关联通常意味着类A具有对类B实例的引用(字段)。 但是,我很难理解“ 聚合”和“ 组合”箭头的含义。我的部分困惑是由于遇到这些符号的不同定义引起的。 聚合符号的两个定义: 定义1:每当类A的实例持有类B的实例的集合(例如,列表,数组等)时,两个类之间的聚合符号就适用。 定义2:如果类A的实例持有对类B的实例的引用,并且实例B的依赖于实例A的生命周期,则两个类之间的聚合链接是合适的。含义:类A的实例被删除时,类B的实例也将被删除。类B的实例完全包含在类A的实例中,而不是类A的实例仅拥有对类A的引用的引用。 B类(常规协会)。 关于“组合”符号的含义以及它与“聚合”符号的区别,我不确定。 请澄清定义并帮助我理解。具体的例子将受到欢迎。

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.