Ist die Größe des Konstrukteurs ganz gleich, ob Sie verwenden Inversion of Control?

StackOverflow https://stackoverflow.com/questions/123002

  •  02-07-2019
  •  | 
  •  

Frage

Also ich habe vielleicht 10 Objekte, von denen jede 1-3 Abhängigkeiten hat (was meiner Meinung nach ok ist so weit wie lose Kopplung betroffen ist), aber auch einige Einstellungen, die verwendet werden können, Verhalten (Timeout, Fenstergröße zu definieren, etc).

Nun, bevor ich mit einem Inversion of Control Container gestartet würde ich eine Fabrik geschaffen haben und vielleicht sogar ein einfaches ObjectSettings Objekt für jedes der Objekte, die mehr als 1 Einstellung erfordert die Größe des Konstruktor auf den empfohlenen „weniger zu halten, als 4" Parametergröße. Ich bin jetzt eine Umkehrung der Steuerbehälter mit und ich sehe nicht, dass alle viel von einem Punkt zu. Klar, ich könnte einen Konstruktor mit 7 Parametern, aber wen interessiert das? Es ist alles sowieso vom IOK ausgefüllt werden.

Bin ich hier etwas fehlt oder ist dies grundsätzlich richtig?

War es hilfreich?

Lösung

Die Beziehung zwischen Klasse Komplexität und der Größe des IoC Konstruktor war mir nicht aufgetreten, bevor diese Frage zu lesen, aber meine Analyse unten deutet darauf hin, dass viele Argumente in der IoC Konstruktor hat, ist ein Code Geruch bewusst sein, wenn IoC verwenden. Sie wird dazu beitragen, die Klassen halten sich einfach auf einen kurzen Konstruktorargument Liste Stick ein Ziel zu haben. einzigen Verantwortung Prinzip folgende werden Sie zu diesem Ziel führen.

ich auf einem System arbeiten, die derzeit 122 Klassen hat, die die Spring.NET Framework instanziiert verwenden. Alle Beziehungen zwischen diesen Klassen sind in ihren Konstrukteuren einzurichten. Zwar hat das System seinen fairen Anteil von weniger als perfektem Code, wo ich ein paar Regeln gebrochen haben. (Aber, hey, unsere Fehler sind Möglichkeiten, zu lernen!)

Die Konstrukteure dieser Klassen haben eine unterschiedliche Anzahl von Argumenten, die ich in der Tabelle unten zeigen.

Number of constructor arguments    Number of classes
           0                             57
           1                             19
           2                             25
           3                              9
           4                              3
           5                              1
           6                              3
           7                              2
           8                              2

Die Klassen mit Null Argumente entweder konkrete Strategie Klassen oder Klassen sind, die durch das Senden von Daten an externe Systeme auf Ereignisse reagieren.

Die mit 5 oder 6 Argumente sind alle etwas unelegant und einige Umgestaltung, sie zu vereinfachen nutzen könnten.

Die vier Klassen mit 7 oder 8 Argumente sind hervorragende Beispiele für Gott Objekte . Sie sollten aufgebrochen werden, und jeder ist schon auf meiner Liste der Brennpunkte innerhalb des Systems.

Die übrigen Klassen (1 bis 4 Argumente) sind (meist) einfach gestaltet, leicht zu verstehen, und entsprechen die einzelne Verantwortung Prinzip .

Andere Tipps

Die Notwendigkeit für viele Abhängigkeiten (vielleicht mehr als 8) einen Konstruktionsfehlers hindeuten könnte, aber im Allgemeinen Ich denke, es ist kein Problem, solange das Design zusammenhängenden ist.

Bedenken Sie auch einen Service Locator oder statische Gateway für Infrastruktur betrifft Verwendung wie Logging und Genehmigung, anstatt die Konstruktorargumente unübersichtlich.

EDIT: 8 ist wahrscheinlich zu viele, aber ich dachte, es würde die ungeraden Fall für sie. Nach einem Blick auf Lees Post Ich bin einverstanden, 1-4 in der Regel gut.

G'day George,

Zunächst einmal, was die Abhängigkeiten zwischen den Objekten sind?

Viele "isa" Beziehungen? Viele "hasa" Beziehungen?

Viele Fan-in? Oder Fanout?

George Antwort: „has-a meistens versucht, die Komposition der Vererbung Rat folgen ... warum sollte es aber los?“

Wie es meistens „hasa“ Sie sollte alles in Ordnung sein.

Besser stellen Sie sicher, dass Ihre Konstruktion (und Vernichtung) der Komponenten obwohl korrekt zu verhindern Lecks Speicher durchgeführt wird.

Und wenn diese in C ++, stellen Sie sicher, dass Sie virtuelle Destruktoren verwenden?

Dies ist ein schwierige Frage, und warum ich einen Hybrid-Ansatz, bei den entsprechenden Eigenschaften sind wandelbar und nur unveränderliche Eigenschaften und erforderliche Abhängigkeiten ohne nützlichen Standard ist Teil des Konstrukteurs begünstigen. Einige Klassen sind mit dem Nötigsten aufgebaut, dann abgestimmt, wenn nötig über Setter.

Es hängt alles davon ab, welche Art von Containern, den Sie verwendet haben, nimmt das IOC und was nähert sich den Behälter zu tun, ob es Anmerkungen oder Konfigurationsdatei verwendet das Objekt zu sättigen instiantiated werden. Außerdem, wenn Sie Ihre Konstruktorparameter Typen einfach nur primitive Daten sind, dann ist es nicht wirklich eine große Sache; aber wenn Sie nicht-primitive Typen dann meiner Meinung nach, können Sie die Eigenschaft verwenden, basierend DI statt consutructor Basis DI.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top