Sto riscontrando un problema nella progettazione OO in cui trovo il codice duplicato in 2 classi diverse. Ecco cosa sta succedendo:Progettazione OO e metodi speculari/duplicati
In questo esempio, voglio rilevare la collisione tra oggetti di gioco.
Ho un CollisionObject di base che contiene metodi comuni (come checkForCollisionWith) e CollisionObjectBox, CollisionObjectCircle, CollisionObjectPolygon che estendono la classe base.
Questa parte del design sembra ok, ma qui è quello che mi è preoccupante: chiamando
aCircle checkForCollisionWith: aBox
eseguirà un cerchio vs Casella di controllo di collisione all'interno Circle sottoclasse. Al contrario,
aBox checkForCollisionWith: aCircle
eseguirà il controllo della collisione tra caselle e cerchi all'interno della sottoclasse della casella.
Il problema è che il codice di collisione di Circle vs Box è duplicato, poiché è in entrambe le classi Box e Circle. C'è un modo per evitarlo o mi sto avvicinando a questo problema nel modo sbagliato? Per ora, mi sto propendo per avere una classe helper con tutto il codice duplicato e chiamarla dagli oggetti aCircle e aBox per evitare duplicati. Sono curioso di sapere se c'è una soluzione OO più elegante a questo, però.
Questo sembra essere molto difficile da mantenere, per ogni classe oggetto derivante da Collision faresti aggiungere un nuovo 'checkForCollisionWithX' in tutte le altre classi derivate. – chelmertz
È assolutamente difficile da mantenere. Non ho mai detto che questa fosse la tecnica giusta da utilizzare per il rilevamento delle collisioni. In realtà, il codice dovrebbe ** automaticamente ** costruire una matrice di invio collisioni. Le operazioni di collisione dovrebbero quindi essere gestite attraverso quella matrice. Si codifica il generatore di matrice una volta, si utilizza il riflesso, tutto procede in modo piacevole e veloce dopo. –