我正在开发一个配置硬件的系统。不幸的是,硬件有很多种类,这意味着有各种各样的功能和配置,这取决于软件所连接到的特定硬件。
为了解决这个问题,我们使用了基于组件的实体设计,其中“硬件”类本身是一个非常薄的容器,用于根据可用的功能/配置在运行时组合的组件。这很好,而且设计本身在其他地方也很有效(特别是在游戏中)。
问题是,这个软件所做的就是配置硬件。因此,几乎所有的代码都是硬件实例的一个组件。虽然使用者只针对组件的强类型接口工作,但是可以说,表示硬件实例的类是一个上帝对象。
如果您想对硬件做任何事情,您可以查询一个接口并使用它。
所以,即使一个对象的组件是模块化的和解耦的,它们的容器是否是上帝的对象和反模式的缺点呢?
发布于 2013-10-30 03:51:02
根据维基百科的上帝对象条目,“上帝的对象是面向对象的类比,它没有在过程编程语言中使用子程序,或者使用太多的全局变量来存储状态信息。”换句话说,它是一个紧密耦合的混乱,被包裹在一个对象中。
根据您的看法,硬件类是“一个非常薄的组件容器”。我不相信一个非常薄的容器有任何办法成为一个紧密耦合的混乱,除非它是紧密耦合到它包含的组件。您将组件描述为“基于可用的功能/配置在运行时组合”,这意味着有多个可能的组件可以安装在容器的一个槽中,因此您的容器必须与其组件分离。
所以,除非我误解了您的描述,否则您的硬件类不是上帝对象。在运行时,它可能非常大,但我看不出在运行时大如何会成为一个问题,只要单个片段和将它们组合在一起的方法都不是紧密耦合的混乱。
发布于 2013-10-30 01:49:48
逻辑和复杂性生活在哪里?如果最外层的Hardware实例主要是外观或适配器,而子组件具有大部分的逻辑和行为,那么我会说“不行”。
可能还会有其他批评,但对我来说,“上帝对象”更多的是一个类,它的方式“太多”代码行做“太多”不同类型的事情。
https://softwareengineering.stackexchange.com/questions/215956
复制相似问题