【发布时间】:2013-01-15 00:27:08
【问题描述】:
我不时地以这些行结束代码,在其中创建一些对象,然后循环遍历它们以使用另一个类初始化一些属性...
ThingRepository thingRepos = new ThingRepository();
GizmoProcessor gizmoProcessor = new GizmoProcessor();
WidgetProcessor widgetProcessor = new WidgetProcessor();
public List<Thing> GetThings(DateTime date)
{
List<Thing> allThings = thingRepos.FetchThings();
// Loops through setting thing.Gizmo to a new Gizmo
gizmoProcessor.AddGizmosToThings(allThings);
// Loops through setting thing.Widget to a new Widget
widgetProcessor.AddWidgetsToThings(allThings);
return allThings;
}
...只是,嗯,感觉不对。
- 这是个坏主意吗?
- 是否有我在这里使用的反模式的名称?
- 有哪些替代方案?
编辑:假设
GizmoProcessor 和WidgetProcessor 都必须进行一些计算,并从其他表中获取一些额外数据。它们不仅仅是存储在存储库中的数据。他们正在基于每个 Thing 创建新的 Gizmo 和小部件,并将它们分配给 Thing 的属性。
这让我觉得奇怪的原因是Thing 不是一个自治对象;它不能创建自己和子对象。它需要更高级别的代码来创建一个完全完成的对象。我不确定这是否是一件坏事!
【问题讨论】:
-
乍一看并没有错,但由于我们不知道在毯子下会发生什么,所以很难说如何改进它
-
尝试搜索控制反转 (IoC)。如果您还没有听说过,您可能会觉得它很有启发性。
-
您可能想了解对象关系映射器 (ORM)。基本上,Thing 存储库应根据需要使用 Gizmo 和 Widget 填充事物的属性。如果涉及显着的性能成本,大多数 ORM 系统都允许您为某些属性指定延迟加载。
标签: c# design-patterns initialization anti-patterns