Come consegnare 3 diversi parametri alla classe in un metodo (2 su 3 sono opzionali)

1

Ho bisogno del tuo aiuto per implementarlo bene e bene. È un problema piuttosto semplice. Posso risolverlo ma ho bisogno di aiuto su come farlo meglio.

La mia classe ha una logica di lavoro che utilizza tre parametri. Li ottiene da un'altra classe. Il problema è:

  1. il primo parametro è enum (è richiesto)

  2. il secondo parametro è un altro enum (è opzionale - esiste la possibilità che questo parametro non esista)

  3. il terzo parametro è vettore di altre enumerazioni (è facoltativo - esiste la possibilità che questo parametro non esista).

Come gestire questi parametri nella mia classe?

Qualche idea?

Mi piacerebbe ottenere questi parametri in un unico metodo, ad es. updateParameters(...) .

Forse dovrei avere metodi sovraccaricati per ogni possibilità, ma non è carino, immagino. Non riesco ad avere un contenitore con parametri perché ne ho diversi tipi.

    
posta pawell55555 27.01.2014 - 14:41
fonte

2 risposte

3

Qui ci sono tre soluzioni sensate:

  1. Puoi passarli come parametri al tuo costruttore, il primo parametro è il parametro richiesto, o ..
  2. Potresti creare getter e setter per fornire questi parametri in seguito, o ..
  3. Potresti passare una mappa contenente valori di proprietà.

Passaggio al costruttore

Il passaggio al costruttore indica che, mentre facoltativo, devono essere resi noti immediatamente dopo la costruzione dell'istanza. Se questo non è il tuo caso, lo eviterei del tutto poiché A) potresti non avere immediatamente queste informazioni al momento dell'inizializzazione e B) vuoi trasmettere l'uso di una classe nel miglior modo possibile e quindi non c'è motivo di limitare quando non è necessario .

Uso di getter e setter

Per me almeno, l'uso di getter e setter mi dice che stai usando un parametro opzionale. Pertanto, non mi sento obbligato a fornire un valore solo per assicurarmi che ne venga fornito uno. Questo è meglio se questi valori sono veramente opzionali, tuttavia, e l'impostazione predefinita di un parametro funzionerà correttamente. Se pensi che il chiamante preferisca impostarlo su qualcosa (nonostante sia facoltativo), dovresti probabilmente passare al costruttore.

Tieni presente che dovresti essere pronto a utilizzare getter e setter solo se sei disposto a consentire modifiche in qualsiasi punto dell'utilizzo di un'istanza. Con questo voglio dire che dovresti impostare i parametri usando un setter, call execute, quindi modifica tale parametro in un secondo momento e richiama l'esecuzione una seconda volta, dovrebbe funzionare come previsto, utilizzando qualsiasi valore al momento impostato. Se non puoi garantire questo, dovresti non usare getter e setter (usa il passaggio al metodo di costruzione sopra).

Inoltre, per quanto riguarda il tuo vettore di enumerazioni, considera la possibilità di aggiungere un metodo "aggiungi" che prende un singolo valore enum o un vettore e lo aggiunge al suo vettore enum interno. Questo è anche comodo se hai un valore in modo da non dover creare un vettore semplicemente per aggiungere nuovi valori.

Mappa delle proprietà

Una mappa delle proprietà è una buona idea se ti vedi a dover serializzare questi valori su un database o su un file da qualche parte. È anche utile se pensi che le proprietà passate possano variare in modo significativo. Generalmente preferisco evitare questo metodo, tuttavia tendo ad usarlo quando ho a che fare con proprietà che la mia classe non deve avere familiarità con ma sono comunque importanti per le sottoclassi. Un esempio di questo è se dovessi istanziare una connessione al database e non ho bisogno di conoscere tutte le proprietà che possono riguardare quella particolare connessione.

Conclusione

Spero che questo ti dia un inizio. In generale, provo a usare getter e setter per tutti i parametri facoltativi, se possibile. Tutto ciò che deve essere necessario immediatamente dopo la creazione di una nuova istanza (predefinita o meno) deve essere assolutamente nel costruttore.

Puoi anche mescolare e abbinare queste tecniche. Anche l'impressione che do al chiamante a quel punto sarebbe un mix. In altre parole, se inserisco parametri nel costruttore e fornisco anche setter e getter, il messaggio che voglio passare è "Questi parametri dovrebbero essere noti immediatamente perché non hanno impostazioni predefinite adeguate, tuttavia è possibile modificarle in un secondo momento". Se utilizzo la mappa delle proprietà con getter e setter, il messaggio che voglio passare è "Alcuni di questi parametri sono statici e opzionali, mentre altri sono dinamici e possono contenere più informazioni di quelle che questa classe può gestire."

Modifica: non sono sicuro di cosa intendi per updateParameters . Se tutti questi parametri potrebbero cambiare da un momento all'altro, dovresti prendere in considerazione la creazione di un'istanza completamente nuova ogni volta. Se solo alcuni parametri possono cambiare, allora puoi usare getter e setter e cambiare qualsiasi parametro rispetto a prima.

    
risposta data 27.01.2014 - 15:16
fonte
3

Come regola generale quando si crea un'enumerazione, alcuni valori vengono lasciati per NONE (in genere 0). In casi simili al tuo, questo valore viene passato per indicare che nessun altro valore suite. L'aggiunta di tale valore alle tue enumerazioni risolverà il problema con i parametri opzionali.

In caso di vettori di enumerazione, puoi sempre passare in un vettore vuoto.

Non prenderei in considerazione metodi di overload per casi diversi a meno che questi casi non richiedano una gestione completamente diversa. Anche in questo caso potresti prendere in considerazione un metodo pubblico con tutti i parametri e quindi creare metodi privati per gestire casi specifici in base a parametri facoltativi.

    
risposta data 27.01.2014 - 14:55
fonte

Leggi altre domande sui tag