Was ist der Hauptvorteil von reinen POCO-Modellen? Ich verstehe, dass Modelle sauber und einfach sein sollten, aber ich neige dazu, die Pflege von untergeordneten Objekten in den Modellklassen beizubehalten. Zum Beispiel, wenn ich a ClassA
und ClassB
wie folgt definiert habe:
public class ClassA
{
public string MyProp { get; set; }
public IEnumerable<ClassB> Children { get; }
public void AddChild(ClassB newChild) { /*... */ }
public void RemoveChild(ClassB child) { /* ... */ }
}
public class ClassB
{
public string SomeProp { get; set; }
}
Stimmt etwas mit den Methoden add und remove nicht? Sollte ich stattdessen einfach die Liste verfügbar machen und dem Client-Code erlauben, das hinzuzufügen, was auch immer die Verantwortung für einfache Datenüberprüfungen trägt, z. B. nicht null, und nicht an eine andere Klasse weiterzugeben?
Jede Hilfe wird geschätzt. Danke.
AddChild(ClassB newChild) => Children.Add(newChild ?? new NullClassB())
Antworten:
Ihre beiden Fragen haben nichts miteinander zu tun.
Ein reines POCO ist nicht abhängig von einem unternehmerischen Rahmen, einer Konvention, [] etwas, oder ist eng mit einem Objekt verbunden, das ähnlich abhängig ist. Mit anderen Worten, die Welt kann sich um einen POCO komplett verändern und es macht einfach weiter, was es macht, ohne sich darum zu kümmern. Sie können es nicht brechen, indem Sie ein Framework aktualisieren, in ein neues System verschieben oder es lustig ansehen. Es funktioniert einfach weiter. Die einzigen Abhängigkeiten sind die Dinge, nach denen explizit gefragt wird.
POCO ist nichts anderes als die POJO-Idee. Das J wurde in ein C geändert, weil die Leute dich komisch ansehen, wenn du ein Konzept erklärst, das Java im Namen hat, wenn diese Leute C # verwenden. Die Idee ist nicht abhängig von der Sprache. Sie hätten es einfach Plain Old Objects nennen können. Aber wer möchte damit prahlen, POO einzusetzen?
Ich werde Fowler die Ursprünge erklären lassen:
Wie für Ihre andere Frage:
Ich mag es nicht,
A
direkt darüber Bescheid zu wissenB
. Aber das ist eine DIP- Sache, keine POJO- Sache.quelle
B
Einfachheit halber die direkte Abhängigkeit , Idealerweise würden beide Schnittstellen implementieren. Hat aberA
noch eine Liste vonIInterfaceB
. Stimmt etwas mit derAddChild
Methode nicht, wenn die Kinder lose über Schnittstellenreferenzen gekoppelt sind?Mit Hinzufügen und Entfernen implementieren Sie
Collection<T>
Funktionen. Fragen Sie sich, warum SieIEnumerable<T>
anstelle vonList<T>
oder einer anderen veränderlichen Klasse verwenden? Anscheinend liegt es nicht daran, dass Ihre Sammlung nur lesbar sein sollte.Der einzige Grund, den ich mir vorstellen kann, ist, dass Sie steuern möchten, welche Zugriffsmethoden Sie veröffentlichen möchten. In diesem Fall ist es besser, eine eigene Auflistungsklasse zu erstellen, eine Liste zu kapseln, die ausgewählten Methoden Hinzufügen und Entfernen zu implementieren und zu implementieren
IEnumerable<T>
. Verwenden Sie dies dann anstelleIEnumerable<T>
der Art Ihrer Kindersammlung.Aber es scheint mir,
List<ClassB>
würde dir wahrscheinlich nur gut dienen.quelle
Was wird
AddChild
hinzugefügt undRemoveChild
entfernt? Wenn es aus der Datenbank (oder einem beliebigen Persistenzspeicher) stammt, haben Sie eine Art aktiven Datensatz. Nicht unbedingt immer eine schlechte Sache, aber es bringt Sie definitiv dazu, sich Gedanken über Frameworks, Konventionen, Abhängigkeiten usw. zu machen, wie @CandiedOrange erwähnt.Was wäre zur gleichen Zeit der Sinn, um eine Abhängigkeit von ClassA zu ClassB (oder zumindest InterfaceB) zu vermeiden, wenn sich alle in derselben Anwendung befinden? In der realen Welt, die Ihre Anwendung modelliert, hängen die Dinge voneinander ab. Objekte der realen Welt verfügen über Sammlungen anderer Objekte, die ihnen "gehören". Es ist völlig angemessen, diese Beziehungen in Ihrem Code darzustellen.
Der einzige Grund, warum es ein wenig komplizierter wird, ist, dass Sie anscheinend genau steuern müssen, wie eine KlasseB mit KlasseA assoziiert wird und von KlasseA getrennt wird. Sie müssen also ein wenig Verhalten implementieren. Sie können es entweder innerhalb der Klasse implementieren (was völlig "legal" ist; siehe /programming//a/725365/44586 ), oder Sie können eine Art separate Klasse haben, die dieses Verhalten enthält. Tun Sie, was für Ihre individuellen Umstände am sinnvollsten ist.
In jedem Fall ist POJO / POCO wirklich nur OOP, wie es gedacht war, schmucklos und unbelastet. Befolgen Sie die OOP-Prinzipien und Sie werden sicher sein.
quelle