2010-12-17 10 views
0

Ich lerne OOP und ich fand, dass es eine schlechte Programmiergewohnheit der Erstellung Wrapper-Klassen für Informationen auf der einen Seite und Klassen mit Methoden, die die erste auf der anderen behandeln, aber ich verstehe dieses Konzept nicht, so dass ich ' Ich bitte um eine Erklärung und ein Beispiel, wenn möglich.Erklärung dieser "schlechten Programmiergewohnheit"?

Vielen Dank im Voraus

+6

Willkommen bei SO. Sie sollten einige spezifische Beispiele zeigen, es ist unmöglich, dies ohne Kontext zu beantworten. –

+1

Rauchen ist in der Regel eine schlechte Programmierer Gewohnheit, aber was weiß ich, ich bin auf PHP .... – Anycorn

+1

vielleicht der Vorschlag hier ist, dass diese eine Klasse sein sollte - dass die Klasse, die auf die Informationen wirkt, sollte es auch speichern. Wenn Sie kein Beispiel angeben können, können Sie zumindest einen Link zu der Stelle finden, an der Sie diesen Rat gefunden haben. –

Antwort

1

Was Sie beschreiben, ist ein „dumb-Modell“, und es ist ein ziemlich kleines Problem. Halten Sie Ausschau nach Code, der jedes Feld in Ihren Informationsklassen erfasst, oder fangen Sie an, in seine Datenstrukturen zu gelangen, um sie zu ändern oder zu lesen - insbesondere, wenn Sie ähnliche Operationen in mehreren Teilen der Anwendung ausführen. Versuchen Sie, diese Arbeit in Methoden für die Informationsklassen zu verschieben, wenn Sie einige von denen fangen.

Eine gute Möglichkeit, die zweite Art von Problem zu verfolgen, ist die Ein-Punkt-Regel - wenn Sie Methoden einer Klasse in einer anderen Klasse aufrufen, sollte die erste Klasse wahrscheinlich die Operation in einer Methode behandeln.

+0

Ich mag den Namen "dummes Modell", hatte es vorher nicht gehört –

2

Ich denke, Sie scheinen in Situationen zu kommen, in denen die Methoden innerhalb der Informationsklasse besser wären - dass die beiden zusammengeführt werden sollten und die Klasse, die auf die Informationen einwirkt, diese auch speichern sollte.

class CoordinatePair 
{ 
     float x, y; 

     public Coordinate(float xIn, float yIn) {x = xIn; y = yIn;} 

     public getX() {return x;} 
     public getY() {return y;} 
} 

class CoordinateTools 
{ 
     public CoordinatePair add(Coordinate a, Coordinate b) 
     { 
     return new CoordinatePair(a.getX() + b.getX(), a.getY() + b.getY()); 
     } 

     public float dotProduct(Coordinate a, Coordinate b) 
     { 
     returna a.getX() * b.getX() + a.getY() * b.getY()); 
     } 
} 

könnte besser sein getan mit: (oder alternativ überladene Operatoren, zumindest eine statische Werkzeuge Klasse)

class CoordinatePair 
{ 
     float x, y; 

     public Coordinate(float xIn, float yIn) {x = xIn; y = yIn;} 

     public getX() {return x;} 
     public getY() {return y;} 

     public CoordinatePair sumWith(CoordinatePair other) {//body} 

     public float dotProductWith(CoordinatePair otheR) {//body} 

} 

Dieses Beispiel Art trivial ist, aber man konnte hoffentlich sehen es immer schlimmer mit kompliziertere Sachen.

1

Ich würde sagen: es kommt darauf an.

Es gibt Situationen, in denen die Trennung von Daten vom Verhalten die beste Lösung ist, z. B. in data transfer objects oder in domain entities. Diese Trennung ist auch nützlich beim Entwerfen von Algorithmen - werfen Sie einen Blick auf visitor pattern oder wie STL algoritms entworfen sind.

Im Allgemeinen ist Single responsibility principle hier wichtig. Wenn Ihr Objekt versucht, viele verschiedene, logisch unabhängige Operationen auszuführen, kann die Trennung dieser Operationen von den Daten eine gute Lösung sein.