gpt4 book ai didi

delphi - 如果一个对象认识很多它的所有者,这是一种代码味道吗?

转载 作者:行者123 更新时间:2023-12-03 15:47:17 26 4
gpt4 key购买 nike

在我们的 Delphi 2007 应用程序中,我们使用了许多以下结构

FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));

FindOwnerClass 向上遍历当前组件的 Owner 层次结构以查找特定类(在示例 TdmBasicData 中)。结果对象存储在字段变量 FdmBasic 中。我们主要用它来传递数据模块。

示例:生成报告时,生成的数据被压缩并存储在通过数据模块 TdmReportBaseData 访问的表的 Blob 字段中。在我们应用程序的单独模块中,可以使用 ReportBuilder 以分页形式显示报表中的数据。该模块 (TdmRBReport) 的主要代码使用 TRBTempdatabase 类将压缩的 blob 数据转换为可在 Reportbuilder 运行时报表设计器中使用的不同表。TdmRBReport 可以访问 TdmReportBaseData 以获取各种与报告相关的数据(报告类型、报告计算设置等)。 TRBTempDatabase 在 TdmRBReport 中构建,但必须有权访问 TdmReportBasedata。所以现在使用上面的结构来完成:

constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
inherited Create(aOwner);

FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }

我的感觉是,这意味着 TRBTempDatabase 了解它的很多所有者,我想知道这是否是某种代码气味或反模式。

您对此有何看法?这是代码味道吗?如果是这样,更好的方法是什么?

最佳答案

根据此处提供的描述,我认为它有轻微的气味。不过,修复起来似乎很容易。

我倾向于将 dmReportBaseData 对象传递到任何需要它的组件的构造函数中。这使得契约在编译时变得清晰,而不是像您当前那样在运行时强制执行。

就目前情况而言,您执行的契约(Contract)比其需要的更强大。虽然 TRBTempDatabase 仅需要 dmReportBaseData 实例,但只有当它可以从 TdmRBReport 报表对象获取该实例时,它才会起作用。

进行此更改还可以让 TRBTempDatabaseTdmRBReport 分离并仍然成功运行。正如@Lieven 在评论中指出的那样,这可能会使测试变得更容易。

关于delphi - 如果一个对象认识很多它的所有者,这是一种代码味道吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4895655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com