Was ist der objektorientierte Denkprozess? [geschlossen]


9

Ich habe in den letzten Monaten OOP in Verbindung mit der MVC-Implementierung von Zend studiert. Ich bin im Allgemeinen ziemlich neu in der Programmierung, aber ich bin der festen Überzeugung, dass ich die Dinge auf die „richtige“ Weise lernen sollte, was für mich bedeutet, sicherzustellen, dass ich verstehe, warum die Dinge so gemacht werden, wie sie sind. Das heißt, ich habe festgestellt, dass beim Lernen, wie man etwas macht (irgendetwas, sagen wir Musik), der beste Weg, um zu lernen, wie man etwas macht, darin besteht, zu wissen, warum es überhaupt so gemacht wird.

Wie auch immer, ich hatte große Probleme damit, zu verstehen, wie ich meine eigenen Geschäftsmodelle (dh das M von MVC) entwickeln kann, und ich habe entschieden, dass dies nicht daran liegt, dass ich OOP im Allgemeinen nicht verstehe, sondern daran, dass ich es für mehrere studiert habe Monate und ich denke nicht, dass die Konzepte sehr schwer zu verstehen sind. Ich finde die Beispiele, die ich studiert habe, eigentlich sehr intuitiv. Ich denke, das Problem liegt in der Umsetzung meiner eigenen Probleme in objektorientierte Lösungen. Die Beispiele in Büchern (die ich bisher gelesen habe) sind zu offensichtlich, so dass der Prozess der Übersetzung des Problems in Objekte nicht sehr schwierig ist. Was ich zu vermissen glaube, ist ein abstrahierter Prozess auf hoher Ebene. Eine Liste von Schritten oder Fragen, die jede objektorientierte Lösung auf höchster Ebene beantworten muss.

Wenn Sie einen solchen Prozess in nicht mehr als fünf Schritten beschreiben müssten, welche wären das und warum? Was ist der effektivste Prozess, um ein Problem in eine objektorientierte Lösung umzusetzen?


1
OOP ist nicht immer alles ...
Job

Haben Sie in Ihrem OOP-Studium schon etwas über Designmuster gelesen ?
Zoredache

1
Ich empfehle Ihnen, Eric Evans Buch über Domain Driven Design zu lesen, wenn Sie Schwierigkeiten haben, Modelle zu erstellen. Siehe auch Antwort von @Simon Stellings. Das Buch behandelt diesen Prozess sehr detailliert.
Falcon

@Zoredache Ich bin auf das Konzept von Entwurfsmustern sowie auf einige Beispiele von Singleton, Factory und MVC selbst gestoßen (die in Zends Implementierung auch Front-Controller sind). Dies war jedoch sozusagen mein nächster Schritt. Ich habe Martin Fowlers Buch über Unternehmensmuster aufgegriffen und bisher nur einen Teil der Einführung gelesen. Ist die eine klare, leicht zu lesende Einführung, die Sie empfehlen würden?

@Falcon Ich hatte neulich eine Frage zu PHP / MySQL und zur Datumsformatierung bei SO, und ich hätte Ihre Antwort gewählt, aber es war nur ein Kommentar, was es wert ist.

Antworten:


10

Ein geeignetes Modell zu finden ist nicht immer einfach. Es ist eines dieser Dinge, die mehr Erfahrung erfordern als einfaches Wissen. Das folgende einfache Rezept kann Ihnen jedoch helfen, eine anfängliche mentale Blockade zu überwinden.

Es wurde ursprünglich in diesem Artikel von Abbott beschrieben und wird häufig als "Abbotts Textanalyse" bezeichnet.

  1. Schreiben Sie eine Klartext-Spezifikation.
  2. Klassen identifizieren : Substantive sind gute Kandidaten.
  3. Finden Sie die Attribute: Adjektive / Adverbien sind gute Kandidaten.
  4. Finden Sie die Operationen: Verben sind gute Kandidaten.
  5. Finden Sie die Assoziationen zwischen Klassen.
  6. Verfeinern.

Beispiel:

Substantive , Verben und adjectivessind markiert.

Die Bibliothek enthält Bücher und Zeitschriften . Es kann mehrere Exemplare eines bestimmten Buches enthalten . Einige der Bücher sind nur für short-term Leihgaben bestimmt . Alle anderen Bücher werden können ausgeliehen von jedem Bibliotheksmitglied für drei Wochen. Mitglieder der Bibliothek können normalerweise bis zu sechs Objekte gleichzeitig ausleihen , Mitarbeiter können jedoch bis zu 12 Objekte gleichzeitig ausleihen . Nur Mitarbeiter dürfen Zeitschriften ausleihen .

Eine erste Analyseiteration würde ergeben:

Klassen:

  • Bibliothek
  • Buch, Tagebuch
  • Kopieren
  • Darlehen
  • Bibliotheksmitglied
  • Artikel
  • Mitarbeiter

Von hier an können Sie überlegen, welche Klasse welche Attribute und Methoden benötigt, um das Verhalten zu implementieren, und dieses Modell dann zunehmend verfeinern.


1
Gute Antwort. Zusätzlich zu Abbotts Artikel empfehle ich Eric Evans Buch über Domain Driven Design . Es zeigt, wie man eine allgegenwärtige Sprache für das Projekt erstellt und daraus ein leistungsfähiges Modell destilliert.
Falcon

Ich bin von dieser Antwort angezogen, weil ich ein wenig Linguistik studiert habe und sie für mich ohne großen Aufwand intuitiv sinnvoll ist. Ich habe jedoch aus den gleichen Gründen Angst davor, weil ich festgestellt habe, dass mich zu viel Analogie in die Irre führen kann .

@Falcon +1 für die Empfehlung eines Buches mit Kandinsky-Cover.

@ tbj1982: Du hast absolut recht. Es ist eine einfache Heuristik, und die Ergebnisse sollten in diesem Sinne behandelt werden. Es ist nicht die goldene Kugel, aber es kann ein hilfreicher Starter sein.
Blubb

4

Meiner Meinung nach ist der TDD-Ansatz natürlich und effizient:

  1. Notieren Sie die spezifischen Anforderungen (Gegeben, Wann, Dann).
  2. Übersetzen Sie jede Anforderung (die wichtigste zuerst) in einen Komponententest.
  3. Schreiben Sie die geringste Menge an Code, um den in # 2 geschriebenen Test zu bestehen.
  4. Refaktorieren Sie Ihren Code nach bestandenem Test gemäß den SOLIDD-Entwurfsprinzipien.
  5. Stellen Sie nach # 4 sicher, dass Ihr Code noch alle geschriebenen Tests besteht.
  6. Wiederholen Sie 2-5.

Mit diesem Verfahren können Sie schrittweise testbaren Code mit Sounddesign erstellen. Sie könnten zunächst denken, dass ein Schreibtest nicht erforderlich ist, aber diese Aktivität hilft Ihnen tatsächlich beim Aufbau einer soliden Architektur.


3

Hier sind die Schritte, die ich in C ++ - Code verwende:

  1. Klassennamen bestimmen
  2. Konstruktorparameter und Datenelemente festlegen.
  3. Entscheiden Sie die Namen und Prototypen der Mitgliedsfunktionen
  4. mach es unabhängig von anderen Klassen
  5. Das Design ist fertig und alles andere ist nur die Implementierung.

Der Grund für (1) ist, dass es den Umfang definiert, welche Funktionalität zur Klasse gehört. Der Grund für (2) ist, dass es definiert, wie die Klasse mit der Außenwelt kommuniziert. Der Grund für (3) ist, dass definiert wird, wie ausgewählt werden soll, welche Funktionalität der Klasse in jeder Situation benötigt wird. Der Grund für (4) ist, dass die Klasse in vielen verschiedenen Situationen verwendet werden kann. Der Grund für (5) ist, dass es die Grenze zwischen Design und Implementierung definiert.


+1 für die Benennung. Es ist erstaunlich, wie sehr das Hinzufügen von Namen Denkprozesse organisieren kann, da Sie implizit das gesamte Wissen der "realen Welt" einbringen.
Mark Brackett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.