È una cattiva pratica ignorare alcuni parametri mentre si implementa un metodo di un'interfaccia?

0

Un metodo di interfaccia implementato da una classe dovrebbe sempre utilizzare tutti i parametri? Per interfaccia non intendo necessariamente%% effettivo di%, queste potrebbero essere altre classi (astratte) anch'esse estese.

A volte trovo difficile usare tutti i parametri in tutte le implementazioni. Tuttavia, questo mi sembra un cattivo design. Mi fa pensare al mantra interfaces .

Questo si applica in particolare nelle situazioni in cui il comportamento (parzialmente) opzionale - come i flag precedentemente impostati sull'istanza dell'oggetto - viene rifatto in un approccio che utilizza il polimorfismo.

In pseudo codice:

interface ValueProcesser {

    public Value doSomethingWithValue(value, parameter1, parameter2);
}

class Implementation1 implements ValueProcesser {

    // Does nothing - no optional behavior applies in here.
    public Value doSomethingWithValue(Value value, parameter1, parameter2) {
        return value;
    }
}

class Implementation2 implements ValueProcesser {

    // Behavior that only uses the first parameter
    public Value doSomethingWithValue(Value value, parameter1, parameter2) {
        doSomethingWithValueUsingParameter1(value, parameter1);

        return value;
    }
}

class Implementation3 implements ValueProcesser {

    public Value doSomethingWithValue(Value value, parameter1, parameter2) {
        doSomethingWithValueUsingParameter1AndParameter2(value, parameter1, parameter2);

        return value;
    }
}

Ora per il codice cliente con un'istanza perfection is achieved not when there is nothing more to add, but when there is nothing left to take away , è davvero facile chiamare semplicemente:

    public void main() {
        ValueProcesser.doSomethingWithValue(value, parameter1, parameter2);
    }

e tutto funzionerà. La domanda è: se i parametri inutilizzati vengono rifattorizzati in qualche modo e in che modo posso fare un refactoring per eliminare la loro ridondanza?

Per la cronaca, non ha senso impostare quei parametri come membri delle classi ValueProcesser .

    
posta user2180613 24.07.2016 - 19:49
fonte

3 risposte

3

In parole povere:

Come implementatore ti è anche permesso di scrivere implementazioni fittizie. Non puoi fare nulla o restituire null (nel caso di una funzione), oppure puoi fare qualcosa che non è ciò che la firma del metodo implica. Ma riuscirà a ottenere quello che vuoi?

È perfettamente valido per determinati metodi accettare valori nulli in alcuni parametri.

È impossibile dire se ti stai imbattendo in una brutta pratica con esempi come quelli che mostri. Ma è probabile che l'interfaccia violi il principio di segregazione dell'interfaccia e ti costringe a implementare metodi che non ti servono.

D'altra parte, se parameter1 e parameter2 sono solo flag (non si specifica il loro tipo, quindi potrebbero essere booleani), quindi il design è difettoso, perché implica che il metodo faccia più di una cosa (Martin's Clean Code).

Bottom line:

Sei costretto a implementare un design imperfetto.

    
risposta data 25.07.2016 - 02:56
fonte
1

Poiché molte lingue consentono parametri opzionali nella firma di una funzione, chiaramente questa non è una pratica "sempre cattiva". Per quanto riguarda le linee guida per stabilire se si tratta di una buona pratica, suggerirei quanto segue (esempi basati su Java, ma dovrebbero applicarsi ad altre lingue)

  1. Coerenza: se esiste un modello di utilizzo, come un argomento "locale" coerente per la formattazione del tempo e del numero, ciò è positivo. Se ci sono più opzioni nello stesso posto, come java.util.String con possibili argomenti per Charset e una stringa con il nome del set di caratteri, ciò è sospetto.

  2. Documentazione: se possibile, usa la sintassi di varargs della lingua per maggiore chiarezza. Nel tuo esempio, il metodo dovrebbe essere public Value doSomethingWithValue(Value value, Value...options) .

  3. Naturalezza ed espressività: se tutti i tuoi colleghi "lo fanno" velocemente, sei sulla strada giusta. Se tutti dicono "WTF, perché dovrei desiderare un valore opzionale per PI?" probabilmente ti perderai.

risposta data 25.07.2016 - 07:57
fonte
0

La tua domanda è puramente tecnica e non ha esempi pratici. È come chiedere "Posso implementare un metodo di interfaccia chiamato Aggiungi per sottrarre i valori di input anziché aggiungerli?"

Sì, è possibile, ma il codice sarà inutile. Come ogni implementazione dell'interfaccia che non implementa il comportamento previsto.

Prendi la sottostringa. Ci vuole un inizio e una lunghezza. Come implementatore puoi ignorare la lunghezza? Sì, ma ogni utente si aspetta che la lunghezza sia efficace quando viene inoltrata. Se ignori qualsiasi parametro la tua implementazione non sarà completa, ogni parametro su qualsiasi metodo di interfaccia ha uno scopo.

    
risposta data 24.07.2016 - 23:00
fonte

Leggi altre domande sui tag