You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理全局共享数据与对象?TBuilding实例共享方案咨询

解决方案建议

一、避免全局变量:共享TBuilding/TCity实例的替代方案

1. 依赖注入(推荐)

给所有需要访问TBuilding的类(比如各类TCar子类、TGarage)添加构造参数或初始化方法,在创建实例时主动传入对应的TBuilding引用。示例代码:

type
  TCar = class
  private
    FOwnerBuilding: TBuilding;
  public
    constructor Create(ABuilding: TBuilding);
  end;

constructor TCar.Create(ABuilding: TBuilding);
begin
  inherited Create;
  FOwnerBuilding := ABuilding;
end;

这种方式能明确类之间的依赖关系,代码解耦性更强,后续做单元测试也更容易(可传入模拟的TBuilding实例),彻底规避全局状态带来的意外问题。

2. 轻量上下文容器(Service Locator)

如果项目规模较大,依赖注入的代码量偏高,可以创建一个单例的上下文类,比如TAppContext,用来存放需要全局共享的核心实例:

type
  TAppContext = class
  private
    FCurrentCity: TCity;
    FCurrentBuilding: TBuilding;
    class var FInstance: TAppContext;
  public
    class function GetInstance: TAppContext;
    property CurrentCity: TCity read FCurrentCity write FCurrentCity;
    property CurrentBuilding: TBuilding read FCurrentBuilding write FCurrentBuilding;
  end;

注意:这个容器仅用来存放初始化后基本不变的核心实例,不要让它变成随意修改全局状态的“垃圾桶”。使用时尽量只做读取操作,避免在业务逻辑里随意修改容器内的实例,防止出现难以追踪的状态问题。

二、共享resourcestring的处理方式

完全不需要额外容器,直接把所有共享的可翻译字符串放在一个独立单元中,比如SharedResStrings.pas:

unit SharedResStrings;

interface

resourcestring
  SCarLowFuel = '车辆燃油不足,请及时加油';
  SBuildingMaintenanceAlert = '建筑即将到期维护';

implementation

end.

所有需要使用这些字符串的类所在单元,只要引用SharedResStrings单元,就能直接访问这些resourcestring。这种方式符合Delphi的资源管理机制,天然支持多语言切换,且维护方便——所有共享字符串集中在一处,不用分散在各个类里。

额外提示

不用强行合并TCity、TBuilding、TGarage类,你的类层级划分符合职责单一原则:城市管理建筑、建筑管理车库、车库管理车辆,每个类职责清晰,合并反而会导致类臃肿,后续维护成本更高。

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:23:08