"Die ideale Anzahl von Argumenten für eine Funktion ist Null" ist einfach falsch. Die ideale Anzahl von Argumenten entspricht genau der Anzahl, die erforderlich ist, damit Ihre Funktion nebenwirkungsfrei ist. Weniger als das und Sie verursachen unnötigerweise, dass Ihre Funktionen unrein sind, was Sie zwingt, sich von der Grube des Erfolgs zu entfernen und den Gradienten des Schmerzes zu überwinden. Manchmal ist "Onkel Bob" mit seinem Rat genau richtig. Manchmal irrt er sich spektakulär. Sein Nullargument-Rat ist ein Beispiel für Letzteres
( Quelle: Kommentar von @David Arno unter einer anderen Frage auf dieser Seite )
Der Kommentar hat eine spektakuläre Anzahl von 133 positiven Stimmen erhalten, weshalb ich etwas mehr auf seine Verdienste achten möchte.
Soweit mir bekannt ist, gibt es zwei verschiedene Möglichkeiten bei der Programmierung: reine Funktionsprogrammierung (was dieser Kommentar anregt) und erzählen, nicht fragen (was von Zeit zu Zeit auch auf dieser Website empfohlen wird). AFAIK Diese beiden Prinzipien sind grundsätzlich inkompatibel und stehen in der Nähe von Gegensätzen: Rein funktional kann als "nur Rückgabewerte, keine Nebenwirkungen" zusammengefasst werden, während tell, nicht ask als "nichts zurückgeben" zusammengefasst werden kann. nur Nebenwirkungen haben ". Außerdem bin ich etwas ratlos, weil ich dachte, dass "Tell, Don't Ask" als Kern des OO-Paradigmas angesehen wurde, während reine Funktionen als Kern des Funktionsparadigmas angesehen wurden - jetzt sehe ich reine Funktionen, die in OO empfohlen werden!
Ich nehme an, Entwickler sollten sich wahrscheinlich für eines dieser Paradigmen entscheiden und dabei bleiben. Nun, ich muss zugeben, dass ich mich auch niemals dazu bringen könnte, zu folgen. Oft erscheint es mir zweckmäßig, einen Wert zurückzugeben, und ich kann nicht wirklich erkennen, wie ich das erreichen kann, was ich nur mit Nebenwirkungen erreichen möchte. Oft scheint es mir angebracht, Nebenwirkungen zu haben, und ich kann nicht wirklich erkennen, wie ich das erreichen kann, was ich erreichen möchte, indem ich nur Werte zurückgebe. Außerdem habe ich oft (ich denke, das ist schrecklich) Methoden, die beides tun.
Aus diesen 133 positiven Stimmen schließe ich jedoch, dass derzeit reine funktionale Programmierung "gewinnt", da es zu einem Konsens wird, dass es überlegen ist, zu sagen, nicht fragen. Ist das richtig?
Daher versuche ich am Beispiel dieses von Antimustern geprägten Spiels Folgendes zu machen : Wenn ich es mit dem reinen Funktionsparadigma in Einklang bringen wollte - WIE ?!
Es erscheint mir vernünftig, einen Kampfzustand zu haben. Da dies ein rundenbasiertes Spiel ist, behalte ich die Kampfzustände in einem Wörterbuch (Multiplayer - es können viele Schlachten gleichzeitig von vielen Spielern gespielt werden). Immer wenn ein Spieler an der Reihe ist, rufe ich eine geeignete Methode für den Kampfstatus auf, die (a) den Status entsprechend ändert und (b) den Spielern Aktualisierungen zurückgibt, die in JSON serialisiert werden, und ihnen im Grunde nur mitteilt, was gerade auf der passiert ist Tafel. Ich nehme an, dass dies eine offensichtliche Verletzung BEIDER Prinzipien darstellt und gleichzeitig.
OK - Ich könnte eine Methode dazu bringen, einen Kampfzustand ZURÜCKZUZIEHEN, anstatt ihn zu ändern, wenn ich es wirklich wollte. Aber! Muss ich dann alles im Kampfzustand unnötig kopieren, um einen völlig neuen Zustand zurückzugeben, anstatt ihn zu ändern?
Nun, wenn der Zug ein Angriff ist, könnte ich vielleicht nur eine HP mit aktualisierten Charakteren zurückgeben? Das Problem ist, dass es nicht so einfach ist: Spielregeln, ein Zug kann und wird oft viel mehr Auswirkungen haben, als nur einen Teil der HP eines Spielers zu entfernen. Dies kann zum Beispiel den Abstand zwischen Zeichen vergrößern, Spezialeffekte anwenden usw. usw.
Es scheint mir so viel einfacher zu sein, nur den vorhandenen Status zu ändern und Updates zurückzugeben ...
Aber wie würde ein erfahrener Ingenieur das angehen?