39 Stimmen

Zu vermeidende Klassen (Code vollständig)

Ich bin etwas verwirrt über einen Absatz in dem Buch "Code Complete".

Im Abschnitt "Zu vermeidende Klassen" heißt es:

"Vermeiden Sie Klassen, die nach Verben benannt sind. Eine Klasse, die nur Verhalten, aber keine Daten hat, ist im Allgemeinen keine richtige Klasse. Erwägen Sie, eine Klasse wie DatabaseInitialization() oder StringBuilder() in eine Routine für eine andere Klasse zu verwandeln.

Mein Code besteht hauptsächlich aus Verbklassen ohne Daten. Es gibt Rechnungsleser, Preiskalkulatoren, Nachrichtenersteller usw. Ich mache das, um die Klassen auf jeweils eine Aufgabe zu konzentrieren. Dann füge ich Abhängigkeiten zu anderen Klassen für andere Funktionen hinzu.

Wenn ich den Absatz richtig verstehe, sollte ich folgenden Code verwenden

class Webservice : IInvoiceReader, IArticleReader {
    public IList<Invoice> GetInvoices();
    public IList<Article> GetArticles();
}

statt

class InvoiceReader : IInvoiceReader {
    public InvoiceReader(IDataProvider dataProvider);
    public IList<Invoice> GetInvoices();
}

class ArticleReader : IArticleReader {
    public ArticleReader(IDataProvider dataProvider);
    public IList<Article> GetArticles();
}

Modifier Vielen Dank für die vielen Antworten.

Meine Schlussfolgerung ist, dass mein derzeitiger Code eher SRP als OO ist, aber auch unter dem "anämischen Domänenmodell" leidet.

Ich bin sicher, dass mir diese Erkenntnisse in Zukunft helfen werden.

0voto

Ewan Todd Punkte 7269

Konzentrieren Sie sich weniger auf den Namen. Die Regel über den Namen ist nur ein Anhaltspunkt für eine schlechte Praxis. Der wichtige Punkt ist dieser:

Eine Klasse, die nur Verhalten, aber keine Daten hat, ist im Allgemeinen keine richtige Klasse.

In Ihrem Fall sieht es so aus, als hätten Ihre Klassen sowohl Daten als auch Verhalten, und sie könnten genauso gut "Rechnung" und "Artikel" heißen.

0voto

iandisme Punkte 6277

Das kommt darauf an. Viele Klassen sind nach Lese- und Schreibverben benannt, weil die Klassen auch eine Verbindung zu der Datenquelle, in die sie lesen oder aus der sie schreiben, erstellen, pflegen und darstellen. Wenn Ihre Klassen dies tun, ist es wahrscheinlich am besten, sie getrennt zu halten.

Wenn die Reader-Objekte nur Parsing-Logik enthalten, ist es sinnvoll, die Klassen in Utility-Methoden umzuwandeln. Ich würde allerdings einen beschreibenderen Namen als Webservice wählen.

0voto

Ariel Punkte 5452

Ich glaube, das Buch schlägt einen Entwurf wie den folgenden vor:

class Article : IIArticleReader
{
    // Article data...

    public IList<Article> GetArticles(); 
}

0voto

Daniel Roseman Punkte 565786

Hier ist ein klassisches Beispiel für die Gegenüberstellung von Verb und Substantiv in OO:

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X