【发布时间】:2013-03-07 14:51:23
【问题描述】:
我有以下问题:我有一组自动(监听事件)控制我的模型的引擎。下图显示了一般的类图:
现在我有一个知道 EngineFacade 的客户端,我想从客户端从 Engine2 设置属性 Active,但是客户端和 EngineFacade 都不知道三个引擎中的哪一个是 Engine2。
有两种方法,但我不喜欢其中任何一种:
- 检查其中一个引擎是否属于 Engine2 类型 - 如果有另一个执行相同任务但名称不同的类,我必须在 EngineBuilder 和 EngineFacade 中更改它。
- 检查标识符字符串 - 我不太喜欢魔术字符串。
我在客户网站上所知道的是存在或应该有一个处理网格的引擎。但我不知道更多。
也许我必须在两个恶魔之间做出选择,但也许你们中的一个有更好的解决方案。
【问题讨论】:
-
如果你必须分别识别每个引擎,简单的选择是给它一个唯一的标识符。另一种方法是在基础引擎上有一个 name 属性。每个引擎都实现 name 属性,然后触发一个事件,然后检查 sender 参数。
-
也许你应该检查一下门面提供的抽象。听起来你有一些泄漏。
-
您可能希望在图表中包含客户端、其方法和变量,或者发布一些说明用法的代码。
-
如果 Engine2 比 Engine1 和 Engine 3 更专业,那么事实上它正在实现一个额外的服务契约 ISpecificToEngine2。明确定义和公开此附加服务合同将允许客户选择所有实现此附加合同的引擎。
-
@Yggdrasil:您的抽象模型不再准确反映您的业务需求。如果这是一个孤立的案例,请忍受它;但如果它只是即将到来的冰山一角,请在它沉没之前立即解决它。
标签: c# design-patterns casting magic-string