2015-06-17 11 views
6

Kürzlich habe ich in meinen Unity-Projekten entdeckt, dass es für eine modularere Anwendung hilfreich ist, eine statische Liste in einer Klasse zu haben, die Verweise auf alle oder einige der erstellten Objekte enthält, so dass sie leicht von anderen Teilen aus aufgerufen werden können das Programm. Ein Beispiel ist unten:Wie heißt diese Programmiermethode? Und ist es schlecht?

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... 
} 

Dies ermöglicht einfach ein Objekt, das zur Laufzeit instanziiert wird selbst ohne es durch eine findWithTag oder findWithType Methode zuzugreifen, um zu einer verfügbaren Leinwand hinzuzufügen, die Leistung wird verletzt, wenn zu viel verwendet.

Ist das schlecht oder gut? Mein Kollege glaubt, dass dies die Singleton-Programmierung darstellt, aber natürlich nicht, weil mehrere Objekte existieren und verwendet werden können.

+0

Ich verstehe nicht Ihre Bedingung, warum würde "availableCanvases" jemals "null" sein? – Blindy

+0

Aktualisiert auf korrekten Zustand if (availableCanvases [i]! = Null) –

+0

Bitte verwenden Sie nicht den Tag [tag: unity] für Fragen zur Spielengine. Verwende [tag: unity3d]. –

Antwort

8

Dies ist im Wesentlichen eine Service Locator "Anti Pattern", die (Überraschung Überraschung) basierend auf dem Singleton-Muster basiert. Anstatt jedoch Dienstinstanzen abzurufen, rufen Sie Objektinstanzen ab.

Unabhängig von dem Namen, das tatsächlich erstellt keine modulare Anwendung. Im Gegenteil, Sie erstellen in Ihrer gesamten Anwendung harte Abhängigkeiten, die es schwieriger machen, sie in die entsprechenden Komponenten aufzuteilen.

Martin Fowler dokumentierte das Muster sehr gut. Sie finden weitere Informationen here.

+2

War dabei, aber Ihre Antwort ist auf das Geld. – spender

+0

Gibt es eine Idee, wie die GameObject.FindWithTag-Funktion ("Tag") von Unity funktionieren würde? Oder würde es auch den Service Locator verwenden, da er statische Referenzen benötigt? –

+0

@LuminaryPromotions Leider dokumentiert Unity3d die internen Abläufe der GameObject.FindWith ... Methoden nicht sehr gut. Sie beschreiben nur, wie sie aufgerufen werden. Darüber hinaus rufen diese Methoden CLR-Level-Funktionen auf, und darüber gibt es noch weniger Informationen. Als Ergebnis ist Ihre Schätzung so gut wie meine, wie diese Methoden tatsächlich unter der Haube arbeiten. –