einmalige Funktions Parameterübergabe
MB.
- javascript
- programmiertechnik
0 dedlfix0 James Moriarty0 pl1 Meme
Guten Morge,
ich will ne funktion erstellen die nur einmal ausgeführt wird. es geht mir um performance. prüfung intern
var boo = true;
var bar = function( baz ) {
bool = false;
// ...
return baz;
};
var foo = function( baz ) {
// ...
bool ? bar( baz ) : else return baz;
};
oder prüfung extern
var boo = true;
var bar = function( baz ) {
bool ? bool = false : return baz;
// ...
return baz;
};
var foo = function( baz ) {
// ...
return bar( baz );
};
Ich denke der Nachteil ist das der Interpreter immer wieder die externe funktion aufruft nur um über diese Funktion den wert zurückgeliefert zu bekommen, egal ob true oder false. - Ist das eine art Singleton Pattern von GoF Paradigmen? - Anders ist das beim ersten beispiel. da mussder Interprete nur auf false prüfen und dann den wert intern abgreifen.
Macht das nur marginal unterschied? Das Profil des Browsers ist nicht sehr auschlaggebend und es ist nur ein system.
mfg MB
Tach!
ich will ne funktion erstellen die nur einmal ausgeführt wird. es geht mir um performance.
Mach es andersrum. Erstell das Objekt oder das Ergebnis oder was auch immer und reich das an diejenigen Teile durch, die es haben wollen, anstatt dass alle an eine definierte Stelle schauen müssen und du dort einen Zirkus machen musst, damit das ja nicht mehrfach ausgeführt wird. Sowas nennt sich Dependency Injection und don't look for things.
Alternativ braucht man einen Mechanismus, der beim Programmstart oder erstmaligem Zugriff einen statischen Konstruktor ausführt, der dafür sorgt, dass die Instanz angelegt und in einer Variable abgelegt wird. Danach ist sie ohne weitere Prüfung abrufbar, solange sie niemand wegräumt. Static Constructors gibt es in C# und für Typescript hat das mal jemand als Feature angefragt. "ahejlsberg" (ja, der A. Hejlsberg, Erfinder diverser Programmiersprachen) hat darauf geantwortet und zumindest sein zweiter Vorschlag lässt sich auch mit einfachem Javascript recht einfach implementieren.
Ist das eine art Singleton Pattern von GoF Paradigmen?
Ein echtes Singleton ist, wenn es nur eine einzige Stelle gibt, an der man das gewünschte Ding bekommt. Bei unechten Singletons kann man theoretisch auch auf anderem Wege zugreifen, aber man diszipliniert sich soweit, das nur auf dem vorgesehenen Weg zu tun.
Anders ist das beim ersten beispiel. da mussder Interprete nur auf false prüfen und dann den wert intern abgreifen. Macht das nur marginal unterschied?
Hat man keine statische Initialisierung, muss beim Singleton üblicherweise bei jedem Zugriff geprüft werden, ob die Instanz schon existiert oder erst noch erstellt werden muss. Bei Dependency Injection übergibt man einfach und greift darauf zu. Du musst dann allerdings selbst dafür sorgen, dass die Instanz existiert, wenn du keinen Dependency Injection Framework verwendest, das sich darum kümmert. Das wird aber auf ähnliche Weise bei jedem Bedarf prüfen, ob das Ding existiert, bevor es es übergeben kann, bringt also keinen Performance-Gewinn. Vermutlich ist die Frage nach der Performance aber eh vernachlässigbar, wenn du nicht gerade unzählig viele Zugriffe auf das Ding programmiert hast.
dedlfix.
Die grundlegende Idee von dedlfix, dass Du diese Einmalsteuerung nach Möglichkeit ganz vermeiden solltest, kann ich nur unterstützen.
Es mag aber auch Fälle geben, wo es nicht anders geht.
Natürlich kostet ein Funktionaufruf ein bisschen Zeit, es ist in JS aber nicht wie in PHP, wo solche Aufrufe als richtig teuer gelten. Darum kannst Du diese "do it once" Steuerung schon in bar() konzentrieren. Die Einmalaktion selbst kannst Du im Sinne von Separation of Concerns nochmal in eine eigene Function auslagern.
Du solltest aber auf jeden Fall vermeiden, die Einmalausführung mit einer globalen Variablen zu steuern. Besser wäre, den Umstand zu nutzen dass Funktionen Objekte sind, denen man nach Belieben Attribute ankleben kann. Und um zum Anlegen dieses Properties nicht auf globale Variablen zugreifen zu müssen, macht man das mit einer named function expression:
var bar = function barFunc(baz) {
if (!barFunc.hasRun) {
barFunc.hasRun = true;
baz = bar_single_action(baz);
}
return baz;
}
Der Name barFunc
ist nur innerhalb der Function sichtbar.
Eine bösere Implementierung könnte so aussehen:
var bar = function(baz) {
bar = x => x; // bar durch Identitätsfunktion ersetzen
return bar_single_action(baz);
}
COBOL Programmierer aller ALTERsstufen wären begeistert - endlich wieder selbstmodifierender Code (wer den Witz nicht kapiert, ist zu jung :D ).
Ob diese Nummer nützlich ist oder eine Form akademischer Selbstbefriedigung darstellt, ist eine andere Frage. Wenn Du irgendein IoT Device hast, das mit einem Metronom getaktet ist, mag es relevant sein. Auf allen anderen Geräten reden wir hier von Performancegewinn im Bereich weniger Nanosekunden. Da gewinnst Du vermutlich mehr, wenn Du dein Markup oder dein CSS verbesserst.
Gruß M.
Leider gibt es in JS kein static. Aber Du kannst ein quasi-statisches Verhalten über eine Eigenschaft der Funktion erreichen. Zum Beispiel wäre innerhalb des Funktionskörpers this.var eine quasi statische Variable, in this.var gespeicherte Werte stehen bei jedem Funktionsaufruf weiterhin zur Verfügung. Hier ein Beispiel
Auf diese Art und Weise kannst Du auch Rückgabewerte von Funktionen cachen: Immer dann, wenn derselbe Parameter übergeben wird, muss das Ergebnis nicht neu berechnet/ermittelt werden, die Funktion kanns gleich ausm Cache zurückliefern (Cache ist eine statisch deklarierte Variable, Arry oder Objekt).
PS: Bist Du der Sohn vom Steffen B. aus Aachen?
Leider gibt es in JS kein static. Aber Du kannst ein quasi-statisches Verhalten über eine Eigenschaft der Funktion erreichen. Zum Beispiel wäre innerhalb des Funktionskörpers this.var eine quasi statische Variable, in this.var gespeicherte Werte stehen bei jedem Funktionsaufruf weiterhin zur Verfügung. Hier ein Beispiel