hmm: Gutlesbares, objektorientiertes JavaScript Projekt gesucht

Hi Leute,

ich frage mich seit längerem, wie gut lesbar ein größeres, objektorientiertes JavaScript Projekt gestaltet werden kann. Mit objektorientiert meine ich Klassen, Vererbung und eventuell einen MVC Ansatz ohne Framework und idealerweise ein paar Junit Testklassen.

Habt ihr dazu nen Link oder ein passendes Projekt bei GitHub das ich mir mal angucken kann? Node JS darf gerne mit dabei sein.

Hintergrund meiner Frage ist, dass ich meinen persönlichen JavaScript Code potthässlich finde, aber gerne viele Sachen die ich derzeit mit Java oder Python mache mit Serverseitigem JavaScript lösen würde.

  1. Das habe ich gerade geschrieben:

    File kmean.js im Ordner learn.

    /**
     * KMean.
     * 
     * Bekommt ein Array von Arrays uebergeben, wobei
     * die Arrays im Array Vektoren entsprechen. Die getCluster Methode
     * berechnet fuer diese Vektoren die gewuenschte Anzahl an Clustern.
     */
    function KMean(data) {
    
        this.getCluster = function(anzahlCluster) {
            var clusterfck = require("clusterfck");
            var clusters = clusterfck.kmeans(data, anzahlCluster);
            return clusters;
        }
    }
    
    module.exports = KMean;
    

    Und File dbManager.js im Ordner Database:

    /**
     *  Datenbank Manager.
     */
    function DbManager(dbPfadName) {
        
        var dbRef = dbPfadName + ".db";
        
        var SQL_CREATE_TABLE = "create table if not exists ? (produkt1 integer, produkt2 integer, produkt3 integer);";
         
        this.createTable = function(tableName) {
            var sqlite3 = require('sqlite3').verbose();
            var db = new sqlite3.Database(dbRef);
            var statment = SQL_CREATE_TABLE.replace("?", tableName);
            db.run(statment);
            db.close();
        }
    }
    

    Und hier der Testaufruf im File dbManager.js:

    // Testaufruf
    var dbManager = new DbManager("../../skills");
    dbManager.createTable("kMeanDaten");
    
    const KMean = require('../learn/kmean.js');
    
    var colors = [
       [20, 20, 80],
       [22, 22, 90],
       [250, 255, 253],
       [0, 30, 70],
       [200, 0, 23],
       [100, 54, 100],
       [255, 13, 8]
    ];
    
    var kmean = new KMean(colors);
    console.log(kmean.getCluster(3));
    

    Glaubt ihr das ich auf die Art und wiese ein Projekt mit ca. 100 Klassen sauber hochziehen und Refaktoren kann? Oder wird das anders als java irgendwann extrem unübersichtlich? Ich möchte jetzt nicht anfangen Monatelang zu entwickeln nur um dass projekt am ende verwerfen zu müssen, weil der Code Unwartbar aussieht. Habt ihr paar Hinweise oder Tips?

    1. Das habe ich gerade geschrieben:

      File kmean.js im Ordner learn.

      Was soll das Modul leisten, was require("clusterfck").kmeans nicht schon könnte? Auf mich macht die Datei einen überflüssigen Eindruck.

      Und File dbManager.js im Ordner Database:

      Du musst das Rad nicht neu erfinden. Es gibt etliche gute Libraries für die Interaktion mit Datenbanken. Wenn du selber SQL-Queries schreiben musst, machst du dir nur unnötige Mühe.

      Und hier der Testaufruf im File dbManager.js:

      Was willst du hier testen? Ein Test folgt üblicherweise einem einfachen Muster: Du hast eine Rechnung, ein paar exemplarische Eingaben, und eine Erwartung an das Ergebnis. Die Aufgabe des Tests ist es zu prüfen, ob die tatsächliche Berechnung für eine bestimmte Eingabe den korrekten Erwartungswert liefert. Zum Beispiel, testet der folgende Code ob Math.sin(0) auch tatsächlich 0 ergibt. Die Rechnung ist also Math.sin, meine Beispieleingabe 0 und mein Erwartungswert ist ebenfalls 0:

      const expected = 0;
      const actual = Math.sin(0);
      console.assert(expected === actual, 'Math.sin(0) is not 0!');
      

      In deinem Test sehe ich eine Beispieleingabe und eine Berechnung. Aber es fehlt der Erwartungswert und die Überprüfung, ob beides miteinander übereinstimmt. Und dazu gesellt sich noch überflüssiger Code, der mit dem eigentlichen Test nichts zu tun hat.

      1. Hallo 1unitedpower,

        Aber es fehlt der Erwartungswert

        Heißt das tatsächlich auch Erwartungswert?

        Bis demnächst
        Matthias

        --
        Rosen sind rot.
        1. Heißt das tatsächlich auch Erwartungswert?

          In der Fachliteratur spricht man von (Test-)Orakel, in diesem Fall von einem menschlichen Orakel, weil ich von meinem Wissen ausgegangen bin, dass sin(0) = 0 gilt.

          1. Hallo 1unitedpower,

            Danke.

            Bis demnächst
            Matthias

            --
            Rosen sind rot.
      2. danke. ich hab das falsch formuliert, was ich gepostet habe sind einfach meine ersten zwei JavaScript Klassen. Bisher habe ich immer nur Funktionen in JS verwendet und jetzt versuche ich auf Objektorientiertes JS umzusteigen.

        Was ich oben gepostet habe sind einfach nur zwei Klassen die ich geschrieben habe weil ich sie schreiben konnte und weil ich sehen wollte wie das so "clean Code" technisch aussieht, wenn man in einem File zwei Klassen aufruft.

        1. bei Java/Maven Projekten hatte ich früher Vorlagen anhand derer ich lernen konnte wie man lesbaren Objektorientierten Javacode schreibt. Jetzt suche ich ähnliche "Vorlagen" für Objektorientiertes JavaScript. Dabei geht es mir um die Code Qualität bzw. die Lesbarkeit.

          Mein aktueller JavaScript Code ist leider so "verdreckt", dass es mir keinen Spass mehr macht mit diesem Code weiterzuarbeiten. Darum möchte ich jetzt lernen saubere Objektorientierte JS Projekte zu schreiben.

          1. Du legst den Fokus zu sehr auf Objektorientierung. Idiomatisches JavaScript nutzt die volle Spannweite der verfügbaren Programmier-Paradigmen. Application-Level Code ist häufig eine Mischung aus Objektorientierung und funktionaler Programmierung, wobei der Trend von OOP eher wegzuführen scheint. Performancekritische Teile sind häufig noch rein prozedural. Du musst die verschiedenen Vor- und Nachteile kennen lernen, um die Programmiersprache effektiv einzusetzen, da ist es kontraproduktiv, wenn du dich von vornerein auf OOP festlegst. Kyle Simpson, Eric Elliot, Axel Rauschmayer und Paul Irish sind hervorragende JavaScript-Entwickler, die ihre Erfahrungen in Blogs/Büchern und auf Konferenzen teilen. Einem Code siehst du ohne Erläuterung nicht an, weshalb der Programmierer sich für oder gegen ein bestimmtes Design entschieden hat. Die Gedanken, die dazu geführt haben, sind wertvoll - daraus kannst du wirklich lernen.