Ich schreibe Klassen, die "auf eine bestimmte Art und Weise verwendet werden müssen" (ich denke, alle Klassen müssen ...).
Zum Beispiel erstelle ich die fooManager
Klasse, für die ein Aufruf erforderlich ist, zum Beispiel Initialize(string,string)
. Und um das Beispiel ein wenig voranzutreiben, wäre die Klasse nutzlos, wenn wir nicht auf ihre ThisHappened
Aktion hören.
Mein Punkt ist, die Klasse, die ich schreibe, erfordert Methodenaufrufe. Aber es wird gut kompiliert, wenn Sie diese Methoden nicht aufrufen und am Ende einen leeren neuen FooManager erhalten. Irgendwann funktioniert es entweder nicht oder stürzt ab, je nach Klasse und Einsatzzweck. Der Programmierer, der meine Klasse implementiert, würde offensichtlich hineinschauen und feststellen, dass "Oh, ich habe Initialize nicht aufgerufen!", Und es wäre in Ordnung.
Aber das gefällt mir nicht. Was ich im Idealfall möchte, ist der Code NICHT zu kompilieren, wenn die Methode nicht aufgerufen wurde; Ich vermute, das ist einfach nicht möglich. Oder etwas, das sofort sichtbar und klar sein würde.
Ich bin beunruhigt über die derzeitige Vorgehensweise, die ich hier verfolge:
Fügen Sie einen privaten Booleschen Wert in die Klasse ein und überprüfen Sie überall, ob die Klasse initialisiert ist. Wenn nicht, werde ich eine Ausnahme auslösen, die besagt: "Die Klasse wurde nicht initialisiert, sind Sie sicher, dass Sie anrufen .Initialize(string,string)
?".
Ich bin mit diesem Ansatz einverstanden, aber es führt zu viel Code, der kompiliert wird und letztendlich für den Endbenutzer nicht notwendig ist.
Manchmal ist es sogar noch mehr Code, wenn es mehr Methoden als nur einen Initiliaze
Aufruf gibt. Ich versuche, meine Klassen mit nicht zu vielen öffentlichen Methoden / Aktionen zu belassen, aber das löst das Problem nicht, es bleibt nur vernünftig.
Was ich hier suche, ist:
- Ist mein Ansatz korrekt?
- Gibt es eine bessere?
- Was tut / berät ihr?
- Versuche ich, ein Problem zu lösen, das nicht auftaucht? Ich habe von Kollegen erfahren, dass der Programmierer die Klasse überprüfen soll, bevor er versucht, sie zu verwenden. Ich bin mit Respekt anderer Meinung, aber das ist eine andere Sache, die ich glaube.
Einfach ausgedrückt, ich versuche einen Weg zu finden, um nie zu vergessen, Aufrufe zu implementieren, wenn diese Klasse später oder von jemand anderem wiederverwendet wird.
Erklärungen:
Um hier viele Fragen zu klären:
Ich spreche definitiv NICHT nur über den Initialisierungsteil einer Klasse, sondern es ist das ganze Leben. Verhindern Sie, dass Kollegen eine Methode zweimal aufrufen, und stellen Sie sicher, dass sie X vor Y usw. aufrufen. Alles, was am Ende obligatorisch und in der Dokumentation wäre, aber ich möchte, dass Code so einfach und klein wie möglich ist. Die Idee von Asserts hat mir sehr gut gefallen, obwohl ich mir ziemlich sicher bin, dass ich einige andere Ideen mischen muss, da Asserts nicht immer möglich sein werden.
Ich benutze die C # -Sprache! Wie habe ich das nicht erwähnt ?! Ich arbeite in einer Xamarin-Umgebung und erstelle mobile Apps in der Regel mit 6 bis 9 Projekten in einer Lösung, einschließlich PCL-, iOS-, Android- und Windows-Projekten. Ich bin seit ungefähr anderthalb Jahren Entwickler (Schule und Arbeit kombiniert), daher meine manchmal lächerlichen Aussagen \ Fragen. All das ist hier wahrscheinlich irrelevant, aber zu viele Informationen sind nicht immer eine schlechte Sache.
Ich kann aufgrund von Plattformbeschränkungen und der Verwendung von Dependency Injection nicht immer alle obligatorischen Elemente in den Konstruktor einfügen, da andere Parameter als Schnittstellen nicht in der Tabelle enthalten sind. Oder vielleicht reicht mein Wissen nicht aus, was durchaus möglich ist. Meistens handelt es sich nicht um ein Initialisierungsproblem, sondern um mehr
Wie kann ich sicherstellen, dass er sich für diese Veranstaltung angemeldet hat?
wie kann ich sicherstellen, dass er nicht vergaß, "den Prozess irgendwann anzuhalten"
Hier erinnere ich mich an eine Klasse zum Abrufen von Werbung. Solange die Ansicht, in der die Anzeige sichtbar ist, sichtbar ist, ruft die Klasse jede Minute eine neue Anzeige ab. Diese Klasse benötigt bei der Erstellung eine Ansicht, in der die Anzeige angezeigt werden kann, die offensichtlich in einem Parameter enthalten sein kann. Sobald die Ansicht verschwunden ist, muss StopFetching () aufgerufen werden. Andernfalls würde die Klasse weiterhin Anzeigen für eine Ansicht abrufen, die noch nicht vorhanden ist, und das ist schlecht.
Diese Klasse hat auch Ereignisse, die abgehört werden müssen, wie zum Beispiel "AdClicked". Alles funktioniert einwandfrei, wenn es nicht abgehört wird, aber wir verlieren die Verfolgung von Analysen, wenn keine Abgriffe registriert sind. Die Anzeige funktioniert jedoch weiterhin, sodass der Nutzer und der Entwickler keinen Unterschied bemerken und die Analyse nur falsche Daten enthält. Das muss vermieden werden, aber ich bin nicht sicher, wie Entwickler wissen können, dass sie sich für das Tao-Ereignis registrieren müssen. Das ist zwar ein vereinfachtes Beispiel, aber die Idee ist, "stellen Sie sicher, dass er die öffentliche Aktion verwendet, die verfügbar ist" und natürlich zum richtigen Zeitpunkt!
initialize
erst spät nach der Objekterstellung erfolgen? Wäre der ctor zu "riskant" in dem Sinne, dass er Ausnahmen werfen und die Schöpfungskette durchbrechen könnte?
new
wenn das Objekt nicht zur Verwendung bereit ist. Wenn Sie sich auf eine Initialisierungsmethode verlassen, werden Sie immer wieder verfolgt und sollten diese vermeiden, es sei denn, dies ist absolut notwendig. Das ist zumindest meine Erfahrung.