Ci sono 2 metodi che chiamano l'un l'altro l'odore del codice?

3

Ad esempio, se 2 classi dipendono l'una dall'altra, è una sorta di dipendenza circolare e dovrebbe essere evitata. E i metodi? per esempio, se ho 2 metodi che si chiamano a vicenda:

public void methodA(){
    //some other code
    if(something){
        methodB();
    }
    .
    .
    .
    //some other code
}

public void methodB(){
    //some other code
    methodA();
    //some other code
}

è un odore di codice?

Nota: penso in inglese semplice, che cos'è la ricorsione? non rispondere alla mia domanda, perché quella domanda riguarda CHI è la ricorsione, mentre sto chiedendo COME scrivere la funzione di ricorsione (e non so se il mio caso è chiamato ricorsione in realtà), cioè: dovrei condensare il codice di ricorsione eseguire in una singola funzione?

    
posta mmmaaa 03.08.2018 - 08:16
fonte

3 risposte

6

da una prospettiva di ricorsione, non c'è nulla di sbagliato nell'avere più funzioni coinvolte in quel comportamento ricorsivo.

Tuttavia, questo non è davvero un problema di ricorsione; è un problema di accoppiamento. Poiché methodA e methodB si chiamano a vicenda, sono strettamente accoppiate l'una all'altra. Se esistono nella stessa classe, non è un problema: una classe è libera di accoppiarsi gli uni agli altri come meglio crede. Se però, esistono in classi diverse, allora questo è potenzialmente un problema.

In quest'ultimo caso, il modo standard per aggirare questo è sceglierne uno come "master" e iniettare l'altro in esso tramite un parametro o il costruttore della classe.

    
risposta data 03.08.2018 - 09:32
fonte
2

Solitamente non si vede questo tipo di dipendenza circolare, non perché sia necessariamente "codice cattivo", ma perché generalmente dimostra una mancanza di comprensione della relazione tra due classi. Quando lo guardi dal contesto, "Affinché la classe A funzioni, deve essere presente la classe B", quindi puoi vedere il contrario, "Per far funzionare la classe B, deve essere presente la classe A "non ha senso.

Le classi possono delegare compiti ad altre classi, ma la comunicazione nella direzione opposta viene solitamente eseguita in altri modi, ad esempio attraverso eventi o attraverso semplici restituzioni di metodo.

Ancora una volta, questo non significa che tali cose non possano essere fatte. Il modello di visitatore sfrutta questo per dare il controllo al chiamante della richiesta. Tuttavia, in tutti i miei anni da programmatore, tali situazioni non si presentano spesso. Prima di stabilire una tale relazione, rivalutarei il tipo di attività richiesta da entrambe le classi e individuare la logica esatta che impedisce di stabilire una relazione genitore-figlio. Con ogni probabilità, stai semplicemente mettendo un pezzo di logica, che dovrebbe essere nel genitore, nella classe figlia.

    
risposta data 03.08.2018 - 14:33
fonte
0

Altre risposte hanno affrontato i problemi dell'accoppiamento di classi, quindi non ci andrò, ma se dovessimo supporre che i due metodi nel tuo esempio siano nella stessa classe, direi che questo è (probabilmente) cattivo codice - Non posso dire per certo senza più contesto.

Il motivo principale per cui è negativo è perché è molto difficile seguire quale sarebbe il flusso dell'esecuzione semplicemente guardando il codice, e questo rende il codice difficile da mantenere.

L'unica ragione per cui posso pensare che due metodi si chiamino è per la ricorsione, e quindi è importante renderlo semplice e facile da seguire - in genere la chiamata all'altro metodo è l'ultima cosa che fa il metodo.

Ho inserito un esempio in ruby di un valido motivo per cui due metodi si chiamano a vicenda. È un'implementazione di quicksort in cui il metodo di ordinamento è leggermente diverso a ogni livello lungo la struttura.

    
risposta data 29.08.2018 - 21:02
fonte

Leggi altre domande sui tag