Questions tagged «object-oriented»

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


5
许多小类与逻辑(但)复杂的继承
我想知道在良好的OOP设计,干净的代码,灵活性以及将来避免代码异味方面有什么更好的选择。图像情况,您需要将很多非常相似的对象表示为类。这些类没有任何特定的功能,只是数据类,而只是名称(和上下文)不同而已。示例: Class A { String name; string description; } Class B { String name; String count; String description; } Class C { String name; String count; String description; String imageUrl; } Class D { String name; String count; } Class E { String name; String count; String imageUrl; String age; …

5
加载应用程序设置的最佳方法
保留Java应用程序设置的一种简单方法是使用扩展名为“ .properties”的文本文件表示,该文件包含与特定值(此值可以是数字,字符串,日期等)关联的每个设置的标识符。 。C#使用类似的方法,但文本文件必须命名为“ App.config”。在这两种情况下,都必须在源代码中初始化一个特定的类来读取设置:此类具有一种方法,该方法返回与指定的设置标识符关联的值(作为字符串)。 // Java example Properties config = new Properties(); config.load(...); String valueStr = config.getProperty("listening-port"); // ... // C# example NameValueCollection setting = ConfigurationManager.AppSettings; string valueStr = setting["listening-port"]; // ... 在这两种情况下,我们都应该解析从配置文件加载的字符串,并将转换后的值分配给相关的类型化对象(在此阶段可能发生解析错误)。解析步骤之后,我们必须检查设置值是否属于特定的有效域:例如,队列的最大大小应为正值,某些值可能是相关的(例如:min <max ), 等等。 假设应用程序应在启动时立即加载设置:换句话说,应用程序执行的第一个操作是加载设置。设置的任何无效值必须自动替换为默认值:如果一组相关设置发生这种情况,则这些设置都将设置为默认值。 执行这些操作的最简单方法是创建一个方法,该方法首先解析所有设置,然后检查加载的值,最后设置任何默认值。但是,如果使用这种方法,维护将很困难:随着开发应用程序时设置数量的增加,更新代码变得越来越困难。 为了解决此问题,我想到了如下使用“ 模板方法”模式。 public abstract class Setting { protected abstract bool TryParseValues(); protected …

7
只做一件事的类的模式
假设我有一个程序可以执行以下操作: void doStuff(initalParams) { ... } 现在,我发现“做事”是相当复杂的操作。该过程变得很大,我将其拆分为多个较小的过程,很快我意识到在进行填充时具有某种状态会很有用,因此我需要在较小的过程之间传递较少的参数。因此,我将其纳入自己的类中: class StuffDoer { private someInternalState; public Start(initalParams) { ... } // some private helper procedures here ... } 然后我这样称呼它: new StuffDoer().Start(initialParams); 或像这样: new StuffDoer(initialParams).Start(); 这就是感觉不对的地方。使用.NET或Java API时,我始终不会调用new SomeApiClass().Start(...);,这使我怀疑自己做错了。当然,我可以将StuffDoer的构造函数设为私有,并添加一个静态辅助方法: public static DoStuff(initalParams) { new StuffDoer().Start(initialParams); } 但是然后我有了一个其外部接口仅包含一个静态方法的类,这也感觉很奇怪。 因此,我的问题是:这种类型的类是否有公认的模式? 只有一个入口 是否没有“外部可识别”状态,即实例状态仅在执行该入口点时需要?

2
为什么构建器应该是内部类而不是其自己的类文件中?
许多Builder Pattern示例都将Builder其构建为对象的内部类。 这有一定道理,因为它表明了Builder构建的内容。但是,使用静态类型的语言,我们知道Builder构建的内容。 另一方面,如果Builder是内部类,则应了解Builder构建的类,而无需查看内部Builder。 而且,将构建器作为内部类可以减少导入的次数,因为外部类可以引用该构建器(如果您对此很在意)。 然后是一些实际的示例,其中Builder放在同一包中,而不是内部类(如)StringBuilder。您知道Builder 应该建立一个,String因为它名为so。 话虽这么说,我能想到的制作Builder内部类的唯一好理由是,您Builder无需知道类的名称或依赖命名约定就可以知道类的含义。例如,如果我StringBuilder是一个内部类,String我可能会知道它比我(推测性)早存在。 是否有其他原因可以使Builder内部类成为阶级,或者只是归结为偏好和仪式?

6
我是否在这种体系结构上打破了面向对象的实践?
我有一个Web应用程序。我不认为这项技术很重要。该结构是一个N层应用程序,如左图所示。共3层。 UI(MVC模式),业务逻辑层(BLL)和数据访问层(DAL) 我的问题是我的BLL非常庞大,因为它具有通过应用程序事件调用的逻辑和路径。 通过应用程序的典型流程可能是: 在UI中触发的事件遍历BLL中的方法,执行逻辑(可能在BLL的多个部分中),最终执行DAL,返回到BLL(可能还有更多逻辑),然后向UI返回一些值。 此示例中的BLL非常繁忙,我正在考虑如何将其拆分。我也有自己不喜欢的逻辑和对象。 右边的版本是我的努力。 逻辑仍然是应用程序的UI和DAL之间的流动,但也有可能没有属性...只有方法(在这一层中的大多数类可能可能是静态的,因为他们不存储任何状态)。Poco层是存在具有属性的类的地方(例如Person类,其中会有名称,年龄,身高等)。这些与应用程序的流程无关,它们仅存储状态。 流可以是: 甚至从UI触发,并将一些数据传递到UI层控制器(MVC)。这将转换原始数据并将其转换为poco模型。然后将poco模型传递到逻辑层(即BLL),最后传递到命令查询层,可能会在途中被操纵。Command查询层将POCO转换为数据库对象(几乎是同一件事,但是一个是为持久性而设计的,另一个是为前端设计的)。存储该项目,并将数据库对象返回到“命令查询”层。然后将其转换为POCO,在其中返回到逻辑层,可能进行进一步处理,然后最终返回到UI 共享逻辑和接口是我们可能拥有持久数据的地方,例如MaxNumberOf_X和TotalAllowed_X以及所有接口。 共享逻辑/接口和DAL都是体系结构的“基础”。这些人对外界一无所知。 除了共享的逻辑/接口和DAL,其他一切都与poco有关。 流程仍然与第一个示例非常相似,但是它使每一层都对一件事情负责(无论是状态,流程还是其他)……但是我是否用这种方法打破了OOP? 演示Logic和Poco的示例可能是: public class LogicClass { private ICommandQueryObject cmdQuery; public PocoA Method1(PocoB pocoB) { return cmdQuery.Save(pocoB); } /*This has no state objects, only ways to communicate with other layers such as the cmdQuery. Everything else is just …

6
类使用其自己的公共方法可以吗?
背景 我目前遇到一种情况,即我有一个设备同时发送和接收的对象。该消息具有以下几种构造: public void ReverseData() public void ScheduleTransmission() 该ScheduleTransmission方法需要调用ReverseData时,它被称为方法。但是,有时我需要从应用程序中实例化对象的地方进行ReverseData外部调用(并且应该完全在命名空间之外添加)。 至于“接收”,我的意思是ReverseData将在object_received事件处理程序中从外部调用该请求以撤消数据。 题 对象调用其自己的公共方法通常可以接受吗?

4
为什么许多鸭子式动态编程语言会使用基于类的方法而不是基于原型的OOP?
由于许多动态编程语言都具有鸭类输入法的功能,并且它们还可以随时打开和修改类或实例方法(例如Ruby和Python),因此…… 问题1)动态语言课程的需求是什么?为什么要用这种方式设计语言,以将类用作某种“模板”,而不是以原型方式使用而只是使用对象? 另外的JavaScript是原型为基础,但CoffeeScript的(JavaScript的加强版),选择基于类的方式。它也适用于相同的Lua(原型为基础)和MoonScript(类为主)。此外,ES 6中还有一门课。所以…… 问题2)是否暗示着,如果您尝试改进基于原型的语言,则应将其更改为基于类的语言?如果没有,为什么要这样设计?

2
DDD聚合序列化的最佳做法
根据DDD,域逻辑不应被序列化,对象关系映射等技术问题所污染。 那么,如何在不通过getter和setter公开公开状态的情况下序列化或映射聚合状态?我已经看到了很多示例,例如存储库实现,但是实际上所有示例都依赖于实体上的公共访问器和用于映射的值对象。 我们可以使用反射来避免公共访问器,但是IMO这些域对象仍将隐式依赖于序列化问题。例如,在不调整序列化/映射配置的情况下,您无法重命名或删除私有字段。因此,您必须考虑序列化,而应将重点放在域逻辑上。 那么,要遵循的最佳妥协是什么?与公共访问器一起生活,但要避免将它们用于映射代码以外的其他用途?还是我只是想念一些明显的东西? 我对序列化DDD域对象(由实体和值对象组成的聚合)的状态特别感兴趣。这与无状态服务在简单数据容器对象上运行的常规脚本或事务脚本场景中的序列化无关。

12
面向对象设计
假设您具有以下条件: +--------+ +------+ | Animal | | Food | +-+------+ +----+-+ ^ ^ | | | | +------+ +-------+ | Deer | | Grass | +------+ +-------+ Deer从继承Animal和Grass继承Food。 到目前为止,一切都很好。Animal物体可以吃Food物体。 现在,让它混合一点。让我们添加一个Lion继承自的Animal。 +--------+ +------+ | Animal | | Food | +-+-----++ +----+-+ ^ ^ ^ | | | | | | +------+ …

6
UML类图是否足以设计JavaScript系统?
鉴于UML面向面向对象的更为经典的方法,它仍然可以以可靠的方式用于设计JavaScript系统吗? 我可以看到的一个具体问题是,实际上,类图是系统的结构化视图,而JavaScript是更多由行为驱动的,那么如何处理呢? 请记住,我在这里不是在谈论真实世界;这是我要实现的解决方案的模型。

6
将动词与函数一起使用,将名词与类一起使用-接口如何?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 好的,我了解将动词与函数一起使用以及将名词与类一起使用的常规约定。界面呢?在提出接口名称时,有什么方法可能不太明显? 只是为了清楚起见,我并不是在说是否在名称前加上“ I”,还是要使用camelCase还是PascalCase。我想知道为接口找出清晰的语义名称的方法。 编辑 我正在沉迷于如何以最清晰的方式命名接口。我想它也只需要是一个名词,因为当我想到命名类时,我想到了它可以关联的最接近的“真实”世界对象。我想现实世界的接口是诸如键盘,鼠标,遥控器,ATM屏幕之类的东西。这些都是名词。无论如何,将对任何一种很好的方式来表达接口名称的见解表示赞赏。

5
面向对象的编程范式由于反模块化和反并行性而过时了吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我已经读过CMU教授罗伯特·哈珀(Robert Harper)发表的有争议的文章《向新生学习FP》。他声称CMU将不再在入门课程中教授面向对象的编程,因为它“不适合现代CS课程”。 他声称: 面向对象的编程从入门课程中就完全消除了,因为它的本质是反模块化的和反并行的。 为什么将OOP视为反模块化和反并行的?

5
纯功能语言如何处理模块化?
我来自于面向对象的背景知识,在该背景知识中我了解到,类已经或至少可以用于构成一层抽象,以便于代码的轻松回收,然后可以将其用于创建对象或用于继承。 例如,我可以拥有一个动物类别,然后从中继承猫和狗,使它们都继承许多相同的特征,然后从那些子类别中,我可以创建可以指定动物品种甚至名称的对象它的。 或者,我可以使用类来指定同一代码的多个实例,这些实例处理或包含略有不同的事物。例如搜索树中的节点或多个不同的数据库连接,而没有。 我最近进入函数式编程领域,因此我开始怀疑: 纯函数式语言如何处理此类问题?也就是说,语言没有任何类和对象的概念。

6
持续集成科学软件
我不是软件工程师。我是地球科学领域的博士生。 大约两年前,我开始编写科学软件。我从未使用过持续集成(CI),主要是因为起初我不知道它的存在,而且我是唯一使用此软件的人。 现在,由于该软件的基础正在运行,因此其他人开始对它产生兴趣并希望为该软件做出贡献。计划是其他大学的其他人正在实施核心软件的添加。(我担心他们会引入错误)。此外,该软件变得非常复杂,并且变得越来越难以测试,我也计划继续进行开发。 由于这两个原因,我现在越来越多地考虑使用CI。因为我从未接受过软件工程师的培训,而且周围的人都没有听说过CI(我们是科学家,所以没有程序员),所以我很难开始我的项目。 我有几个问题想向我寻求建议: 首先简要说明该软件的工作方式: 该软件由一个包含所有必需设置的.xml文件控制。您只需通过将路径传递到.xml文件作为输入参数来启动软件,它就会运行并创建带有结果的几个文件。一次运行可能需要30秒钟。 这是一个科学软件。几乎所有的函数都有多个输入参数,它们的类型主要是非常复杂的类。我有多个具有大型目录的.txt文件,用于创建这些类的实例。 现在让我们来问我的问题: 单元测试,集成测试,端到端测试?:我的软件现在大约有30.000行代码,具有数百个功能和约80个类。开始为数百种已经实现的功能编写单元测试对我来说有点奇怪。因此,我考虑过简单地创建一些测试用例。准备10-20个不同的.xml文件,然后运行该软件。我猜这就是所谓的端到端测试?我经常读到您不应该这样做,但是如果您已经拥有可以运行的软件,那么也许可以开始吗?还是尝试将CI添加到已经运行的软件中只是愚蠢的想法。 如果功能参数难以创建,如何编写单元测试? 假设我有一个函数double fun(vector<Class_A> a, vector<Class_B>),通常,我需要首先读取多个文本文件来创建类型为Class_A和的对象Class_B。我考虑过要创建一些虚拟功能,例如Class_A create_dummy_object()不读取文本文件。我还考虑过实现某种序列化。(我不打算测试类对象的创建,因为它们仅依赖于多个文本文件) 如果结果变化很大,如何编写测试?我的软件利用了大型蒙特卡洛模拟并可以迭代地工作。通常,您需要进行约1000次迭代,并且每次迭代都基于Monte Carlo模拟创建约500-20.000个对象实例。如果一次迭代的一个结果只有一点点不同,则整个即将到来的迭代将完全不同。您如何处理这种情况?我认为这对端到端测试来说很重要,因为最终结果变化很大? 对于CI的其他建议,我们深表感谢。

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.