这种编程方法叫什么?这不好吗?
What is this programming method called? And is it bad?
最近在我的 Unity 项目中,我发现要创建一个更加模块化的应用程序,在 class 中有一个静态列表会有所帮助,其中包含对创建的所有或部分对象的引用,以便它们可以可以从程序的其他部分轻松访问。示例如下:
private static List<Canvas> availableCanvases = new List<Canvas>();
void Start () {
availableCanvases.Add(this);
}
public static void AddComponentToCanvas(Transform component) {
for (int i = 0; i < availableCanvases; i++) {
//Make sure the canvas still exists
if (availableCanvases[i] != null) {
component.SetParent(availableCanvases[i]);
return;
} else {
availableCanvases.RemoveAt(i);
i--;
}
}
//Reached if no canvas found
//Create new canvas or create error etc...
}
这仅允许在运行时实例化的对象将自身添加到可用的 canvas,而无需通过 findWithTag 或 findWithType 方法访问它,如果使用过多会损害性能。
这种做法是好是坏?我的同事认为这代表了单例编程,但它当然不是,因为它允许存在和使用多个对象。
这本质上是一个 Service Locator "Anti Pattern",它(令人惊讶)基于单例模式。但是,您不是检索服务实例,而是检索对象实例。
不管名称如何,这实际上并没有创建更加模块化的应用程序。相反,您在整个应用程序中创建了硬依赖性,这使得将其拆分为各个组件变得更加困难。
Martin Fowler 很好地记录了该模式。您可以找到更多信息 here.
最近在我的 Unity 项目中,我发现要创建一个更加模块化的应用程序,在 class 中有一个静态列表会有所帮助,其中包含对创建的所有或部分对象的引用,以便它们可以可以从程序的其他部分轻松访问。示例如下:
private static List<Canvas> availableCanvases = new List<Canvas>();
void Start () {
availableCanvases.Add(this);
}
public static void AddComponentToCanvas(Transform component) {
for (int i = 0; i < availableCanvases; i++) {
//Make sure the canvas still exists
if (availableCanvases[i] != null) {
component.SetParent(availableCanvases[i]);
return;
} else {
availableCanvases.RemoveAt(i);
i--;
}
}
//Reached if no canvas found
//Create new canvas or create error etc...
}
这仅允许在运行时实例化的对象将自身添加到可用的 canvas,而无需通过 findWithTag 或 findWithType 方法访问它,如果使用过多会损害性能。
这种做法是好是坏?我的同事认为这代表了单例编程,但它当然不是,因为它允许存在和使用多个对象。
这本质上是一个 Service Locator "Anti Pattern",它(令人惊讶)基于单例模式。但是,您不是检索服务实例,而是检索对象实例。
不管名称如何,这实际上并没有创建更加模块化的应用程序。相反,您在整个应用程序中创建了硬依赖性,这使得将其拆分为各个组件变得更加困难。
Martin Fowler 很好地记录了该模式。您可以找到更多信息 here.