- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了一个简单的问题,但我无法为它想出一个合适的 OOD。
我有什么:
foo()
我需要什么:
我需要遍历此列表并为支持此方法的对象调用 foo()
,即上述子类的(或派生的)对象。或者一般来说,我需要通过指向基类的指针列表对子类进行“无异味”的多态访问。
class Entity {
// ...
// This class contains methods also needed by subclasses.
};
class SaveableEntity : public Entity {
public:
virtual void save() = 0;
};
// SaveableEntity has multiple subclasses with specific save() implementations.
std::vector<Entity *> list;
for (Entity *entity : list) {
// Here I need to save() the descendants of a SaveableEntity type.
}
我想出了一些想法,但我觉得没有一个是对的。以下是其中一些:
dynamic_cast
由于有些元素是可保存的,有些元素不是,我看到的最明显的方法是动态转换:
std::vector<Entity *> list;
for (Entity *entity : list) {
auto saveable = dynamic_cast<SaveableEntity *>(entity);
if (saveable) {
saveable->save();
}
}
但是,在这种情况下使用 dynamic_cast
看起来像是一个糟糕的 OOD(如果我错了请纠正我)。此外,这种方法很容易导致违反LSP。 .
save()
移到基类我可以删除 SaveableEntity
并将 save()
方法移动到基础 Entity
。然而,这让我们实现了虚拟方法:
class Entity {
virtual void save() {
// Do nothing, override in subclasses
}
};
这消除了 dynamic_cast
的用法,但虚拟方法似乎仍然不正确:现在基类保存的信息(save()
方法)与
SaveStrategy
类及其子类,如 NoSaveStrategy
、SomeSaveStrategy
、SomeOtherSaveStrategy
等。再次,NoSaveStrategy
的存在让我们回到了先前方法的缺陷:基类必须知道其子类的特定细节,这似乎是一个糟糕的设计。<dynamic_cast
,但是这只会隐藏不需要的代码,并不能摆脱糟糕的设计本身。也许我遗漏了一些明显的解决方案,或者所描述的方法(1 或 2)在这个特定的上下文中并不像我看到的那样糟糕和难闻。
那么在这种情况下应该采用什么样的设计方法呢?
最佳答案
有面向数据编程鼓励的解决方案 #4(在 2018 年 cppcon 上有一个很好的演讲,可在 youtube 上找到):有两个列表。一个列表用于所有 SavableEntity
,另一个用于不可保存的 Entity
。
现在,您遍历第一个列表并 ->save()
这些项目。
主要优点是您只迭代相关实体。通过一些(可能是主要的)重构,您可以拥有对象的集合而不是指向某些对象的指针。这将增加数据局部性并显着减少缓存未命中的次数。
关于c++ - 从基指针列表循环 (OOD) 调用派生类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53433458/
在我的主要方法中,我需要执行系统命令。我正在创建一个外部类来执行命令,以保持我的主要方法和应用程序类干净。我不确定最好或最干净的方法是否是在主方法中对命令进行设置,或者只是将类传递给配置读取器并让它提
假设我有一个门的定义: class Door { public void Lock() { // lock the door } } 这对我来说似乎很有意义,至
我试图用 Member 类和 Guest 类来表示组成员身份。问题是我需要一个组才能告诉我哪些成员是该组的成员,但我也需要一个成员才能告诉我它是哪个组的成员。 例如,使用以下内容: class Mem
如今,TDD 风靡一时,越来越多的软件商店正在转向敏捷、Scrum 等。我当然可以看到自动化测试的优势,但我也认为 TDD 与良好的面向对象设计的一些原则相矛盾。 TDD 要求您在代码中插入接缝,这些
我正在尝试构建一个只能由 GameController 修改但可供任何类访问的类。我应该研究什么设计模式来实现这一目标? *我用 Java 构建它,GameController 是我的主类。因此,我无
我想将表单传递给我制作的模型(MVC)在 OOD 原则和松散耦合方面,首选哪种态度? 1) 将新用户的所有详细信息从表单(用户名、密码、电话等)传递到模型到单个或重载方法?或者: 2) 将单个对象(例
我正在尝试了解信息隐藏的原理。假设我有一个车辆类,其中包含 getSpeed、setSpeed、getEngine、setEngine、getVIN、setVIN 等方法。为了强制执行信息隐藏,我不想
这个question与我想要完成的任务有很大关系,并提供了很好的见解。虽然我觉得答案仍然不清楚,因为我使用的是 Java 而不是 C++。 我有一个类 (SQLService),它有一个 SQL 连接
服务器-处理-客户端请求应使用哪种 OOD 设计模式? 我建议使用消息交换模式,它允许在组件和应用程序之间交换信息(即消息)。 消息交换模式 (MEP) 描述了通信协议(protocol)建立或使用通
我在理解纯 OOD 的概念上还有一点问题。 假设我们有一个人类类,我们生活在这样一个世界中,有时人类会走路(大脑控制腿),有时树木会消失(人类会注意到),有时人类会随机撞到对方。 前两种情况真的很简单
问题 我遇到了一个简单的问题,但我无法为它想出一个合适的 OOD。 我有什么: 基类 子类添加新方法 foo() 指向基类实例的指针列表 我需要什么: 我需要遍历此列表并为支持此方法的对象调用 foo
我们的架构师已经谈到在我们的代码库中使用 SOA 技术,甚至在实际上并未作为服务托管的接口(interface)上也是如此。他的要求之一是我们设计我们的接口(interface)方法,以便我们对实际实
我已经在网上搜索了一段时间了。我正在寻找用于 OOD 实践(以及一些内部 TDD 研讨会)的小样本练习。 如果有一个地方可以满足这一需求,请指出它..并关闭此问题 限制: 与语言无关的现实世界问题 小
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
到目前为止,为了实现某些功能目标,我一直在将应用程序的主要 Activity 对象作为参数传递给其他类的构造函数,然后将其存储为私有(private)变量。 我这样做,不是因为我需要访问整个 Acti
请诚实一点,必要时拆开我的作品。 所以我正在重新编写我最近制作的一个小型网络应用程序。原因很简单,代码变得非常困惑,我想学习和应用更好的 OO 设计。这个应用程序应该做的只是简单的 CRUD。我有一个
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个关于在基类中保存公共(public)代码并让派生类调用它的问题,即使派生类的触发器方法已从基类中分派(dispatch)。所以,base->derived->base type call st
我有以下内容: interface File { String name(); ... } interface FileService { List getAllFiles(); ..
我一直主要使用功能范例来构建我的应用程序架构,特别是对于我从头开始构建的部件/模块。现在,我也在尝试 OOD。在基于 PHP、MySQL、IdiORM 的应用程序中用于跟踪音乐轨道信息;我的下一步是构
我是一名优秀的程序员,十分优秀!