Questions tagged «object-oriented-design»

面向对象的设计是规划用于解决软件问题的交互对象系统的过程。

4
使用公共决赛而不是私人获得者
我看到大多数不变的POJO都是这样写的: public class MyObject { private final String foo; private final int bar; public MyObject(String foo, int bar) { this.foo = foo; this.bar = bar; } public String getFoo() { return foo; } public int getBar() { return bar; } } 但是我倾向于这样写它们: public class MyObject { public final String foo; …

7
为什么链式装订工非常规?
在bean上实现链接非常方便:无需重载构造函数,大型构造函数,工厂,并提高了可读性。我想不出任何弊端,除非您希望对象是不可变的,在这种情况下,它就不会有任何设置方法。那么,这不是OOP约定的原因吗? public class DTO { private String foo; private String bar; public String getFoo() { return foo; } public String getBar() { return bar; } public DTO setFoo(String foo) { this.foo = foo; return this; } public DTO setBar(String bar) { this.bar = bar; return this; } } //...// DTO …

4
异常传播:何时应捕获异常?
MethodA调用MethodB,然后依次调用MethodC。 在MethodB或MethodC中没有异常处理。但是在MethodA中有异常处理。 在MethodC中发生异常。 现在,该异常正在冒泡到MethodA,该方法可以适当地对其进行处理。 这有什么问题? 在我看来,在某个时候调用者将执行MethodB或MethodC,并且当这些方法中确实发生异常时,从这些方法内部处理异常中可以获得什么,这实际上只是一个try / catch / finally块,而不仅仅是让他们冒泡给被呼叫者? 围绕异常处理的陈述或共识是,仅在执行不能继续执行时抛出该异常。我明白了。但是,为什么不在链的更深处捕获异常,而不是让try / catch块一直向下传播。 当您需要释放资源时,我会理解的。完全是另一回事。

3
在MVC设计中将业务逻辑放在哪里?
我创建了一个简单的MVC Java应用程序,该应用程序通过数据表单将记录添加到数据库中。 我的应用程序收集数据,还对其进行验证和存储。这是因为数据是从其他用户在线获取的。数据本质上大部分是数字。 现在,在要存储到数据库(SQL Server)中的数字数据上,我希望我的应用执行计算并显示结果。用户对如何完成计算不感兴趣,因此必须将其封装。用户必须只能查看简单的计算数据(例如,A列数据减去B列数据除以C列数据)。我知道如何编写存储过程,但是我想要一个三层应用程序。 我希望通过对数据库进行计算来处理作为记录放入数据库中的数据。原始数据应保持不受影响,而新数据(计算后)必须作为新实体记录存储到数据库中。 我应该在哪里编写该后台计算代码?因为它是规则和业务逻辑,所以我应该将其放在新的JavaBeans文件中吗?

10
单元测试如何促进设计?
我们的同事提倡编写单元测试,因为它实际上是在帮助我们改进设计和重构事物,但我不知道如何做。如果我正在加载CSV文件并进行解析,那么单元测试(验证字段中的值)将如何帮助我验证设计?他提到了耦合和模块化等问题,但是对我而言,这没有多大意义-但我的理论背景并不多。 这与您标记为重复的问题不同,我将对实际示例如何起到帮助作用感兴趣,而不仅仅是理论上说“有帮助”。我喜欢下面的答案和评论,但我想了解更多。

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

9
编程以供将来使用接口
我旁边有一位同事,他设计了这样的界面: public interface IEventGetter { public List<FooType> getFooList(String fooName, Date start, Date end) throws Exception; .... } 问题是,现在,我们在代码中的任何地方都没有使用此“ end”参数,它只是存在,因为将来可能需要使用它。 我们试图说服他,将参数放入当前不使用的接口是一个坏主意,但是他坚持认为,如果我们实现一段时间的“结束”日期使用,则必须做很多工作之后,必须修改所有代码。 现在,我的问题是,是否有任何来源正在处理像“尊敬的”编码专家这样的主题,我们可以将其链接到?

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

6
为什么要避免Java继承“扩展”
詹姆斯·戈斯林说 “您应该尽可能避免实现继承。” 而是使用接口继承。 但为什么?如何避免使用关键字“ extends”继承对象的结构,同时使我们的代码面向对象? 有人可以在“在书店订购书”的情况下,提供一个面向对象的示例来说明此概念吗?

5
为什么继承一个类而不添加属性?
我在我们的(相当大的)代码库中发现了一个继承树,如下所示: public class NamedEntity { public int Id { get; set; } public string Name { get; set; } } public class OrderDateInfo : NamedEntity { } 据我所知,它主要用于绑定前端的东西。 对我来说,这很有意义,因为它为类提供了具体的名称,而不是依赖于generic NamedEntity。另一方面,有许多这样的类根本没有其他属性。 这种方法有什么缺点吗?

13
使用布尔参数确定值是否错误?
根据使用布尔参数确定行为是否错误?,我知道避免使用布尔参数来确定行为的重要性,例如: 原始版本 public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } 新版本: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } 但是,使用boolean参数来确定值而不是行为的情况如何呢?例如: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } 我试图消除isHintOn标志并创建2个单独的函数: public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public void setHintOff(){ this.layer1.visible=false; this.layer2.visible=true; this.layer3.visible=false; } …

9
在编写面向对象的代码时,我是否应该始终遵循设计模式?
任何面向对象的程序都有可想像的设计模式吗?我之所以这么问,是因为最近我看到了带有的Door类的实现Lock。这是测试的一部分,回答说代码遵循Null Object模式: class Lock { public: virtual void close() = 0; virtual void open() = 0; virtual bool is_open() const = 0; virtual ~Lock() { } }; class DummyLock : public Lock { private: DummyLock(); DummyLock(const DummyLock&) = delete; DummyLock& operator=(const DummyLock&) = delete; private: void close() { } void …

8
OOP是变得容易还是困难?[关闭]
几年前,当面向对象编程的概念被介绍给程序员时,它看起来很有趣并且编程更加简洁。OOP就是这样 Stock stock = new Stock(); stock.addItem(item); stock.removeItem(item); 使用自描述名称更容易理解。 但是现在,具有数据传输对象,值对象,存储库,依赖注入等模式的OOP变得更加复杂。为了达到上述目的,您可能必须创建多个类(例如abstract,factory,DAO等)并实现多个接口 注意:我不反对使协作,测试和集成更容易的最佳实践

6
如何测试难以模拟对象的系统?
我正在使用以下系统: Network Data Feed -> Third Party Nio Library -> My Objects via adapter pattern 最近,我们遇到了一个问题,即我更新了所使用的库的版本,这尤其导致时间戳(第三方库返回该时间戳long)从时期后的毫秒数更改为时期后的毫微秒。 问题: 如果编写模拟第三方库对象的测试,则如果我对第三方库的对象犯了错误,则我的测试将是错误的。例如,我没有意识到时间戳会改变精度,这导致需要更改单元测试,因为我的模拟返回了错误的数据。这不是库中的错误,它的发生是因为我错过了文档中的某些内容。 问题是,我无法确定这些数据结构中包含的数据,因为如果没有真实的数据馈送,我将无法生成真实的数据。这些对象又大又复杂,并且其中包含许多不同的数据。第三方库的文档很差。 问题: 如何设置测试以测试此行为?我不确定我可以在单元测试中解决此问题,因为测试本身很容易出错。另外,集成系统又大又复杂,容易遗漏一些东西。例如,在上述情况下,我已经在几个地方正确地调整了时间戳记处理,但是我错过了其中之一。在我的集成测试中,该系统似乎在做正确的事情,但是当我将其部署到生产环境(具有大量数据)时,问题变得很明显。 我目前没有集成测试过程。测试本质上是:尝试保持单元测试良好,在出现问题时添加更多测试,然后部署到我的测试服务器并确保一切正常,然后部署到生产中。这个时间戳问题通过了单元测试,因为模拟创建错误,然后通过了集成测试,因为它没有引起任何直接的,明显的问题。我没有质量检查部门。

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.