2015-09-24 13 views
7

questa è una domanda sulla programmazione delle buone pratiche, non sapevo come esprimere la domanda nel titolo, scusa, eccoci.È consigliabile chiamare un metodo sovraccarico con parametri null?

ho avuto un metodo in un Manager o Controller, in questo modo:

public boolean myMethod(Param1 param1); 

E, perché un cambiamento nella domanda, ho dovuto ridefinire in questo modo, perché chiama a altro metodo che ha bisogno param2 e param3:

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3); 

ora mi rendo conto che il metodo con 3 params "sempre" (per ora, forse in futuro ci sia un cambiamento e ho bisogno di chiamare con params non nulli) saranno chiamati con param2=null e param3=null, quindi nell'implementazione del primo metodo che ho fatto:

public boolean myMethod(Param1 param1) { 
    return this.myMethod(param1, null, null); 
} 

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) { 
    /* Call to other methods that is needed to pass it param2 and param3 */ 
} 

Quindi la chiamata al metodo del Gestore, e il modo originale, è ,:

boolean isTrue = myManager.myMethod(param1); 

Questa è un'opzione, l'altra opzione è quella di passare i params nulli dalla chiamata:

boolean isTrue = myManager.myMethod(param1, null, null); 

E che solo un metodo nel mio Rappresentante:

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3); 

Quindi, le domande reali sono: qual è il modo migliore per farlo parlando delle migliori pratiche? È sbagliato se nell'implementazione di Manager I sovraccarico un metodo e lo chiamiamo con parametri null?

Grazie in anticipo!

Saluti.

+1

Due idee veloci: 1. varargs. Soprattutto quando tutti i parametri sono dello stesso tipo. 2. Schema decoratore. Permette di "arricchire" i tuoi metodi sul runtime. Puoi trovare molti esempi su internet. Buona fortuna;) – Tinki

risposta

4

Il metodo sovraccarico con un numero inferiore di parametri che richiamano l'altro metodo con più parametri, è una pratica comune in Java ed è il modo Java di implementare i parametri "predefiniti".

Si noti che il valore predefinito non deve essere null, può essere qualsiasi valore.

Normalmente quando si chiama un metodo con più parametri, i valori passati danno un indizio sulla natura del parametro. Le costanti dei parametri come null, false, true o 0 non danno un'idea del significato dei parametri, il che rende il codice meno leggibile.

In genere una chiamata con un numero inferiore di parametri è più ovvia, quindi l'overloading con i parametri "predefiniti" è preferibile a un solo metodo con molti parametri costanti.

1

Questa domanda dipende dal fatto che il codice che si sta chiamando si aspetta che alcuni dei parametri siano null. Data la popolarità della domanda this, ti consiglio di evitare di inviare il più possibile i valori null.

In questo caso, dato che sei il proprietario del metodo stai passando valori nulli, ti consiglio di avere 2 versioni del metodo, una che può funzionare con 1 parametro e un'altra che funziona con 3 parametri.

La modifica dei metodi esistenti in genere non è consigliata poiché può interrompere il codice esistente. L'aggiunta di nuove funzionalità d'altra parte dovrebbe lasciare il lavoro precedente intatto. Ti permetterebbe anche di costruire casi di test relativamente appuntiti poiché testerai il nuovo comportamento non l'intero comportamento precedente e quello nuovo.

1

Proporrei di definire i due metodi che hai menzionato invece di fornire solo il metodo a 3 parametri e di imporre a tutti gli utenti del metodo di fornire "null" come valori. Fornire il metodo a 1 parametro ridotto rende esplicito che gli altri due parametri sono facoltativi.

Questo è anche raccomandato nella risposta corretta della domanda this.

1

Non è intrinsecamente buona né cattiva pratica. Come accennato in precedenza, questo è l'approccio di introdurre parametri predefiniti in Java.

L'unico problema potenziale con un sovraccarico che richiede solo un parametro e dietro le quinte chiama un altro sovraccarico (e passa altri parametri per impostazione predefinita) è quando questo non è chiaro dalla documentazione del metodo.

public boolean myMethod(Param1 param1) { 
    return this.myMethod(param1, null, null); 
} 

public boolean myMethod(Param1 param1, Param2 param2, Param3 param3) { 
    /* Call to other methods that is needed to pass it param2 and param3 */ 
} 

Si dovrebbe documentare correttamente il primo metodo in questo caso per assicurarsi che gli utenti comprendano le implicazioni del chiamarlo. Se si dispone di un sovraccarico che richiede parametri che è necessario impostare in modo esplicito su null, non si dispone di questo problema "nascosto", ma è comunque necessario documentare il metodo.

Penso che dipenda da voi davvero. Qualunque cosa tu scelga, assicurati di documentare la tua API.

A proposito, è possibile prendere in considerazione il passaggio di un oggetto come parametro o l'utilizzo di altri modelli se l'elenco di parametri aumenta e si è costretti ad avere un numero enorme di sovraccarichi.

2

mentre siamo in tema:

Java 8 ha introdotto una nuova funzionalità, specificamente progettato per il supporto per più versioni di un Interface: metodi predefiniti. Supponiamo che la tua classe Manager stia implementando MyInterface. Quindi la prima versione dell'interfaccia sarebbe

public Interface MyInterface { 
    public boolean myMethod(Param1 param1); 
} 

quindi, in conformità con il mondo della tecnologia in continua evoluzione, i requisiti cambiano. quindi è necessaria una nuova firma per myMethod(). con la funzione di metodo di default, si potrebbe delegete la responsabilità di compatilibity indietro per l'interfaccia:

public interface MyInterface { 

    // v1 with default implementation 
    default boolean myMethod(Param1 param1) { 
     return myMethod(param1, null, null); 
    } 

    // new v2 - pure virtual 
    public boolean myMethod(Param1 param1, Param2 param2, Param3 param3); 
} 

Si può leggere di più su metodi predefiniti di interfaccia in Oracle tutorial on the subject

+0

Ti manca la parola chiave 'default' e' interface' è tutto in minuscolo. – Andreas

+0

risolto, grazie .. –

Problemi correlati