Ich benutze OOP für alle meine Projekte, historisch gesehen ist alles, was ich gebaut habe, ziemlich klein und OOP schien keine effiziente Wahl zu sein, aber jetzt ist es bei großen Projekten. In letzter Zeit stoße ich auf mehr und mehr "best practice" -Fragen, die ich habe und für die ich keine Antwort finden kann.
Stellen Sie sich zum Beispiel Folgendes vor:
%Vor% Nehmen wir nun an, ich möchte add
, dann multiply
und dann minus
anwenden. Jede Stufe kann möglicherweise scheitern (das habe ich im Beispiel nicht erwähnt, aber stell dir vor, es wäre da). Hier liegt mein Problem, sollte ich tun:
Oder sollte ich diesen Teil in meinem Konstruktor haben, wie:
%Vor%und dann einfach:
%Vor%Tut mir leid, wenn das Beispiel langwierig ist (ignoriere auch die Fehler, ich habe es hier geschrieben, um zu skizzieren, was ich versuche zu tun, das ist kein Code, den ich benutze ...), aber ich weiß es nicht Wie formuliert man die Frage ohne ein Beispiel? Grundsätzlich, sollte ich nach Fehlern innerhalb der Klasse suchen oder sollte ich es draußen machen, wenn ich die Klasse anrufe?
Es ist fast immer sinnvoll, Konsistenz bei Aktualisierungen innerhalb der Klasse zu erzwingen (d. h. zu jeder Zeit, zu der eine Methode den internen Status der Klasse ändern kann, überprüfen Sie die Eingabe). Dann verwenden Sie Ausnahmen , um es zum Problem des Aufrufers zu machen, wenn diese Eingabe nicht wohlgeformt ist, oder wenn diese Operation wird eine Klasseninvariante verletzen.
Die Fehlerprüfung innerhalb einer Klasse sollte auf die Möglichkeiten achten, bei denen die Methode dieser Klasse fehlschlägt. Mit anderen Worten, wenn Ihre Zahlenklasse eine Dividiermethode hat, sollte sie überprüfen, ob der Nenner keine Null ist.
Die Fehlerüberprüfung, die für die Instanz einer Klasse (außerhalb der Klasse) ausgeführt wird, sollte sicherstellen, dass die korrekten Ergebnisse einer Eigenschaft oder Klassenmethode zurückgegeben werden. Da dies normalerweise nicht mit einer gut entworfenen Klasse passieren sollte, prüfen Sie normalerweise auf extreme Fälle.
Wenn Sie jedoch eine Klasse erstellen, die mehrere Dinge wie Ihren Fall im Auge behält, würde ich die Klasse normalerweise noch weiter trennen. Erstellen Sie Klassen für die Behandlung Ihrer mathematischen Funktionen, und verwenden Sie dann Ihre Zahlenklasse mit diesen mathematischen Klassen. Auf diese Weise haben Sie eine bessere Trennung von Bedenken, besserem Code und einfacherem Testen.
Ich persönlich würde mich im zweiten Beispiel von dem, was Sie im Konstruktor versuchen, fernhalten. Es implementiert die Hard-Codes und verletzt die Hauptfunktion zum Ausblenden von Informationen . Ansonsten, ohne zu wissen, was die Klasse intern macht, wenn du $num = new Number(8);
machst, ist es schwer zu verstehen, warum du 47
zurückbekommst ... Es verstößt auch gegen die no magische Zahl Prinzipal ...
Was die Methoden betrifft, sehen sie für mich gut aus. Sie können in diesen Fällen eine Ausnahme auslösen oder einen booleschen Wert zurückgeben. Was du wählst, ist ein Faktor von viel mehr, als hier diskutiert wird (wie deine Präferenz, was genau die Klasse macht, Konvention, etc.) ...
Oh, und Sie haben ein paar Endlosschleife Probleme in Ihrer Klasse. function number()
sollte sein:
Und das gleiche für error()
...