How to shoot yourself in the foot – Practical JavaScript

Entwickler sind schon faule Säcke. Nachdem ich zum zweiten Mal in JavaScript Code schreiben musste, der auf ein Datum ein paar Tage drauf addiert, hatte ich die Faxen dicke und verpasste dem Date-Objekt eine Methode namens addDays.

Also sowas wie:

Date.prototype.addDays = function(numOfDays) {this.setDate(this.getDate() + numOfDays);};

Ok – man sollte prüfen, ob es einen Parameter gab – ich weiss. Was nun aber passierte war, dass ein Datum, welches ich als Referenz brauchte, durch die Gegend gereicht wurde. Manchmal musste ich auf dieses Datum ein paar Tage drauf addieren. Das sollte man besser auf einer Kopie machen. Tja, die Geister, die ich rief…

Lesson learnt: Wenn man Javascript objektorientiert einsetzt, sollte man das auch durchgängig tun und beachten.

BTW: Eine interessante Nebendiskussion entwickelt sich mit einen Kollegen: Um mehrere Methodenaufrufe auf dem Objekt nacheinander machen zu können, sollte man das returnieren. Keine schlechte Idee.

Also fix gemacht:

Date.prototype.addDays = function(numOfDays) {this.setDate(this.getDate() + numOfDays);return this;};

Schlagartig sind (fachlich deutlich verbessert lesbare) Dinge möglich wie:

var aDate = new Date();aDate.addDays(21).clearTime().addYear(1); 

Die Rückgabe von this wäre natürlich eine gute Stelle, einen Klon anzulegen sowie auf diesem die Operation durchzuführen. Man wäre die Objektdenke wieder los (und damit näher an JavaScript):

Date.prototype.addDays = function(numOfDays) {var newDate = new Date(this.valueOf());newDate.setDate(newDate.getDate() + numOfDays);return newDate;};

Da hatten wir eine schöne philosophische Diskussion miteinander, wie man solche Arten von Problemen löst. Zwei Seelen schlagen seitdem in meiner Brust: des lieben Speicher willens würde ich ungerne exorbitante Objekte erzeugen, des Usability Safe Erweiterns wegen muss man über die Neuerzeugung schon ein bisschen nachdenken. Allerdings muss man sich dann immer das neu erzeugte Objekt merken. Nee – Spaghetticode – ich bleibe bei this!

 

No comments yet.

Leave a Reply