Ankündigung

Einklappen
Keine Ankündigung bisher.

Namespaces, Case sensitivity und Verzeichnisstruktur

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Namespaces, Case sensitivity und Verzeichnisstruktur

    Moin Leute,


    Weil ich gerade dabei bin, die Namespaces meines Projektes stark umzustrukturieren bin ich wieder beim Problem mit der Groß- und Kleinschreibung der Verzeichnis- und Dateinamen gekommen.

    Also mal ganz von vorne erklärt:

    Der Source-Code für das Projekt implementiert die Namespaces etwa so:

    Code:
    \Daemon
        \Core
        \GameImplementations
            \ActionHandlers
            \Servers
        \Server
        \Plugin
        \API
            \Adapters
            \Converters
            \Handlers
        \Lib
            \MySQL
            \Network
            \IO
    Da sind dann verschiedene Klassen drin, also z.B.:

    Code:
    \Core\Core
    \Server\Server
    \Server\Player
    \Server\PlayerMapper
    Die Namespaces und Klassen beginnen alle mit einem Großbuchstaben, sowie, wenn sie aus zusammengesetzten Wörtern bestehen, ist deren erster Buchstabe auch groß geschrieben. Soweit ich weiß, ist das Konvention. Das dient der Übersichtlichkeit und der Lesbarkeit. Klassen und Namespaces, sowie deren Objekte GROß, der Rest klein.

    Eigentlich hätte ich jetzt die Struktur genauso als Verzeichnisstruktur implementert, wobei die Klassen .class.php als Endung bekommen. Einfach konsitent zur Benennung im Code.

    Jetzt kommt aber wieder das alte Problem mit Windows bzw. Linux ins Spiel: Windows ist case insensitive, Linux case sensitve ...

    Eigentlich ist es aber ja gar kein Problem, die Verzeichnisse genauso zu nennen, wie die Namespace Struktur es hergibt. Aber nur solange man konsitent bleibt.
    Meiner Meinung nach ist das gar kein Problem. Weder auf Linux noch auf Windows. Immerhin haben wir ja im Code die Klassen und Namespaces sowieso schon benannt. Und der Code ist case sensitive.

    Einer Meiner Entwickler hatte aber dazu auch schon seine Meinung abgegeben: Alle Verzeichnisse werden klein geschrieben.

    Ich persönlich finde das Mist! Es hageln deswegen nur Probleme. Warum sollte plötzlich alle Verzeichnisse klein geschrieben werden, nur weil Linux case sensitive ist? Groß- und Kleinschreibung ist doch gar kein Problem. Immerhin ist mein Code doch auch case sensitive. Und wenn die Dateien genauso heißen wie die Klassen, ist es doch auch egal, ob dort Groß- und Kleinschreibung verwendet wird.

    Dessen Lösung ist doch VIEL inkonsistenter, oder nicht? Und nur weil Linux case sensitive ist, dem Problem damit aus dem Weg zu gehen, alles klein zu schreiben, ist ABSOLUT keine saubere Lösung und gefällt mir GARNICHT! Das Problem liegt hier in meinen Augen auch nur beim Anwender und nicht bei Linux oder Windows. Wenn er sich an Konventionen hält und sich auch vorher mal über die Verzeichnisstruktur informiert, sollte alles gegessen sein.

    Außerdem kommt meine IDE dauernd damit ins schludern. Es erkennt nicht, ob der Name und Namespace gleich ihres Dateinames bzw. Verzeichnisstruktur ist. Die Namespaceunterstützung ist damit in vielen Fällen, vor allem beim Erstellen neuer Klassen und beim Refactoring total nutzlos...

    Wie es mit der spl_autoload_register()-Funktion aussieht ist auch so ne Sache. Die macht in der aktuellen Konfiguration mit immer kleingeschriebenen Verzeichnisnamen bestimmt auch Probleme, weil Klassennamen und Dateinamen nicht konsistent sind.

    Jetzt wollte ich mal eure Meinung dazu hören.

    Gruß
    Manu


  • #2
    Ich persönlich finde das Mist! Es hageln deswegen nur Probleme. Warum sollte plötzlich alle Verzeichnisse klein geschrieben werden, nur weil Linux case sensitive ist? Groß- und Kleinschreibung ist doch gar kein Problem. Immerhin ist mein Code doch auch case sensitive. Und wenn die Dateien genauso heißen wie die Klassen, ist es doch auch egal, ob dort Groß- und Kleinschreibung verwendet wird.

    Dessen Lösung ist doch VIEL inkonsistenter, oder nicht? Und nur weil Linux case sensitive ist, dem Problem damit aus dem Weg zu gehen, alles klein zu schreiben, ist ABSOLUT keine saubere Lösung und gefällt mir GARNICHT! Das Problem liegt hier in meinen Augen auch nur beim Anwender und nicht bei Linux oder Windows. Wenn er sich an Konventionen hält und sich auch vorher mal über die Verzeichnisstruktur informiert, sollte alles gegessen sein.
    Ich benutze seit Jahren - für meinen eigenen Code - nur noch Kleinschreibung im Dateinamen. Nicht nur wegen Autoloading, sondern weil zeitweise mein FTP-Client die merkwürdige Eigenart/Konfiguration hatte, Dateinamen umzuwandeln. Alles andere ist für mich verschwendete Lebenszeit.

    Im Übrigen ist Dein Code was Bezeichner anbelangt eben nicht case sensitive. Ein konsequente Benamung hat nur einen Zweck: Die bessere Unterscheidbarkeit für Dich als Mensch, dem Interpreter ist das reichlich egal.
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Zitat von nikosch Beitrag anzeigen
      Ich benutze seit Jahren - für meinen eigenen Code - nur noch Kleinschreibung im Dateinamen. Nicht nur wegen Autoloading, sondern weil zeitweise mein FTP-Client die merkwürdige Eigenart/Konfiguration hatte, Dateinamen umzuwandeln. Alles andere ist für mich verschwendete Lebenszeit.
      Aber was ist das dann für ein FTP-Programm?


      Zitat von nikosch Beitrag anzeigen
      Im Übrigen ist Dein Code was Bezeichner anbelangt eben nicht case sensitive. Ein konsequente Benamung hat nur einen Zweck: Die bessere Unterscheidbarkeit für Dich als Mensch, dem Interpreter ist das reichlich egal.
      Okay, gut. Das hab ich tatsächlich bis jetzt nicht wahrgenommen. Ändert aber an dem Problem nichts.

      Kommentar


      • #4
        Das war und ist der eingebaute FTP-CLient im TotalCommander (damals noch WindowsCommander).*)

        Ändert aber an dem Problem nichts.
        Finde ich schon. Das einzige was dagegen spricht, ist doch Deine Konvention, mit der Du die Ablehnung begründest. Nun entbehrt diese aber jegliche Logik, denn ob ich new FooBar oder new fooBar aufrufe, ist syntaktisch egal. Der Autoloader leitet jedoch den Dateinamen aus dem aufgerufenen Bezeichner ab, nicht aus dem Bezeichner, der im zugehörigen File die Klasse definiert. Du kannst aber die Flexibilität des Aufrufs nicht 1:1 auf Dateinamen abbilden.

        Aber wie gesagt - eigentlich ist die Diskussion rein akademisch. Weil es eine sehr einfache, unkomplizierte und solide Lösung gibt.


        *) Im Übrigen dürfte dieses Feature genau dem Problem mit den unterschiedlichen Behandlungen von Groß- und Kleinschreibung geschuldet sein.
        --

        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


        --

        Kommentar


        • #5
          Vorweg: Das wichtigste ist, dass man sich einig ist. Es gibt so viele Diskussionen über Code-Guidelines, aber man kann es nie jedem recht machen (z.B. auch "Tabs vs. 4 Spaces"). Es sollte innerhalb eines Projekts einfach mal ausgesprochen und demokratisch abgestimmt werden. Und dann haben sich alle dran zu halten.

          Ich persönlich bevorzuge bei Dateinamen genau die Schreibweise, die auch die Namespaces / Klassen tragen, was in der Regel CamelCase mit großem Anfangsbuchstaben entspricht. Des weiteren halte ich mich größtenteils an die Standards PSR-0, PSR-1 und PSR-2. Warum? Weil ich damit bisher gut arbeiten konnte und diese Standards in meinen Projekten größtenteils auch Anwendungen gefunden haben (auch schon bevor sie zum Standard wurden). Aber wie gesagt: Diese Standards sind nur Vorschläge! Es ist keiner gezwungen, sich daran zu halten. Aber es ist einfach, wenn man jemandem die Code Guidelines erklären will. Dann gibt man ihm einfach den Link zu PSR 0-2 und jeder weiß Bescheid

          VG

          Kommentar


          • #6
            Es wäre recht einfach möglich, eine automatisch generierte Map im Autoloader zu platzieren, die Lower-Case-Klassennamen und Mixed-Case-Dateipfade verbindet.

            PHP-Code:
            $map = array(
                
            'foo\\bar\\baz' => 'Foo/Bar/Baz.class.php'
                
            // ...
            ); 
            Den im Autoloader eingehenden Klassennamen dann eben in lower case umwandeln und nach einer Entsprechung im Array suchen.

            Ist nicht so mordsmäßig effizient, aber vielleicht was für den Hinterkopf, wenn ihr wirklich so große Probleme damit habt. Kannst in den Autoloader zusätzlich noch einen Logger einbauen, der registriert, wenn ein Klassenname reinkommt, zu dem es in derselben Groß-/Kleinschreibung nichts im Dateisystem gibt. Hm, oder für Entwicklungssysteme auch gleich einen Mechanismus, der einen Fehler produziert.

            Ich sehe andererseits kein wirklich gutes Argument gegen rein lower case Dateinamen, aber ich müsste lügen, wenn ich behaupten würde, dass ich nicht (gefühlt zumindest) x-fach mehr Zeit damit verbracht hätte, Expection in Exception zu ändern als mit falscher Groß-/Kleinschreibung in Klassennamen. Bin allerdings auch unter Linux.

            Ich handhabe es so wie BR2012.

            Kommentar


            • #7
              Ich seh schon, es läuft auf eine Glaubensfrage hinaus.

              Ja, innerhalb des Projektes wird das gerade geklärt Sind leider 2 Dickköpfe am Werk, das ist vllt nicht die optimale Zusammensetzung, aber wird schon iwie hinhauen

              Auf Performance kommt es bei unseren Projekt übrigens tatsächlich nicht an, aber einen riesigen Autoloader zu implementieren hab ich eigentlich auch keine Lust

              Kommentar


              • #8
                aber einen riesigen Autoloader zu implementieren hab ich eigentlich auch keine Lust
                Kannst ja auf Fertiges zurückgreifen, z.B. Composer. Ist zwar primär als Paketverwaltung für PHP entwickelt worden, kann aber auch einen Autoloader für den PSR-0 Standard oder eben mit ClassMap für das eigene Projekt erstellen. Siehe hier

                VG

                Kommentar

                Lädt...
                X