Ваш підхід врешті-решт призведе до дуже зв'язаного коду.
Якщо підсумувати Еріка Ліпперта, то в ідеалі тут ви хочете, щоб боксер міг пробити багато чого іншого. Якщо мішок для перфорації є підписом функції боксера, це означає, що боксер створений з негайним знанням Все (що є перфораційним). Плюс надання удару та отримання удару - це ДУЖЕ різні речі, тому вони не повинні мати одне й те саме ім’я.
Я б скоріше моделював це як боксер, який створює удар (інший об'єкт, що містить силу атрибута удару, досяжність, напрямок тощо).
Потім у мішок для штампування таким способом, як onPunch, який отримує цей ударний об'єкт, можна обчислити вплив удару на себе.
Пам'ятаючи про це, ім'я речей має велике значення. Він повинен відповідати ментальній моделі ситуації, яку ви маєте. Якщо ви намагаєтеся пояснити, як може статися щось, що не має сенсу з першого погляду, або якщо у вас є найскладніший час називати щось, то, можливо, ваша модель неправильна і її потрібно змінити.
Важко змінити модель після того, як ви почали, люди, як правило, схиляються до реальності відповідно до моделі. Проблема в цьому полягає в тому, що, коли ви згинаєте речі, щоб вони підходили (наприклад, мішок для штампування, який може пробивати речі), світ, який ви створюєте, стає все складнішим і взаємодії стають все складнішими. Ви зрештою досягнете точки, коли додавання навіть найнезначнішої речі стає кошмаром змін та помилок. Цей концептуальний технічний борг може мати дуже круту ціну, навіть якщо початкова вартість в той час сприймалася як найдешевша річ.