问题标签 [ooad]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
163 浏览

java - 关于封装的问题(书:HF OOA&D)

我正在读这本书(Head First Object Oriented Design & Analysis)。在第 5 章中有一个建议,我想对它提出一些其他的建议。书上说:

“当您拥有一组随对象变化的属性时,请使用集合,例如 Map 来动态存储这些属性。”

此外,一些解释为什么要这样做:

“您将从类中删除许多方法,并避免在将新属性添加到您的应用程序时更改您的代码”。

我确实了解这种方法的优点,但也没有缩小尺寸吗?我的意思是如果我使用映射来存储这些信息(在示例中它是一个字符串到枚举映射)并提供一个 getProperty(String) 方法来访问,那么这个方法的调用者实际上必须知道哪些字符串是允许的。我不喜欢这个。我的意思是,您当然可以争辩说可以在 javadoc 中说明允许输入的内容。

这真的是处理这类问题的方法吗?还有其他选择吗?我知道用继承来做这件事是不好的,因为有大量的子类,而且这些子类不会覆盖任何东西,只是添加新的属性,这在我看来真的不是那么好。

0 投票
2 回答
218 浏览

php - php面向对象编程

我有一些关于 OOP 的问题。我不是高级用户,我遇到了一些人以前可能遇到过的问题。

基本上我使用 MVC 来处理我的 php 项目。我试图让课堂尽可能独立。但我认为这是相当艰难的。例如:

我有一个类汽车和用户。用户将汽车信息发布到网站上,可能是为了出售...

在 User 类中,我基本上有 getUser 来获取用户信息。

所以在 Car 类中,我可能有 setCar、getCar、saveCar。为了显示这些汽车,我可能有一个 displayCars()。在 displayCars() 中,我可以使用 getCar 来获取汽车列表。但我可能还需要使用 User::getUser 来获取提交这些汽车的用户的用户信息。所以在某种程度上,displayCars 依赖于 User::getUser。

那么我应该在这里做什么?

0 投票
1 回答
2331 浏览

oop - 二维游戏的代码设计

我需要一些有关如何设计基本 2d 游戏的主要组件的资源。我们称它为“引擎”。我应该如何设计我的渲染器、场景管理器、实体管理器以及它们应该如何相互交互?那么事件管理,资源管理,......

也许有人有一些很酷的UML?还是任何“教程”?一些一般的提示和技巧?

0 投票
6 回答
228 浏览

c# - 正确使用抽象类

我正在使用 .Net 并且有一个简单的主类和子类设计。我的主类包含几乎所有的功能,而子类只需要从主类中设置一个值。我正在考虑将 master 设为一个抽象类,但没有必须重写的方法,但我想强调 master 类不一定独立存在的想法。另外,我想强调的是,主类的属性必须由子类设置。这里有什么合适的?谢谢你的帮助!

0 投票
2 回答
455 浏览

c++ - 我如何才能掌握纯OOD的概念?

我在理解纯 OOD 的概念方面仍有一点问题。

假设我们有一个 Human 类,我们生活在一个世界中,有时人类会走路(大脑控制腿),有时树木会消失(人类会注意到),有时人类会随机互相撞击。

前两种情况真的很简单:

现在我的 hit 方法遇到了一个非常糟糕的问题。当然,你可以说很好

直到这里我认为它很好(如果有什么不好请抱怨)并且读起来像散文(好的 OOP 代码应该)。但是如何将命中转移到 OOP 中呢?如果 Anna 撞到 Bob 并且 Bob 摔倒了,那么摔倒既不是 Anna 也不是 Bob 直接造成的。它是由撞击、失去平衡和物理引起的。

对于这种情况,我只知道 2 个选项,但不知何故,我认为两者都很糟糕:

在这种情况下,安娜“摔倒”鲍勃。但这完全没有任何意义。这不像安娜抓住鲍勃的身体并将其移向地面。但还有另一种选择:

在这种情况下,鲍勃的身体“注意到”撞击导致他倒在地上,然后他会“自己”倒在地上。我认为这比第一种选择要好,但这仍然感觉不对。

所以,请聪明的 OOP 人向我解释一下,当在现实世界中 A 修改 B 的状态但在 OOP 世界中只有 B 应该修改 B 的状态时,你如何处理这种情况。

0 投票
2 回答
298 浏览

java - 我应该允许对象从其界面中删除自己吗?OOD 是否正确?

我有以下内容:

在使用此类接口时如果我决定删除由 File 实例表示的实体(我的意思是从远程服务器中删除),我应该怎么做?

我应该介绍delete()File 接口的方法(因为它是 Information Expert 并且可能知道如何从服务器中删除自己)?FileService或者我应该通过void deleteFile(File file)接口方法将此功能委托给它的创建者吗?为什么?

如果第一种情况更合适,如何使对象无效以避免其后续使用?

以及相关:我应该如何处理uploadFile()案件?谁应该为此负责?因为看起来 FileService 可能会违反 SRP。

谢谢,

0 投票
4 回答
131 浏览

c++ - 如何将A类型的数据写入B类型的格式

我正在实现一个生成结果并将它们写入某种格式的文件的东西。

相当简单,但我希望这是动态的。

我会放弃几节课。

Data - 所有结果
的基类DataFile - 所有文件格式类型的基类,有方法addData(Data * data)

ErrorData - 派生自 Data,包含有关错误的数据。
InfoData - 派生自 Data,包含通用信息。

XmlFile - 派生自 DataFile,包含 XML 格式的数据。
BinaryFile - 派生自 DataFile,包含二进制格式的数据。

我的问题是这样的:

我在哪里实现如何将ErrorData写入XmlFile

我不喜欢在答案中看到:

  1. DataDataFileErrorDataXmlFile的新成员函数(因为这意味着我每次添加新的DataDataFile派生类时都需要添加它们)
  2. 类型转换为派生类型。
  3. 普遍的丑陋:)

我知道我的基本 C++ 虚拟化和东西,不需要特别具体。

不过,我确实很欣赏一些代码片段,它们会减少歧义。

我对制作DataWriter基类并从中派生类有一些想法,这些类将知道如何将特定类型的数据写入特定类型的DataFile,但我有点不确定具体的细节。

编辑:

我将以示例的形式进行更多说明。

让我们有 2 种新的文件格式,FormatATxtFileFormatBTxtFile

假设我们有一个InfoData对象并且它有参数:

消息行号:34
消息内容:Hello World

写入FormatATxtFile的对象在文件中如下所示:

行:34;文本:Hello World;类型:信息

FormatBTxtFile中,它看起来像这样:

@Info,34,Hello World

一种将数据导出为不同格式的方法。我不需要导入,至少现在是这样。

使用它的代码会是什么样子:

编辑:

似乎我没有足够清楚地说明 Xml 和二进制文件格式会出现什么问题。对不起。

让我们使用与上面相同的InfoData对象并将其推送到 XmlFile 格式。在某个元素下,它可能会产生类似这样的东西:

假设ErrorData类将具有以下参数:

错误的行号:56
错误文本:链接:致命错误 LNK1168
错误消息之前的 10 行:text1...
错误消息之后的 10 行:text2...
发生的整个日志:text3...

现在,当它被推入 XML 格式时,它需要完全不同。

整个文件可能看起来像这样:

0 投票
1 回答
72 浏览

iphone - 默认 IBAction - UISegmentControl,面向对象的设计帮助

我有一个 UISegmentControl 和我的 UITableView 对数据进行排序。我希望能够做的事情:

(1) 默认排序(所以当用户第一次打开应用程序时,它会选择第一个段,并按该操作排序)

(2) 记住用户在表加载之间的位置。我的意思是,类似于 Apple 的封面流,当我转到不同的封面时,UITableView 会重新填充。因此,如果用户最后一次在那里,排序在第 3 段,那么它会记住这一点。

我对面向对象的设计有点陌生,这是我最好的猜测,不是到处都有相同的冗余代码:(MarkersList 是一个 NSMutableArray)

我还没有实现第三种排序,因为它不仅仅是像其他两个那样的 NSString 或 NSNumber 。到目前为止,我认为它工作正常。但是,我遇到的问题是实现(1),我需要在加载表时调用 sortByName。我可以再次创建 NSSortDescriptors,但这似乎是多余的。有没有更OOD的方法来实现这一点?

对于(2),我猜我可以将表的索引保存在字典中,并在加载该表时检索它。或者类似的东西,不太确定。

任何帮助是极大的赞赏。谢谢!

0 投票
4 回答
320 浏览

oop - 特定时间段有效的业务规则——如何有序管理

0 投票
4 回答
362 浏览

c# - oop 数据结构建议

我正在编写一个日志文件解码器,它应该能够读取许多不同的文件结构。我的问题是如何最好地表示这些数据。我正在使用 C#,但对 OOP 很陌生。

示例:日志文件具有一系列传感器值。一个传感器读数可以称为A,另一个称为B。显然,有不止 2 种条目类型。在不同的日志文件中,它们可以存储为 ABABABABAB 或 AAAAABBBBB。

我正在考虑将其描述为条目块。所以在第一种情况下,一个块将是“AB”,有 5 个块。在第二种情况下,第一个块是'A',读取5次。这后面是一个'B'块,读取5次。

这是相当简单的(实际上有 40 种不同类型的日志文件,每个块中最多包含 40 个传感器值)。没有日志有超过 300 个块。

目前,我将所有这些存储在数据表中。每个条目都有一个列,具有要阅读的数量的属性。如果设置为 -1,它将继续到块中的下一列。如果没有,它将假定它已到达块的末尾。

这一切似乎都很笨拙。任何人都可以提出更好的方法吗?