È una pratica scorretta chiamare i metodi attraverso più oggetti? [duplicare]

9

Ho un codice che assomiglia a questo:

tr.t.findIndexSmoothed(arg0.getX(), arg0.getY());

"tr" e "t" sono oggetti. È una cattiva pratica raggiungere fino in fondo la gerarchia degli oggetti per chiamare i metodi? L'unica ragione per cui posso pensare è che è l'incapsulamento delle pause, e se è così, qualcuno può dirmi perché questo pone un problema? Inoltre, questa struttura del codice inibisce in qualche modo le prestazioni?

    
posta Azar 18.08.2013 - 20:34
fonte

2 risposte

11

The Law of Demeter suggerisce che non devi chiamare i metodi sugli oggetti a due livelli in questo modo.

L'idea è che, nel tuo caso, dovresti avere un metodo findIndexSmoothed su tr che a sua volta chiama findIndexSmoothed su t.

Ciò che fa è rendere il tuo codice adattabile. Significa che la natura di tr.findIndexSmoothed può cambiare senza necessariamente modificare la natura di t.findIndexSmoothed, che può essere chiamata da un altro codice che non si intende modificare.

Tuttavia, è comunemente notato che è piuttosto raro che tu abbia davvero bisogno di tale adattabilità, e ti sarai messo in una posizione in cui la manutenzione di t.findIndexSmoothed richiede ora la manutenzione di tr.findIndexSmoothed così, in alcuni casi, dovrai aumentare il carico di lavoro.

Quindi, la risposta alla tua domanda, come tante domande di stile nella programmazione, è: usa il buon senso. Tieni a mente la legge di Demeter, ma non rendila mai una verità inflessibile.

    
risposta data 18.08.2013 - 22:59
fonte
0

Penso che non ci sia nulla di sbagliato finché ha senso dal punto di vista del design. Basta porsi queste domande:

  1. È ragionevole per tr contenere ed esporre t?
  2. È findIndexSmoothed () la responsabilità di t?

Se rispondi di si a entrambe le domande, allora è un modo per andare. L'unica cosa che farei in modo diverso è renderla privata e accedervi tramite getter.

Inoltre, penso che abbia davvero senso con il principio della responsabilità unica. E se avessi 5 metodi diversi? vorresti delegare tutti quelli di tr? come li chiameresti? findIndexSmoothedInTr ()?

    
risposta data 19.08.2013 - 09:09
fonte

Leggi altre domande sui tag