Ihr Ansatz wird schließlich zu einem sehr gekoppelten Code führen.
Um Eric Lippert hier ideal zusammenzufassen, möchte man, dass der Boxer in der Lage ist, sehr viele Dinge zu schlagen. Wenn der Boxsack die Signatur der Boxerfunktion ist, bedeutet dies, dass der Boxer mit dem unmittelbaren Wissen von All erstellt wird (das heißt, dass er stanzbar ist). Plus einen Schlag zu geben und einen Schlag zu erhalten sind zwei SEHR verschiedene Dinge, daher sollten sie nicht den gleichen Namen haben.
Ich würde dies eher als Boxer modellieren, der einen Schlag erzeugt (ein anderes Objekt, das die Attribute Kraft, Reichweite, Richtung usw. des Schlags enthält).
Dann muss der Boxsack mit einer Methode wie onPunch, die dieses Punch-Objekt empfängt, die Wirkung des Punchs auf sich selbst berechnen können.
Vor diesem Hintergrund ist der Name der Dinge sehr wichtig. Es muss zu dem mentalen Modell passen, das Sie von der Situation haben. Wenn Sie versuchen zu erklären, wie etwas passieren kann, das auf den ersten Blick keinen Sinn ergibt, oder wenn es Ihnen am schwersten fällt, etwas zu benennen, ist Ihr Modell möglicherweise falsch und muss geändert werden.
Es ist schwierig, ein Modell zu ändern, nachdem Sie begonnen haben. Im Allgemeinen neigen die Leute dazu, die Realität so zu ändern, dass sie zum Modell passt. Das Problem dabei ist, dass die Welt, die Sie erstellen, immer komplexer wird und die Interaktionen immer schwieriger zu implementieren sind, wenn Sie Dinge biegen, die passen (z. B. einen Boxsack, der Dinge stanzen kann). Sie werden irgendwann einen Punkt erreichen, an dem das Hinzufügen des Trivialsten zum Albtraum von Veränderungen und Fehlern wird. Diese konzeptionelle technische Verschuldung kann einen sehr hohen Preis haben, selbst wenn die anfänglichen Kosten zu diesem Zeitpunkt als das günstigste angesehen wurden.