Facebook
Twitter
Google+
Kommentare
5

phm-0.1: Benamung von Klassen

Vorgestern gab es ja den ersten Teil zu meiner kleinen Standardisierungs-Serie. Gestern ist dort in den Kommentaren dann auch eine Diskussion entstanden, die recht interessiert war bzw. ist. Danke dafür an alle Beteiligten. Ich werde die nächste Zeit nochmal die Diskussionen Revue passieren lassen und vielleicht meinen Standard daraufhin auch anpassen. Je nachdem wie die Argumente der unterschiedlichen Parteien aussehen werden. Wer also Lust hat, sollte sich beteiligen.

Fangen wir erstmal mit einer Richtigstellung an. Ich hatte gestern gesagt, die Klassen sollten sich im Namespace Http\Request liegen, was natürlich nicht ganz richtig ist. Die Klassen müssen im Namespace phm\LibraryName\Http\Request liegen. Ansonsten würden sie nicht dem psr-0 entsprechen. Danke dafür an Thomas.

Wir waren im letzten Artikel bei den Interfaces stehen geblieben und haben uns noch keine Gedanken darüber gemacht, wie jetzt eigentlich konkrete Implementierungen benamst werden. Dort gibt es wie ich finde nur eine Sache, die man festlegen muss. Wir hatten gesagt, wir wollen einen Http-Request implementieren, der cURL nutzt, um Aufrufe zu tätigen. Wie schon das Interface muss jetzt die Implementierung im Request-Namespace liegen. Wie aber heißt die Klasse? Ich finde hier haben zwei Alternativen Gültigkeit. Zum einen kann man die Klasse einfach CURL nennen. Da sie sich im Request-Namespace befindet ist klar, dass es sich dabei um einen Request handelt und man muss es nicht mehr explizit im Namen angegeben werden. Die zweite Möglichkeit wäre es CURLRequest zu nennen. Hier hat man zwar eine Dopplung, bei der Verwendung im Code ist es aber klarer, dass es sich um einen Request handelt und das Lesen wird dadurch erleichtert.

Trotz der Dopplung würde ich zur zweiten Lösung tendieren, da ich dort die Lesbarkeit des Codes erhöhe. Die Regel dazu lautet also:

  • Klassen tragen ihren Typ im Klassenamen und nicht nur im Namespace.

Wenn wir jetzt diese ganzen Regeln in Beispiele packen wollen, so haben wir folgende Klassen und Interfaces:

  • phm\LibraryName\Http\Request\Request
  • phm\LibraryName\Http\Request\CURLRequest

Ich hoffe, das heute wieder eine rege Diskussion aufkommt, so dass ich dann mal eine finale Version des phm-0 rausbringen kann, an die ich mich dann auch halten will. CodeSniffer und Co. sollte man dort dann auch drauf ansetzen können. Das ist eben der Vorteil von Standards, dass man von den Tools der anderen profitieren kann.

Über den Autor

Nils Langner

Nils Langner ist der Gründer von "the web hates me" und auch der Hauptautor. Im wahren Leben leitet er das Qualitätsmanagementteam im Gruner+Jahr-Digitalbereich und ist somit für Seiten wie stern.de, eltern.de und gala.de aus Qualitätssicht verantwortlich. Nils schreibt seit den Anfängen von phphatesme, welches er ebenfalls gegründet hat, nicht nur für diverse Blogs, sondern auch für Fachmagazine, wie das PHP Magazin, die t3n, die c't oder die iX. Nebenbei ist er noch ein gern gesehener Sprecher auf Konferenzen. Herr Langner schreibt die Texte über sich gerne in der dritten Form.
Kommentare

5 Comments

  1. Was spricht denn gegen phm\LibraryName\Http\Request\CURLRequest?
    Dann hast du die auch gleich in ’nem eigenen Package.
    Ich würde evtl. das ganze noch CurlRequest nennen, denke ich.

    Reply
  2. Du meinst:

    phm\LibraryName\Http\Request\Request
    phm\LibraryName\Http\Request\CURLRequest

    oder?

    Wobei ich zwischen dieser Variante und der ohne extra Namespace „Request“ schwanken würde aber du schreibst ja eingangs von phm\LibraryName\Http\Request als Namespace.

    Wie man sieht bin ich auch pro Doppelung, da der Klassenname selbst IMHO nicht nur ein verstümmeltes Ende sein sollte sondern aussagekräftig bleiben sollte. Benutzen würde ich die Klasse CurlRequest ohnehin mit explizitem use-Statement, hätte also keine Doppelung mehr:

    use phm\LibraryName\Http\Request\CurlRequest;
    $request = new CurlRequest();

    Reply
  3. Hallo Nils,

    wird in deinem Beispiel nicht zu stark zwischen Anfrage, Protokoll (HTTP) und Transport (cURL, Socket, …) gemischt?

    Unabhängig von der für die Netzwerkkommunikation verwendeten Bibliothek (hier cURL) ist doch die „Formulierung“ der HTTP-Anfrage und die Auswertung der Antwort (Trennung von Header und Footer, uncompress, chunked, …) identisch, so dass man diesen Teil unter phm\LibraryName\Network\Protocol\Http ablegen könnte, während die cURL-Implementierung dann unterhalb von phm\LibraryName\Network\Transport abzulegen wäre.

    Reply
  4. @Kai: Ja deswegen meinte ich auch im letzten Artikel, dass wir mal davon ausgehen, dass das einfach richtig ist, wie wir es aufbauen (auch wenn ich wusste, dass es nicht der tatsächlichem Implementierung entsprechen wird). Zend Framework hat dafür die Adapter eingebaut. Einen für cURL, einen für Socket, …

    Reply

Leave a Comment.

Link erfolgreich vorgeschlagen.

Vielen Dank, dass du einen Link vorgeschlagen hast. Wir werden ihn sobald wie möglich prüfen. Schließen