英文:
What is THE way to handle globaly shared Data/objects
问题
在阅读了成千上万关于全局变量有多糟糕的帖子后,我回到了起点。
这里有一个人为的示例,我希望能够解释我的情况和问题:
TCity
:拥有一个Building列表TBuilding
:是city的一部分 | 拥有确切的2个garagesTGarage
:是Building的一部分 | 拥有Cars列表TCar
:是Garage的一部分 | 拥有Cars的链表TCar1
、TCar2
、TCar3
:是TCar的后代
我有一个TBuilding的实例,需要被每个其他类访问。
TBuilding类需要被汽车访问。
我应该为TCity和TBuilding实例创建一个全局变量,还是还有其他什么我可以做的?
我尝试合并TCity、TBuilding和TGarage类,但每次尝试时都让我头痛。
在这里有一些经验丰富的人能够指导我走向正确的方向吗?
我正准备创建一个容器类,以在各个单位之间共享所需的实例。但在阅读了很多帖子后,我不确定这是否是处理这个问题的正确方式。
resourcestring
怎么样呢?我应该创建一个包含在类之间共享的resourcestring
的容器。例如,如果我有大约20个类都需要同一个字符串,这个字符串需要被翻译,那我会将其制作成resourcestring
。我应该在哪里收集这样的数据?
英文:
After reading thousands of posts about how bad Global variables are, I got back to where I started from.
Here is a contrived example which I hope can explain my situation and my question:
TCity
: has a list of BuildingsTBuilding
: Is part of a city | has exact 2 garagesTGarage
: Is part of a Building | has a List of CarsTCar
: Is part of a Garage | Has a Linked List of CarsTCar1
,TCar2
,TCar3
: Is Descendant of TCar
i have an instance of TBuilding which needs to be accessed by every single other Class.
The TBuilding Class needs to be accessed by the Cars.
Should I make a global variable for the TCity and TBuilding instance, or is there anything else I can do ?
I tried to merge the TCity, TBuilding and TGarage classes, but that gives me headaches everytime I try.
Could some experienced people here lead me in the right direction?
I was about to create a Container Class, to share the needed instances between units. But after reading lots of posts, I wasn't sure that this was the correct way of dealing with this problem.
What about resourcestring
s. Should I create a Container with reourcestrings which are shared amongst Classes. For Example if I have about 20 classes where I need the same string every time. The string needs to be translated, so I make a resourcestring
out of it. Where do I collect such data?
答案1
得分: 3
你不需要任何全局变量来实现你似乎想要实现的目标。
你只需要为每个对象存储对父类实例的引用。
例如,你可以为你的 TBuilding
类添加另一个名为 City
的字段,在创建时将引用设置为该建筑所属的 TCity
实例。
TBuilding = class(TObject)
private
FCity: TCity;
protected
...
public
constructor Create(ACity: TCity);
property City: TCity read FCity write FCity;
end;
...
constructor TBuilding.Create(ACity: TCity);
begin
inherited;
FCity := ACity;
end;
然后对 TGarage
和 TCar
也做类似的操作。
通过这样做,你可以通过类似 Car.Garage.Building
的方式从汽车对象中访问建筑对象。
英文:
You don't need any global variable for what you seem to be trying to achieve.
All you need to do is store reference to parent class instance for each object.
For instance you add another field called City to your TBuilding
class and upon its creation you set reference to the TCity
instance to which this building belongs.
TBuilding = class(TObject)
private
FCity: TCity;
protected
...
public
constructor Create(ACity: TCity);
property City: TCity read FCity write FCity;
end;
...
constructor TBuilding.Create(ACity: TCity);
begin
inherited;
FCity := ACity;
end;
Then do similar for TGarage
, and TCar
.
By doing so you get ability to access Building object from a car object with something like this Car.Garage.Building
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论