Come condividere i metodi comuni se gli oggetti hanno ruoli diversi?

2

Se 2 classi hanno le seguenti caratteristiche in comune:

  • parte del modo in cui è rappresentato il loro stato (entrambi hanno un contenitore lineare)
  • più metodi identici (codice identico, non solo firma)

Ma non sono sostituibili, cioè: svolgono ruoli diversi.
Allora come evito di ripetere quei metodi?

La soluzione ovvia sarebbe ereditaria, ma ho letto: "l'ereditarietà non è per il riutilizzo del codice". (Questo si applica qui? È davvero un caso di riutilizzo del codice?)

Non ti sto deliberatamente dicendo quale lingua, perché spero in una risposta agnostica per la lingua.

I metodi sono lunghe un paio di righe, tutti modificano il contenitore, uno di essi trasforma / estrae una sorta di "risultato finale" dal contenitore. Per ruoli intendo: sostituire l'uno con l'altro sarebbe valido codice eseguibile (nei luoghi in cui vengono utilizzati solo i metodi comuni), ma risulterebbe in errore logico / semantico. Per ereditarietà intendevo che introdurre una 3a classe come base / super con i metodi comuni, ma che sarebbe virtuale. Quindi per sostituzione intendevo sostituire un tipo "fratello" e non un sottotipo.

    
posta user1358 06.01.2013 - 10:28
fonte

1 risposta

5

A volte, l'ereditarietà può essere usata per riutilizzare il codice. Soprattutto l'ereditarietà privata nelle lingue che la supportano.
E se ciò non è possibile per te, puoi sempre scomporre le cose comuni in una classe separata e usare la composizione per includerla nelle tue classi originali.

In ogni caso, prima di refactarlo, dovresti considerare se la somiglianza è strutturale o accidentale. Porsi queste domande:

  • Il contenitore e le funzioni associate rappresentano lo stesso concetto in entrambi i luoghi in cui vengono utilizzati?
  • È possibile che il tipo di contenitore venga modificato in un unico posto senza che debba essere modificato nell'altro? Lo stesso vale per l'implementazione delle funzioni.

Se la risposta al primo è "No" o al secondo è "Sì", la somiglianza è casuale. Quindi non stai ripetendo te stesso e non hai bisogno di refactoring.

    
risposta data 06.01.2013 - 11:05
fonte