Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Pluralization of english nouns [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Pluralization of english nouns


 
unset
19-11-2009, 01:23 
 
Hallo Zusammen,

ein kleines Problemchen bzw. ein Code Smell, der mich schon länger in meiner ZF-Mutation nervt.

Und zwar: Aus Tabellennamen erstelle ich dynamisch Module und Items, die wiederum mit generischen Controllern und Actions dargestellt werden. Zum Beispiel aus der Tabelle shop_products wird das Modul Shop, dass einen Product-Controller hat, der generalisiert list-, view-, edit-, add-, delete- und eine ganze Reihe mehr Actions enthält. Weder das Modul noch den Controller muss ich physisch erstellen. Man beachte nun, dass der Tabellenname "products" beinhaltet (also Plural) während der Controller (und ach später in der URL-Route) Product heißt. Das halte ich für sinnig, denn im Controller fackel ich (in den allermeisten Fällen) nur Aktionen auf einen Datensatz ab.

Wie dem auch sei. Wir wissen, dass es leider nicht immer reicht ein S an den Singular eines Nomens zu hängen um ein Plural draus zu machen. Bisher hab ich das ignoriert, was dazu führt, dass ich Tabellennamen wie "news_entrys" oder "bladiblubb_childs" habe. Beides falsch. Im ersten Fall kann man noch sagen, dass man halt auf ein y am Ende prüfen könnte. Aber child und children ist unregelmäßig, und das ist nur das, was mir als erstes eingefallen ist. Spontan kommen mir da noch eine ganze Menge mehr in den Sinn, zum Beispiel alles, was sowohl im Plural als auch im Singular gleich ist: Glasses, Trousers, Jeans.

Wie gesagt, das nervt mich an und ich würde das gerne beheben. Leider kommt mir keine Vernünftige und vor allem Robuste Methode in den Sinn, wie man das anstellen könnte. Meine beste Idee (und bisher auch der beste Ansatz den ich dazu im Netz finden konnte) war dieses Stückchen Python: Smart pluralisation (English) ActiveState Code (http://code.activestate.com/recipes/82102/)

Aber irgendwie ist das IMHO immer noch nicht das gelbe vom Ei! Also richte ich mich eines der wenigen Male fragend an die Community! Mal sehen was euer Hirnschmalz so hergibt ;)

Cheers,

Cem

 
AmicaNoctis
19-11-2009, 01:35 
 
Hallo,

ich hab das in den Fällen, wo ich damit konfrontiert war, so gelöst, dass ich die Pluralisierung durch Zusammensetzung mit einem der folgenden Worte gebildet hab:


...Array
...List
...Elements
...Items
...Set
...Collection


Das ist zwar nicht so elegant wie ein natürlicher (und korrekter) Plural, aber genau so sinnvoll und verständlich.

Gruß,

Amica

 
unset
19-11-2009, 01:39 
 
Den Umweg bin ich auch gegangen, wenn irgendwas nach außen hin Sichtbar war. Aber um ehrlich zu sein, will ich mir in Zukunft aber eigentlich keine Gedanken mehr darum machen, ob ich ein Nomen habe, dass das System "pluralisieren" kann.

 
wahsaga
19-11-2009, 01:47 
 
Wikipedia: English plural (http://en.wikipedia.org/wiki/English_plural) wäre meine erste Anlaufstelle.
Das gibt schon einiges an „Regeln” her, an die man sich halten kann.
Darum, die Sonderfälle in Form von Listen vorzuhalten, die zuerst abgeprüft werden, führt wohl kaum ein Weg vorbei.


Ob sich der Aufwand lohnt, wäre eine andere Frage.
Sowohl vom algorithmischen her als auch von der Rechenzeit, die dafür draufgeht, wenn du das jedes Mal dynamisch und on-the-fly machst, scheint mir eine in der Applikation hinterlegte Liste, in der Singular und Plural abgelegt werden, vielleicht doch der bessere Weg. Klar, die will beim Anlegen einer neuen Tabelle jedes mal ergänzt werden ... aber diesen vertretbar geringen Aufwand durch x Zeilen an Code zu ersetzen, scheint mir die Materialkosten der Kanonenkugel nicht wert, wenn ich den Spatz auch einfach erschlagen kann ...

 
h3ll
19-11-2009, 01:54 
 
Warum die Tabellen nicht einfach mit der Einzahl benennen? Dass eine Tabelle normalerweise mehr als einen Eintrag enthält, sollte wohl selbstverständlich sein und bedarf keiner Hervorhebung mittels Mehrzahl. IMHO.

 
unset
19-11-2009, 14:26 
 
Weiß ich ehrlich gesagt auch nicht mehr –*aber ich befürchte, da habe ich mir am Anfang was bei gedacht ;)

Am Ende werde ich es wahrscheinlich tatsächlich mit allen gefundenen Regeln, eine Sonderfallliste und einem Cache lösen.

 
onemorenerd
19-11-2009, 14:42 
 
Du brauchst die Bezeichner überall im Singular, aber der Tabellenname, den kaum jemand zu Gesicht bekommt, soll unbedingt im Plural sein? Wozu?

Wenn für diese Kleinigkeit ein Haufen Code und Lookup-Tabellen existieren, stinkt das noch viel mehr als der Singular in der DB.

 
unset
19-11-2009, 14:52 
 
Ne, das war schon ein bisschen anders, gestern hab ich das aus dem Kopf niedergeschrieben, ohne das Dingen vor mir gesehen zu haben –*da hab ich mich ein bisschen vertan. Konkret sieht es so aus, dass der Controller und die Tabellen im Plural, die Modelle (auch die virtuellen) in der Einzahl hinterlegt sind. Das begründet sich daraus, dass auch sonst alles stets im Singular benannt wird –*und das soll auch bitteschön weiter so bleiben (und ja, mir ist klar das Controller hier ein Sonderfall sind). Prinzipiell geht es ja hier auch nicht um das Design sondern um ein konkretes Problem –*das Design hab ich ja nur des leichteren Verstehens halber kurz angerissen.

 
onemorenerd
19-11-2009, 15:02 
 
Was spricht gegen "nur Singular"? Aus Tabelle show_product wird Modul Show und Controller Product oder ShowModule und ProductController ...

 
unset
19-11-2009, 15:08 
 
Spontan fällt mir nicht mehr ein, was ich mir dabei gedacht habe …*abgesehen davon, dass das Design nach wie vor nicht das Thema ist ;)

 
onemorenerd
19-11-2009, 15:58 
 
Wie so oft wäre das Thema erledigt, das eigentliche Problem würde nicht mehr existieren, wenn du alles im Singular machst. Deshalb finde ich es legitim, so vom Thema abzuweichen.

Im Prinzip ist es vergleichbar mit dem Problem "wo kann meine Applikation temporäre Dateien ablegen". Korrekterweise im tmp-Dir. Aber wo ist das und hat sie Schreibzugriff? Muss sie die Dateien selbst wieder löschen oder macht das das OS?
Statt viel Code zu schreiben, kann man auch einfach bei der Installation ein eigenes tmp/ als Unterverzeichnis der Applikation anlegen. Alles was die App da reinschreibt, muss sie auch selbst wieder löschen. Kein if, kein switch, keine Abhängigkeiten vom OS oder sonstwas. Weniger Code, selber Effekt.

Einziges Manko: Wenn der User sein tmp-Dir leert, gewinnt er nicht das Maximum an Plattenplatz.
Manko bei dir: Wenn mal ein Entwickler in die DB schaut, erkennt er nicht, dass show_product eine 1:N Verknüpfung ist, sondern hält es evtl. für 1:1. Aber passiert das wirklich? Und wenn schon, ist es ein Problem? Kann man das notfalls nicht auch mit einem Tabellenkommentar erschlagen?

 
PHP-Desaster
19-11-2009, 18:14 
 
Hier gibt es ein Stückchen Code zum Pluralisieren (http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/) unter der MIT-Lizenz. Nutze diesen auch in einem internen Generator-Projekt und habe bisher keine Probleme feststellen können.

Edit als Argument gegen Tabellennamen in Singular: Eine Tabelle enthält mehrere Datensätze, stellt also definitiv einen Plural dar.

 
h3ll
19-11-2009, 18:50 
 
Edit als Argument gegen Tabellennamen in Singular: Eine Tabelle enthält mehrere Datensätze, stellt also definitiv einen Plural dar.

Kann man so oder so argumentieren. Man kann auch sagen dass es eine Tabelle vom Typ Person ist.

Ich persönlich find es einfach einfacher, als wenn man ständig irgendwo zwischen Einzahl und Mehrzahl herummappen muss. Modell "person" == Tabelle "person". Ist doch viel einfacher.

Du sagst ja auch nicht Äpfelkuchen, nur weil mehr als ein Apfel drin ist, oder? :)

 
unset
19-11-2009, 18:58 
 
Du sagst ja auch nicht Äpfelkuchen, nur weil mehr als ein Apfel drin ist, oder? :)
Aber man sagt Wörterbuch ;-)

 
h3ll
19-11-2009, 19:04 
 
Aber warum sich das Leben unnötig schwer machen? Wie die Datenbanktabelle heißt sieht nur der Programmierer, und dem kanns ja ziemlich egal sein ob ein s dahinter steht oder nicht. Der Endbenutzer bekommt das eh niemals zu Gesicht.

 
PHP-Desaster
19-11-2009, 19:17 
 
Schwer machen ist ja eh egal, oben ist eine Klasse verlinkt. Diese einzubinden ist ein Kinderspiel. Weiter wird der Code generiert, d.h. Singular oder Plural macht performancetechnisch keinerlei Unterschied.

 
h3ll
19-11-2009, 19:20 
 
Schwer machen ist ja eh egal, oben ist eine Klasse verlinkt. Diese einzubinden ist ein Kinderspiel. Weiter wird der Code generiert, d.h. Singular oder Plural macht performancetechnisch keinerlei Unterschied.

Ich finds einfach nur sinnlos. Man benennt die Tabellen in der Mehrzahl, nur damit man sie danach wieder mit Regular Expressions rausfiltern kann?? So kann man natürlich auch Leistung und Code-Zeilen verschwenden, auch wenns minimal ist.

Aber man sollte auch bedenken, dass es eine zusätzliche Fehlerquelle ist. Und für was? Damit die Tabellennamen "hübscher" sind?

Ich seh da einfach keinen praktischen Vorteil, sondern nur Nachteile.

 
onemorenerd
19-11-2009, 19:23 
 
Ich würde mich da gar nicht vom Sprachgebrauch leiten lassen, weder vom deutschen noch vom englischen. Dass das Mapping von Singular auf Plural und umgekehrt nicht trivial ist (in keiner mir bekannten Sprache) ist klar. Es gibt keine 100% korrekte Lösung. Kann es nicht geben, denn Sprachen verändern sich. Es kommen neue Wörter dazu und die können Sonderfälle sein wie das o.g. child/children. Es wäre also notwendig, die Tabelle der Sonderfälle regelmäßig zu aktualisieren, um as close as possible an der perfekten Lösung zu sein. Aber wie soll die Pflege dieser Tabelle denn aussehen? Da afaik solche Listen nicht irgendwo fertig und aktuell zu bekommen sind, muss man selbst die Entwicklung der Sprache beobachten. Und wie entscheidet man, ob ein neues Wort bereits zur Sprache und damit auch in die Liste gehört? Wie stellt man sicher, dass die Liste dem Sprachschatz aller Anwender des Codes voraus ist? Geht gar nicht. Es kann keine 100% korrekte Lösung geben und für as close as possible ist Expertenwissen und regelmäßiger Aufwand nötig. Das wäre es mir nicht wert und ich würde es kategorisch ablehnen, weil es das Projekt unnötig komplexer macht und Abhängigkeiten erzeugt, die die Sache nicht wert sind.

Das Argument "Eine Tabelle enthält mehrere Datensätze, stellt also definitiv einen Plural dar" basiert auf der Ansicht, dass der Tabellenname bezeichnen muss, wie viele Datensätze die Tabelle enthalten kann. Es wurde bereits erwähnt, dass jede Tabelle immer mehrere Datensätze enthalten kann. Die Anzahl möglicher Datensätze muss also gar nicht im Tabellennamen ausgedrückt werden - es gibt nur eine Möglichkeit. Wenn der Name etwas ausdrücken soll, dann die Kardinalität bei Verknüpfungstabellen. Wenn! Er muss es nicht. Das kann man auch wo anders notieren, so dass ein Generator damit arbeiten kann; beispielsweise als Kommentar (INFORMATION_SCHEMA.TABLES.TABLE_COMMENT).

Statt viel Arbeit, mehr Komplexität und Abhängigkeiten für eine niemals perfekte Lösung, plädiere ich eindeutig für eine ganz einfache Lösung, die nur dahingehend nicht perfekt ist, dass man eine bestimmte Ansicht über die Aussagekraft von Tabellennamen haben muss, um es als korrekt aufzufassen.

 
unset
19-11-2009, 20:46 
 
Prinzipiell stimme ich dem pragmatischen Ansatz zu, alles im Singular zu halten. Praktisch wirft das, jedenfalls bei mir, ein paar Probleme auf. Die Item-Controller sollten weiterhin im Plural verfasst sein. Warum? Es sieht schöner aus! Bringt das was? Genau so viel wie eine sprechende Adresse eben bringt.

Trotzdem bin ich mehr und mehr vom "alles Einzahl" überzeugt.

 
h3ll
19-11-2009, 20:51 
 
Prinzipiell stimme ich dem pragmatischen Ansatz zu, alles im Singular zu halten. Praktisch wirft das, jedenfalls bei mir, ein paar Probleme auf. Die Item-Controller sollten weiterhin im Plural verfasst sein. Warum? Es sieht schöner aus! Bringt das was? Genau so viel wie eine sprechende Adresse eben bringt.

Trotzdem bin ich mehr und mehr vom "alles Einzahl" überzeugt.

Die Adresse kannst du ja als Route festlegen. Wie bereits gesagt, es reicht wenn es für den Endbenutzer schön ausschaut. Warum willst du deine Programmstruktur an die Regeln der Ausgabe und Adressierung richten? Die haben damit ja nicht wirklich was zu tun.

Was ist wenn irgendwann die Anforderung kommt, dass die Adressierung nicht in der Mehrzahl sondern in der Einzahl erfolgen soll? Oder wenn die Items plötzlich nicht mehr Items sondern Articles heißen sollen? Schreibst du dann deine Controller, Models, Datenbanktabellen und alles was darauf verweist um? Und was ist bei Mischfällen?

 
unset
19-11-2009, 21:03 
 
Die Adresse kannst du ja als Route festlegen. Wie bereits gesagt, es reicht wenn es für den Endbenutzer schön ausschaut. Warum willst du deine Programmstruktur an die Regeln der Ausgabe und Adressierung richten? Die haben damit ja nicht wirklich was zu tun.
Das sich das alles dynamisch zusammenbaut eben schon. Es gibt physisch keinen "Items"-Controller, lediglich eine Tabelle namens "items" (das ist jetzt etwas vereinfacht). D.h. ich muss zumindest beim erstellen oder auswerten der Route in irgend eine Richtung Plurali- oder Singularisieren - denn die sind eben auch dynamisch.

Was ist wenn irgendwann die Anforderung kommt, dass die Adressierung nicht in der Mehrzahl sondern in der Einzahl erfolgen soll? Oder wenn die Items plötzlich nicht mehr Items sondern Articles heißen soll? Schreibst du dann deine Controller und alles was darauf verweist um? Und was ist bei Mischfällen?
WENN diese Anforderung kommt, kann ich es immer noch über von Hand geschriebene Routen lösen ... das wäre aber in der Tat ein Sonderfall, da sich das ganze System ansonsten an den Convetion over Configuration Grundsatz hält.

Wenn ich eine Tabelle umbenenne muss ich nichts anpassen (solange sie derzeit weiterhin in der Mehrzahl vorliegt ;) und abgesehen von den auf diese Tabelle zeigenden FKs), da sich alle Adressen/Routen/Controller/Module halt dynamisch generieren. Zur verdeutlichung: Ich lege eine Tabelle Namens "shop_products" an, woraufhin automatisch ein Modul Namens "Shop" existiert, ein Controller Namens "Products" ein Modell namens "Products" ... dieser Controller hat - wie eingangs schon erwähnt - eine Reihe typischer Actions wie edit, delete, add, move, view, list, etc. All das rein virtuell über eine Methode die ich einfach mal "showOffAs" getauft habe. D.h. der so erzeugte Controller ist in wirklichkeit eine Instanz von Controller_Action_Generic, wird er gefragt, von welcher Klasse er eine Istanz ist, behauptet er allerdings Module_Shop_Controller_Products (nur falls gefragt wird: gefragt wird sowas im ganzen System über eine in einem allgemein gültigen Interface definierte Methode).

 
wahsaga
19-11-2009, 21:04 
 
Oder wenn der Kunde einen deutschsprachigen Shop betreiben will, und lieber Produkt statt Product im URL sehen möchte ...

 
unset
19-11-2009, 21:06 
 
Oder wenn der Kunde einen deutschsprachigen Shop betreiben will, und lieber Produkt statt Product im URL sehen möchte ...

Das hab ich hierüber abgefackelt: Zend Framework: Documentation (http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.standard.translated-segments) ... und wo ich mir das grade nochmal anschaue ... das könnte ich am Ende auch für das Plural/Singular-Problem nehmen.

 
h3ll
19-11-2009, 21:18 
 
Das sich das alles dynamisch zusammenbaut eben schon. Es gibt physisch keinen "Items"-Controller, lediglich eine Tabelle namens "items" (das ist jetzt etwas vereinfacht). D.h. ich muss zumindest beim erstellen oder auswerten der Route in irgend eine Richtung Plurali- oder Singularisieren - denn die sind eben auch dynamisch.


WENN diese Anforderung kommt, kann ich es immer noch über von Hand geschriebene Routen lösen ... das wäre aber in der Tat ein Sonderfall, da sich das ganze System ansonsten an den Convetion over Configuration Grundsatz hält.

Wenn ich eine Tabelle umbenenne muss ich nichts anpassen (solange sie derzeit weiterhin in der Mehrzahl vorliegt ;) und abgesehen von den auf diese Tabelle zeigenden FKs), da sich alle Adressen/Routen/Controller/Module halt dynamisch generieren. Zur verdeutlichung: Ich lege eine Tabelle Namens "shop_products" an, woraufhin automatisch ein Modul Namens "Shop" existiert, ein Controller Namens "Products" ein Modell namens "Products" ... dieser Controller hat - wie eingangs schon erwähnt - eine Reihe typischer Actions wie edit, delete, add, move, view, list, etc. All das rein virtuell über eine Methode die ich einfach mal "showOffAs" getauft habe. D.h. der so erzeugte Controller ist in wirklichkeit eine Instanz von Controller_Action_Generic, wird er gefragt, von welcher Klasse er eine Istanz ist, behauptet er allerdings Module_Shop_Controller_Products (nur falls gefragt wird: gefragt wird sowas im ganzen System über eine in einem allgemein gültigen Interface definierte Methode).

Also bis jetzt hab ich es überall nur so gesehen, dass die URL in der Einzahl angegeben wird.

http://example.org/shop/product/Gummistiefel
http://example.org/person/edit/2
http://example.org/myprofile/show
http://www.php-resource.de/forum/php-developer-forum/

Warum sollte man diese Begriffe in der Mehrzahl schreiben? Sieht doch komisch aus:

http://example.org/shops/products/Gummistiefel
http://example.org/persons/edit/2
http://example.org/myprofiles/show
http://www.php-resource.de/foren/php-developer-forum/

Und wenn mal wirklich die Ausnahmeanforderung kommt, dass es in der Mehrzahl geschrieben wird, kann man immer noch eine Route festlegen (oder es mit einer anderen Methode lösen).

 
unset
19-11-2009, 21:37 
 
So aus dem Stehgreif hab ich schon ein paar Realwelt-Beispiele, wo das anders ist:

http://es.technorati.com/people/unset
http://twitter.com/unset/favorites
http://games.shop.ebay.de/

Aber wie ich schon sagte, ich stimme dem Singular-Ansatz ja zu ;)

 
onemorenerd
20-11-2009, 09:15 
 
All das rein virtuell über eine Methode die ich einfach mal "showOffAs" getauft habe. D.h. der so erzeugte Controller ist in wirklichkeit eine Instanz von Controller_Action_Generic, wird er gefragt, von welcher Klasse er eine Istanz ist, behauptet er allerdings Module_Shop_Controller_Products (nur falls gefragt wird: gefragt wird sowas im ganzen System über eine in einem allgemein gültigen Interface definierte Methode).
Das hat jetzt zwar nichts mit dem Problem Singular vs. Plural zu tun, aber mich interessiert sehr wie dein Code dazu aussieht. Darf man das mal sehen?
Vor allem beim letzten Satz sprangen mir sofort Type Hinting und Debugging in den Kopf. Type Hinting brauchst du vielleicht für diese Klassen gar nicht bzw. es gibst nur die allen automatisch erzeugten Klassen gemeinsame Basisklasse an. Aber beim Debugging könnte es doch stören, wenn immer Controller_Action_Generic gemeldet wird. Kommt halt darauf an, wieviel Code die virtuellen Klassen gemeinsam haben. Wenn sie alle gleich sind, machts keinen Unterschied. Sind sie das?
Nicht zuletzt interessiert mich auch, wie du die Klassen erzeugst. Vermutlich erstellst du nur Instanzen von Controller_Action_Generic und setzt per Ctor den "virtuellen Typ", den die Methode showOffAs zurückgibt. Die virtuellen Klassen werden also ohne weitere Kosten zur Laufzeit erzeugt. Die zu erzeugenden Typen weißt du aus der URL. Aber du musst doch prüfen, ob es auch die zugehörige Tabelle gibt. Das kostet was.

Ich finde die Bezeichnung virtuelle Klasse übrigens unpassend, denn wenn es so ist wie ich glaube, gibt es nur die Klasse Controller_Action_Generic.

Vielleicht ahnst du es schon: Ich will darauf hinaus, dass es möglicherweise besser wäre, statt virtuellen Klassen echt Ableitungen von Controller_Action_Generic zu erzeugen und als Datei zu speichern.


Falls es irgendwen stört, dass ich hier so vom Thema abweiche, sagt bescheid. Dann trenne ich ab.

 
unset
20-11-2009, 11:05 
 
Zeigen kann ich den Code leider nicht. Noch jedenfalls ... ich arbeite derzeit privat an einer offenen Iteration des Konzeptes. Ich hoffe, ihr habt dafür Verständnis, auch wenn ich konkret zu diesem Closed Source Code eine Frage habe.

Das überprüfen der Tabellen kostet, ja. Aber auch nur genau ein mal beim Deploy auf den Live-Server, da wird die Datenbankstruktur einmal ausgelesen, gepuffert und bis zum nächsten Deploy verwendet. Ohne Deploy keine Veränderung an der Datenstruktur.

"Virtuelle Klasse" ist ind der Tat etwas doof gewählt, eine Ableitung ist es allerdings auch nicht wirklich. Ich wweiß leider nicht, wie man es besser ausdrücken könnte.

Type Hinting nutze ich schon exzessiv, allerdings nur auf die Basis-Klassen (statt konkretem Modell halt auf das generische - es sei denn, es existieren konkrete).

Ansonsten hast du das alels schon richtig impliziert.

Beim Debugging hatte ich derzeit keine Probleme. Da ich im Fehlerfall ja auch die kompletten Traces habe, sehe ich ja auch, als was sich die Klassen ausgeben. Seit dem ich vor kurzem allerdings ebenso dynamische Tests für alle möglichen Konstellationen der generischen Geschichten geschrieben habe, komme ich an der Stelle gar nicht mehr in irgendwelche Bedrängnis. Lediglich konkrete Implementationen mit veränderten oder ergänzten Methoden müssen von Hand geschrieben werden.

Ich würde die Diskussion dahingehend allerdings gerne auf den Zeitpunkt verschieben, an dem ich eine öffentliche Version anbieten kann - denn ich hab selbst bei meinen Kollegen Probleme, an einem Stück zu erklären, wie das ganze Funktioniert - und die können sich den Code angucken ;)

 
onemorenerd
20-11-2009, 11:25 
 
Kein Problem, ich kann warten.


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:00 Uhr.