Oggetto Java contenente variabili membro non correlate [duplicato]

0

Spesso finisco con metodi con un numero elevato di argomenti (fino a 5 argomenti). per ex -

public void doSomething(obj1, obj2, obj3, obj4, obj5)

da obj1 a obj5 non sono correlati tra loro

Ho pensato di creare un oggetto più grande obj contenente obj1 a obj5 quindi passare solo obj oggetto che è -

public void doSomething(obj)

Ma obj è solo un oggetto conveniente qui e non deve avere obj1 a obj5 come variabili membro. Va bene usare un oggetto così conveniente o c'è qualche altro approccio che posso sfruttare?

Aggiornamenti

Per rispondere a SRP, il metodo doSomething chiama alcuni altri metodi che sono responsabili del loro funzionamento. Quindi doSomething ha l'aspetto di -

public void doSomething(obj1, obj2, obj3, obj4, obj5) {
  doSomethin1(obj1)
 .doSomethin2(obj2)
 .doSomethin3(obj3)
 .doSomethin4(obj4)
 .doSomethin5(obj5) 
}

Stavo concatenando e chiamando questi metodi singolarmente nei test, ma a me sembra una ripetizione del codice e ho deciso di creare un metodo invece che prende tutti gli argomenti richiesti. Ma con questo approccio ero perplesso di dover passare agli argomenti al metodo doSomething

    
posta Tarun 28.09.2017 - 10:37
fonte

4 risposte

5

Consiglierei di creare una classe di oggetti solo nei casi in cui l'aggregazione degli elementi rappresenta una cosa che puoi nominare, il che implica un nome utile per la nuova classe.

Come dici tu gli argomenti non sono correlati, non andrei per una lezione aggregata.

Non penso che migliori la leggibilità, confrontando le due versioni:

// not nice, but OK
doSomething(a, b, c, d, e);

// only makes things more complicated
DoSomethingArgs args = new DoSomethingArgs(a, b, c, d, e);
doSomething(args);

Ma avere un metodo con così tanti argomenti potrebbe implicare che il metodo fa troppe cose e potrebbe essere rifatto a parti più piccole e più focalizzate, avendo bisogno di meno argomenti (ricorda il principio di responsabilità singola?).

    
risposta data 28.09.2017 - 14:06
fonte
2

Obj1 to obj5 è veramente "non correlato tra loro" quando questo metodo ha bisogno di tutti loro insieme?

Se consideri questo per un caso specifico, allora penso che capirai molto spesso che quegli oggetti sono, di fatto, concettualmente correlati. Forse non tutti, forse solo tre su cinque.

Ma poi, l'oggetto "convenienve" per tenere insieme quegli oggetti correlati avrà un significato, e sarà il posto naturale per alcuni metodi per trattare quegli oggetti correlati.

In effetti, potresti finire per spostare doSomething () in quella classe e chiamare

objectContaintingObj1ToObj3.doSomething(obj4, obj5)
    
risposta data 28.09.2017 - 10:52
fonte
1

La domanda è piuttosto astratta. C'è un odore di codice nel conteggio dei parametri, ma non significa che sia un codice sbagliato.

Inoltre, non significa che l'altra direzione estrema - imposta tutti i parametri in un singolo oggetto parametro - sia la risposta giusta (anche se potrebbe essere).

Quindi, la risposta che offro è che mentre tu dici che gli oggetti non sono correlati tra di loro c'è potenzialmente un'astrazione significativa per il legame di due o più di questi insieme - anche se individualmente non sono correlati.

Si noti che sto guardando questo dal punto di vista di un programmatore client che consuma piuttosto che come un dettaglio di implementazione della firma del metodo.

Se ci sono chiamate simili nelle vicinanze di questa chiamata:

doSomething(obj1, obj2, obj3, obj4, obj5)

come:

doSomethingElse(obj1, obj3, obj6)

Questo suggerimento è un'astrazione identificabile che proviene dal legame di obj1 & obj3 insieme, e, forse questa astrazione dovrebbe essere resa manifesta.

Quello che stiamo cercando di fare è ridurre l'onere per il cliente che è il programmatore che consuma (forse tu). Il minor numero di elementi che il programmatore deve affrontare, tanto meglio e meno incline agli errori. Quindi, se riesci a legare alcuni di questi insieme in un'astrazione che ridurrà il numero di articoli che il consumatore deve affrontare.

Tuttavia, l'introduzione di un'altra astrazione (ad esempio per mantenere tutti i parametri), specialmente se questa astrazione verrebbe utilizzata solo in un punto, non aiuta a raggiungere questo obiettivo. Dovresti tenere gli occhi aperti per un'astrazione significativa (specialmente se ne puoi usare uno più di una volta), ma se non lo trovi, allora è quello ..

    
risposta data 28.09.2017 - 19:07
fonte
0

I thought of creating a Bigger Object obj containing obj1 to obj5 then pass only obj object

Invece di fare ciò, considera il refactoring Sostituisci metodo con oggetto metodo . Crea una classe che ha queste proprietà (finali) e crea il metodo doSomething lì. Se hai altri metodi che prendono gli stessi parametri o un sottoinsieme di essi, anche quelli possono andare lì. Le classi nidificate private sono una buona opzione qui se questa è tutta interna alla classe corrente.

    
risposta data 28.09.2017 - 19:31
fonte

Leggi altre domande sui tag