2009-07-11 3 views
0

Ich schreibe Anwendungen für verschiedene Plattformen, aber hauptsächlich OS X und Windows. Beides wurde beeinflusst durch die jüngsten Trends in der Test-Driven-Entwicklung (TDD), SOLID und so weiter. Das meiste habe ich als guten Rat empfunden. Ich habe festgestellt, dass ich, wenn ich eine hervorragende Testabdeckung habe, eher nach Bedarf umgestalten kann, weil ich mehr Selbstvertrauen habe, dass ich bei meinen Tests irgendwelche Nebenwirkungen des Refactorings feststellen werde.Angesichts der jüngsten Trends in TDD und so weiter, ist ein "Manager" -Objekt immer eine schlechte Idee?

Wie auch immer, das führt mich zu meiner Frage: Ist ein "Manager" Singleton immer eine schlechte Idee? Ich schreibe eine Cocoa-Anwendung, die eine große Anzahl von QuickTime-Dateien in einer Warteschlange verarbeiten muss. Es kann nur eine Warteschlange in der Anwendung geben, und es muss für mehrere Teile der Anwendung zugänglich sein, damit sie Elemente zur Warteschlange hinzufügen können. Ich habe herausgefunden, dass dies am einfachsten mit einem Singleton geschieht. Nun, ich habe mir Mühe gegeben, diesen Singleton testbar zu schreiben, also ist TDD kein Problem.

Was würde ich in diesem Fall für einen Singleton ersetzen? Welche anderen Designmuster funktionieren und können noch getestet werden? (Beachten Sie, dass diese Frage als sprachunabhängig betrachtet werden sollte. Dies ist eine allgemeine OO- und TDD-Frage.)

Antwort

6

Der Grund, warum Singletons schlecht für die Testbarkeit sind, ist, dass sie sich sehr ähnlich verhält wie ein globales (lesen Sie Misko Heverys ausgezeichneten Artikel zu diesem Thema here). Und so würden Sie aufgrund einer Abhängigkeit, die Sie nicht aus Ihren Tests kontrollieren können (sprich der Singleton-Klasse), mit brüchigen oder unzuverlässigen Tests enden, ganz zu schweigen von der Fülle anderer Übel, die in dem oben verlinkten Artikel erwähnt sind.

Dependency-Injektion ist der Weg zu gehen, denke ich. Wenn es zu mühsam wird, können Sie die factory pattern verwenden, um die Logik zu isolieren, die Abhängigkeiten einrichtet. Und wenn Sie wirklich den ganzen Weg damit gehen wollen, könnten Sie ein Inversion des Kontrollwerkzeugs wie StructureMap verwenden.

4

Nein. Es ist Ihre Software, und Sie haben (wahrscheinlich nach gründlicher Überlegung, da Sie fragen eine zweite Meinung), dass es ein effektives Design ist. Irgendwann muss Ihr eigenes Urteil über die gegenwärtige Situation Vorrang vor dem Schreiben anderer über allgemeine Prinzipien haben.

+0

Ich mag diese Antwort wirklich wirklich. Es ist möglich, dass sich Ereignisse ändern und daher muss die Lösung geändert werden, aber das ist bei den meisten Softwareprojekten der Fall. –

2

Singleton ist immer eine schlechte Idee. Denken Sie nur darüber nach, was Sie tun würden, wenn Sie plötzlich mehrere Threads in Ihrer Anwendung ausführen müssten. Es ist wie alte gehasste globale Variablen mit etwas Make-up darüber.

Manchmal ist es jedoch einfacher, ein Singleton zu erstellen, als Tonnen von Code zu schreiben, der ein halbes Dutzend einfacher Objekte durchläuft. Wenn Sie also viel Zeit sparen, würde ich trotz aller Konsequenzen gehen.

+0

Ein Singleton kann threadsicher gemacht werden (obwohl es in C++ Probleme mit der Bau-/Zerstörungsreihenfolge geben kann). OTOH, das die Verwendung von Singleton vermeidet, sorgt nicht automatisch für Thread-Sicherheit. (Allerdings stimme ich zu, dass die Verwendung eines Singleton ist immer eine schlechte Idee. Für die Begründung, siehe zB: http://StackOverflow.com/Questions/137975/what-is-so-bad-about-Singletons) – Reunanen

+0

Es kann thread-safe gemacht werden, aber da es sehr komplex sein kann, ist es nicht immer eine triviale Aufgabe. – vava

Verwandte Themen