Aktivitäten betroffen sein, dieses Muster mit Bezug auf:
- Einzel Prinzip Verantwortung
- Umsetzung Funktionale Dekomposition Antipattern
- Brechen Anderenfalls gemeinsamen Erwartungen der Verbraucher
Einzel treffen Verantwortung Prinzip
Dies ist eine geringfügige Abweichung vom ursprünglichen Prinzip, wird aber stattdessen auf Funktionen angewendet. Wenn Ihr Konstrukteur mehr als eine Sache macht (Konstruktion und Verarbeitung), erschweren Sie die Wartung dieser Methode in der Zukunft. Wenn ein Anrufer während der Konstruktion nicht arbeiten will, lässt er keine Option. Wenn die "Verarbeitung" eines Tages zusätzliche Schritte erfordert, die nicht im Konstruktor enthalten sein sollten, müssen Sie überall, wo Sie diese Methode verwenden, eine Umgestaltung vornehmen.
Funktionale Dekomposition Antipattern
Ohne Einzelheiten zu wissen, würde ich diesen Code betroffen sein, der tut dies, diese Antipattern implementiert. Die Objekte sind keine echten Objekte, sondern funktionale Programmiereinheiten, die in objekt-orientierte Verkleidung gehüllt sind.
Gemeinsame Erwartungen der Verbraucher
Würden die durchschnittlichen Anrufer dieses Verhalten des Konstrukteurs erwarten? Es kann Orte geben, an denen eine zusätzliche Verarbeitung während der Konstruktion eine kurze Handprogrammierung sein kann. Aber das sollte explizit dokumentiert und von den Anrufern gut verstanden werden.Die Gesamtnutzung des Objekts sollte in diesem Kontext noch sinnvoll sein und es sollte für den Aufrufer selbstverständlich sein, es auf diese Weise zu verwenden.
Verstehen Sie auch, was Sie auf Ihren Verbraucher erzwingen. Wenn Sie die Verarbeitung im Konstruktor durchführen, zwingen Sie den Verbraucher, diese Verarbeitung (in Bezug auf die Verarbeitungszeit) zu bezahlen, unabhängig davon, ob sie dies wünschen oder nicht. Sie eliminieren die Möglichkeit einer "faulen" Verarbeitung oder anderer Formen der Optimierung.
Annehmbare Verwendung?
Nur an Orten, wo die gemeinsame Verwendung der Klasse eine Initialisierung erfordert, die zur Konstruktionszeit optional sein kann. Die Dateiklasse ist ein gutes Beispiel:
/* This is a common usage of this class */
File f;
f.Open(path);
/* This constructor constructs the object and puts it in the open state in one step
* for convenience */
File f(path);
Aber auch das ist fraglich. Behält die Dateiklasse den Pfad zur Datei intern bei oder wird sie nur zum Öffnen einer Datei verwendet? Wenn es den Dateipfad speichert, haben jetzt Open() und der neue Konstruktor mehrere Verantwortlichkeiten (SetPath (p) und Open()). In diesem Fall sollte der Konstruktor "Datei (Pfad)" möglicherweise die Datei nicht öffnen, sondern nur den Pfad im Objekt festlegen.
Es gibt viele Überlegungen basierend auf den fraglichen Objekten. Erwägen Sie, Komponententests für Ihre Objekte zu schreiben. Sie werden Ihnen helfen, viele dieser Anwendungsfälle auszuarbeiten.
Liest mehr wie Sie möchten eine statische Funktion für dieses Objekt. – AlG
@ qor72 Ich möchte auf jeden Fall eine Instanz dieser Klasse, aber ich bin faul, Variablen einzugeben und die gleiche Methode immer wieder aufzurufen. – pestaa
Ich verstehe in keiner Weise, warum das einfacher ist, als 'SomeObject-> process ($ param1, $ param2)' direkt aufzurufen. – fearofawhackplanet