In fast jedem Projekt, an dem ich mit einem Team arbeite, scheint sich das gleiche Problem einzuschleichen. Jemand schreibt UI-Code, der Daten benötigt, und schreibt eine Datenzugriffsmethode:
AssetDto GetAssetById(int assetId)
Eine Woche später arbeitet jemand anderes an einem anderen Teil des Antrags und benötigt ebenfalls einen, AssetDto
aber jetzt auch "Genehmiger" und schreibt Folgendes:
AssetDto GetAssetWithApproversById(int assetId)
Einen Monat später benötigt jemand einen Vermögenswert, der jedoch jetzt die "Fragen" (oder die "Eigentümer" oder die "laufenden Anfragen" usw.) enthält:
AssetDto GetAssetWithQuestionsById(int assetId)
AssetDto GetAssetWithOwnersById(int assetId)
AssetDto GetAssetWithRunningRequestsById(int assetId)
Und es wird noch schlimmer, wenn Methoden wie GetAssetWithOwnerAndQuestionsById
beginnen zu erscheinen.
Sie sehen das Muster, das entsteht: Ein Objekt wird an ein großes Objektdiagramm angehängt, und Sie benötigen verschiedene Teile dieses Diagramms an verschiedenen Stellen.
Natürlich möchte ich verhindern, dass es eine große Anzahl von Methoden gibt, die fast dasselbe tun. Ist es einfach eine Frage der Teamdisziplin oder gibt es ein Muster, mit dem ich dies verhindern kann? In einigen Fällen kann es sinnvoll sein, separate Methoden zu verwenden, dh es kann teuer sein, ein Asset mit laufenden Anforderungen zu erhalten, sodass ich diese nicht immer einbeziehen möchte. Wie gehe ich mit solchen Fällen um?
quelle
a = getAssetById(x)
a.questions usw. aufrufen und können sie dann aufrufen, ohne sie speziell zu laden, da das zugrunde liegende ORM-System sie für Sie lädt, wenn der Zugriff versucht wird.Antworten:
In Bezug auf die Syntax würde ich ein Zwischenobjekt zum Erstellen von Abfragen mit einer fließenden Schnittstelle erstellen:
Ich hoffe, es ist offensichtlich genug, um es umzusetzen. Die einzige Methode, die die Datenbank tatsächlich berührt, ist
fetch()
.quelle
Beim Umgang mit großen Objekten ist dies sehr häufig. Das Hinzufügen neuer Methoden erhöht zwar die Leistung, verringert jedoch die Wartbarkeit erheblich. Und wieder müssen Sie zwischen diesen beiden wählen.
Ich schlage vor, Sie haben eine Methode, die häufig verwendete Daten zurückgibt (nicht unbedingt die kleinsten), eine andere, die das gesamte Objekt zurückgibt, und wahrscheinlich einige mehr für die teuersten Ressourcen.
Ein anderer Ansatz besteht darin, Methoden zu haben, die nur die erforderlichen Felder des Objekts zurückgeben, wie z . B.
AssetQuestions GetAssetQuestionsById(int assetId)
oderOwners GetAssetOwnersById(int assetId)
.Gleichzeitig müssen Sie einige Regeln für das Abrufen von Daten festlegen. Wenn beispielsweise jemand 5 Felder des Objekts benötigt und eine vorhandene Methode 8 zurückgibt, sollte die vorhandene Methode verwendet werden.
quelle
Ich habe in letzter Zeit dasselbe Problem durchgemacht und die folgende Lösung gewählt:
Datenzugriffsmethoden sollten nur Daten von einer einzelnen Ressource (z. B. Datenbanktabelle) abrufen. Wenn der Prozess verwandte Objekte benötigt, die an das Hauptobjekt angehängt sind, sollte die für diese jeweiligen Objekte verantwortliche Methode aufgerufen werden.
Auf diese Weise sollten Sie eine Fassadenmethode erstellen, die die Objekte verbindet, wenn Sie ein Asset mit seinen Genehmigenden benötigen.
Beispiel:
quelle
Ja, es handelt sich um einige Richtlinien für das Benennungsmuster des Teams. Sie können einfache 4 Methoden wie GetEntityById (), GetAllEntities (), SetEntity (), DeleteEntityById () festlegen.
Darüber hinaus können Sie zwei dto's mit der Benennung
AssetSimpleDto GetAssetById(assetId)
und ein weiteres detailliertes dto mit dem Namen as habenAssetDto GetAssetDetailById(assetId)
. Die erste Methode und dto sind so angepasst, dass sie nur ein Minimum bieten, während die zweite alle zugehörigen Informationen enthält, die Ihre Funktionalität möglicherweise benötigt.quelle