Dies wurde von etwas, das ich auf der DDD Yahoo! Gruppe.
Wenn alles gleich ist, schreiben Sie phone.dial (phoneNumber) oder phoneNumber.dialOn (phone)? Beachten Sie mögliche zukünftige Anforderungen (Kontonummern neben Telefonnummern, Taschenrechner neben Telefonen).
Die Wahl tendiert dazu zu veranschaulichen, wie die Idiome von Information Expert, Prinzip der einfachen Verantwortung und Tell Do not Ask im Widerspruch zueinander stehen.
phoneNumber.dialOn (Telefon) bevorzugt Information Expert und Tell Do not Ask, während phone.dial (phoneNumber) das Prinzip der einfachen Verantwortung bevorzugt.
Wenn Sie sich mit Ken Pughs Arbeit im Prefactoring auskennen, ist dies das Spreadsheet Conundrum ; fügen Sie Zeilen oder Spalten hinzu?
Wenn Sie auswählen, ob die Spaltenobjekte oder die Zeilenobjekte die Wählmethode erhalten sollen, ändert sich nicht die Skalierung des Programms.
Die Dial-Methode wird nur eine Sequenz von Zeilen- und Spaltenmethoden sein. Sie müssen fragen, wovon diese Methoden abhängen.
Wenn die Reihenfolge der Zeilenmethoden nicht davon abhängt, welches Spaltenobjekt beteiligt ist (hängt jedoch davon ab, welches bestimmte Zeilenobjekt betroffen ist) und umgekehrt für die Reihenfolge der Spaltenmethoden, dann skaliert das Problem als m + n (m = Anzahl Zeilen, n = Anzahl Spalten). Wenn Sie eine neue Zeile erstellen, werden Sie keine Arbeit speichern, wenn der Spaltenmethode die Methode 'Wählen' zugewiesen wurde. Sie müssen immer noch eine eindeutige Sequenz von Zeilenmethoden angeben, die Sie irgendwo verwenden können!
Wenn jedoch die Reihenfolge der Spaltenmethoden in 'dial' nicht einmal davon abhängt, welches Spalten Objekt beteiligt ist (sie verwenden eine 'generische' Sequenz von Spaltenmethoden), dann wird die Problem skaliert gerade wie m. Es spielt keine Rolle, ob Sie den Spaltenobjekten die 'Dial'-Methode zugewiesen haben, das Programm skaliert immer noch als m; Im Wesentlichen ist keine Arbeit erforderlich, um eine neue Wählmethode zu erstellen, wenn ein weiteres Spaltenobjekt hinzugefügt wird, und Sie haben natürlich die Option, alle diese Wählmethoden selbst in eine generische Wählmethode zu abstrahieren.
phone.dial()
, weil das Telefon das Wählen durchführt.
Actor.Verb (Eingaben) - & gt; Ausgänge.
Meh - User.Dial (Nummer). Das Telefon ist im gegebenen Kontext bedeutungslos. SOL (sprechen Sie laut) ist eine gute Möglichkeit, dies durchzuspielen (abgesehen von Idiomen und Prinzipien):
Telefone haben ein Zifferblatt. Sie können sich nicht selbst wählen. Telefonnummern sind Ziffern. Benutzer wählen PhoneNumbers auf einem Telefonwählgerät.
Die Frage nimmt den Kontext der Antwort an und schafft so ein falsches Dilemma
Das "Kalkulationstabellen-Rätsel" ist in diesem Beispiel eine falsche Dichotomie: Zeilen und Spalten sind die Präsentationsschicht, nicht unbedingt die Datenschicht. Die folgenden Kommentare sagen mir, dass ich die Analogie falsch verstanden habe, aber ich denke nicht - "wenn das eine Zeile oder eine Spalte ist, die man eher ändern wird", erzwingt eine unnötige Wahl des Problemraums - sie sind beides gleichermaßen wahrscheinlich zu ändern. Und in diesem speziellen Beispiel führt dies dazu, dass das falsche [ja falsche ] Paradigma für die Lösung gewählt wird. Bei einem Telefon wählen alte mechanische Geräte eine Verbindung zu einem anderen alten mechanischen Gerät; das ist kaum eine passende Analogie für moderne Telefonie. Und unter der Annahme, dass es einen "Benutzer" gibt, der den Anruf einleitet, wird das Problem einfach verschoben - obwohl es in die richtige Richtung bewegt wird, d. H. Weg von dem Telefonmodell des Wählgeräts; -)
Wenn man sich anschaut, wie das TAPI-Protokoll funktioniert, gibt es einen Call-Controller, der in gewisser Weise dem "Benutzer" entspricht, der die Verbindungen zwischen den Geräten verwaltet . Ein Gerät ruft keinen anderen an, der Call Controller verbindet Geräte. Das folgende Beispiel ist also immer noch im Wesentlichen korrekt. Es ist möglicherweise korrekter, ein CallController-Objekt anstelle einer generischen Verbindung zu verwenden, aber die Analogie sollte klar genug sein.
In diesem Beispiel ist ein Telefon ein Gerät mit einer Adresse, die als "Telefonnummer" bezeichnet wird. Der "Dial" -Operator stellt eine Verbindung zwischen den beiden Geräten her. Die Antwort lautet also:
%Vor%Dies wird auch Mehrparteienanrufe unterstützen, indem Sie Connection überlasten, um eine Liste von Geräten oder anderen Verbindungen einzubeziehen, z. B.
%Vor%Sehen Sie sich das TAPI-Protokoll für weitere Beispiele an
Wenn Sie OO schreiben, dann beginnen Sie mit dem Basisobjekt, das nicht die Nummer ist, die Nummer geht IN das Telefon, also phone.dial () so können Sie auch telefonieren.answer () phone.disconnect () phone.powerOFF, ect.
Eine andere Möglichkeit, es anzuschauen, ist, ob das Telefon die Nummer wählt oder wählt die Nummer das Telefon?
Weder. Der Benutzer wählt eine Telefonnummer auf einem Telefon.
Die PhoneUserInterface-Schnittstelle, über die Sie eine Implementierung der PhoneUserFactory.CreatePhoneUser () -Methode erhalten können, verfügt über eine Methodenwahl (Telefon, Nummer), mit der Sie das Telefon anrufen können.
EDIT: Beantworten des Kommentars. Weder. Das Telefon sollte eine Taste drücken () oder so ähnlich. Der Benutzer gibt die Ziffern / Zeichen der Telefonnummer über diese Schnittstelle ein.
A: phone.dial (Telefonnummer)
Die PhoneNumber ist dumm und ist nur ein Datensatz. Wenn das "Wählen" passiert, sollte das PhoneNumber-Objekt wissen, wie man wählt? Es gibt viele Zustände, die man im Auge behalten sollte, wie:
Wenn Ihr PhoneNumber-Objekt dies alles wissen muss, ist es nicht DRY und Ihr Code wird weniger tragbar und eher zu brechen.
Ich würde sagen, dass Steven A. Lowe es niedergeschlagen hat. Dies sollte durch ein Objekt vom Typ Controller geschehen, um die verschiedenen Zustände usw. zu handhaben. Halten Sie Ihr PhoneNumber-Objekt dumm und geben Sie die Smarts an den Mittelmann, der sich darum sorgen muss, dass das Telefon weiter summt.
Nicht der negative hier zu sein, aber diese Art von Fragen sind sehr akademisch. Es hängt vollständig von der Anwendung ab. Ich kann mir sehr gute Gründe dafür vorstellen, wie ich das machen könnte, und ich habe zu viele gute Programmierer gesehen, die sich in diese Art von Konstruktionsdetails verwickelt haben.
Ich bin mir nicht sicher, wie sich das auf das Tabellenkalkül bezieht. Erwarten Sie in Zukunft, dass Sie sich über das Telefon mit den Kontonummern verbinden? Um Telefonnummern auf Taschenrechnern zu verwenden? Ihr Beispiel für "Zukunftsvorsorge" ist nicht sehr gut ...
Außerdem verwenden Sie das Verb "dial". Sicher, ich könnte mir vorstellen, eine Kontonummer auf einem Telefon zu wählen. (Es ist eine große Strecke, obwohl.) Aber wenn diese Telefonnummer auf einem Taschenrechner verwendet werden soll, würden Sie die Aktion "Wählen" nennen? Wenn sich der Name der Funktion in Abhängigkeit vom Typ des Parameters ändert, der übergeben wird, liegt ein Konstruktionsfehler vor.
Bei einem typischen OO-Design werden Objekte Nachrichten mit Daten gesendet, nicht umgekehrt.
phone.dial () +1.
Was ist der Variantenstatus oder das Verhalten einer PhoneNumber? Das einzige, was mir in den Sinn kommt, sind "Wählregeln" (wählen Sie die Landesvorwahl, wenn Sie draußen sind, wählen Sie "9", um die Amtsleitung zu erreichen, usw.). Dieser Kontext scheint gut zum Telefon zu passen.
Wenn Ihr Objektmodell keine Abweichung erfordert - eine Zahl ist nur eine Folge von Ziffern, "Wahl" ist nur foreach (Ziffer in Telefonnummer) {drücken (Ziffer); } Ich bin mit Rob Conery: meh.
Tags und Links oop