Rolf b: static oder instanz bei einmaliger anwendung?

Beitrag lesen

Sprichst Du rein akademisch, oder hast Du eine bestimmte Programmiersprache im Sinn? Deinen Beispielen zu Folge denkst Du wohl konkret an Javascript.

"Eine Klasse mit statischen Methoden", das gibt's in Javascript nicht, weil es keine Klassen gibt. Man kann welche simulieren (über Konstruktorfunktionen und Prototyp-Objekte). In TypeScript gibt's das zur Laufzeit genausowenig, weil TypeScript bekanntlich in JavaScript übersetzt wird.

Was Dir vorschwebt, ist vermutlich etwas in dieser Art:

var MyStaticClass = {
   foo: function(bla) { return bla+1; },
   bar: function(bla) { return bla-1; }
};

let sieben = MyStaticClass.foo(5);

Es ist aber ein Objekt mit direkt an das Objekt gebundenen Methoden.

Und unter der einzigen Instanz einer Klasse verstehst Du dann vermutlich das hier:

function MySingleton() {
   this.foo = function(x) { return x+1; }
}
MySingleton.prototype.bar = function(x) { return x-1; }

var singleton = new MySingleton();

var fuenf = singleton.foo(3);
var sieben = singleton.bar(9);

In dieser Konstruktion ist der Aufruf von singleton.foo genauso schnell wie der von MyStaticClass.foo, weil es beide Male ein Property direkt am Objekt ist, das die Methodenimplementierung liefert. singleton.bar ist etwas langsamer, weil JavaScript zuerst eine vergebliche Suche am singleton-Objekt durchführt bevor es im Prototypobjekt sucht. Diese Differenz ist aber normalerweise so minimal, dass Du sie vernachlässigen kannst.

Performance ist nicht das Thema.

Etwas anderes ist es, wenn man best-practices der Objektorientierten Programmierung betrachtet. Man versucht nämlich, Abhängigkeiten zwischen Klassen zu minimieren. Wenn Du eine Klasse B hast, die statische Methoden der Klasse A nutzt, dann hast Du eine harte Abhängigkeit zwischen B und A. Angenommen, die Methoden von A sind keine isolierten Logiker, sondern greifen auf Ressourcen zu oder turnen im DOM herum. Dann bist Du nicht mehr im Stande, die Klasse B einem Unittest zu unterziehen, ohne das Laufzeitumfeld komplett bereitzustellen. Wenn B aber nur eine Abhängigkeit zu einem Interface I hat, das von A implementiert wird, kannst Du für den Unittest dem getesteten Objekt der Klasse B eine Klasse XY unterschieben, die ebenfalls I implementiert, aber die Aktivitäten von A nur simuliert.

Um das zu systematisieren, verwendet man Tools zur Dependency Injection.

TypeScript setzt dem Ganzen dann wiedermal die Krone auf. Da kannst Du eine Funktion definieren, die ein bestimmtes Interface erwartet, und schmeißt dann beim Aufruf eine Klasse ein, deren statische Methoden das Interface implementieren. Das klappt deshalb, weil JavaScript keine Klassen kennt, sondern Prototypobjekte. D.h. für Unittests kannst Du dann eine Mock-Klasse einschmeißen.

Ich hoffe, deine Verwirrung nicht allzusehr gesteigert zu haben...

Rolf