Reinhard: JavaScript - Der gute Stil

Hey,

ich wüsste gerne, was ihr zu einer bestimmten Regel in meinem Style-Guide sagt. Es geht um die Einrückung bei Variablenaufzählungen in Modulen. Folgende Beispiele:

(function() {
    var myModule = (function() {
        var var1 = {
                prop1 : 'val1',
                ...
            },
            var2 = function() {
                // do something
            },
            var3 = 42,
            ...;
        
        return {
            var2 : var2
        };
    })();
    window.myModule = myModule;
})();
(function() {
    var myModule = (function() {
        var var1 = {
            prop1 : 'val1',
            ...
        };
        var var2 = function() {
            // do something
        };
        var var3 = 42;
        var ...;
        
        return {
            var2 : var2
        };
    })();
    window.myModule = myModule;
})();

Bisher nutze ich eigentlich 1), neulich habe ich mir aber mal meinen Style-Guide gründlich angeschaut und dabei ist mir diese riesige Lücke zwischen der 1. Variablendeklaration im Modul und der nächsten Zeile ins Auge gesprungen und nun frage ich mich, was Andere davon halten bzw. welche Variante ihr bevorzugen würdet (und ggf. wann ihr (nicht) zu Variablenaufzählungen greifen würdet).

Reinhard

  1. Hallo Reinhard!

    Meine persönliche Meinung: Kombiniertes var mit Komma, wenn die Variablen jeweils in einer Zeile direkt hintereinander stehen (also kurze Deklarationen)

    var foo = 1,
        bar = 'test',
        baz = [1,2,3]
    

    Aber bei komplexeren Sachen, wie Objektliteralen in deinem Fall würde ich ein var-Statement pro Variable verwenden, sonst leidet mMn die Lesbarkeit zu stark. Und irgendwo ein Semikolon statt des Kommas führt zu einer versehentlich eingeführten globalen Variable...

    Grüße andaris

    1. Im Styleguide meines Brötchengebers steht auch die strikte Form mit EINMAL var und dann nur noch Kommas. Und genau wie Du finde ich das arg unübersichtlich. Wenn bei Dir kein Lint-Programm läuft, dass dir die multiplen var-Angaben um die Ohren haut, mach es so wie du es am besten lesen kannst.

      Das SINGLE-VAR scheint irgendwann einmal ein Guru festgelegt zu haben, ohne an Real-World(tm) Programme zu denken, und alle schreiben davon ab...

      Andererseits muss man sich fragen: Ist es wirklich gut, wenn man so viele Variablen deklariert dass man die Übersicht verliert? Ist die Funktion dann nicht zu groß? Wenn man in einer Var-Deklaration ein größeres Objektliteral erzeugen muss, wäre es dann vielleicht sinnvoll das in eine separate Funktion auszulagern? Nur der Übersichtlichkeit halber? Ist nur ein Gedanke, kann im konkreten Fall nicht hilfreich sein.

      Gruß Rolf

      1. Im Styleguide meines Brötchengebers steht auch die strikte Form mit EINMAL var und dann nur noch Kommas. Und genau wie Du finde ich das arg unübersichtlich. Wenn bei Dir kein Lint-Programm läuft, dass dir die multiplen var-Angaben um die Ohren haut, mach es so wie du es am besten lesen kannst.

        Deswegen haben wir unter anderem diese Regel ausgeschaltet: /*jslint vars: true, plusplus: true */ So sehr ich Herrn Crockford schätze, aber teilweise übertreibt er es mit den Standardeinstellungen ein wenig ;) Gut, dass man JSLint konfigurieren kann.

        Das SINGLE-VAR scheint irgendwann einmal ein Guru festgelegt zu haben, ohne an Real-World(tm) Programme zu denken, und alle schreiben davon ab...

        Siehe oben... Code Styles sind zwar sinnvoll, aber entscheidend sollte am Schluss das einfache Verständnis sein. Sonst führt es nur zu seltsamen konstrukten die zwar laut Linter OK, aber dafür schwer zu durchschauen sind.

        Andererseits muss man sich fragen: Ist es wirklich gut, wenn man so viele Variablen deklariert dass man die Übersicht verliert? Ist die Funktion dann nicht zu groß? Wenn man in einer Var-Deklaration ein größeres Objektliteral erzeugen muss, wäre es dann vielleicht sinnvoll das in eine separate Funktion auszulagern? Nur der Übersichtlichkeit halber? Ist nur ein Gedanke, kann im konkreten Fall nicht hilfreich sein.

        Richtig, außer für simple Value-Objects (zB Standard-Config etc.) sollte es wenig Gründe geben, Objektliterale direkt im Code zu erzeugen. Diese und auch normale Objekte sollten am besten mittels einer Factory erzeugt oder aus einem Servicecontainer abgefragt und dann mittels Dependency Injection an deine Klasse(n) übergeben werden.

        Grüße andaris