Gli oggetti con molti campi possono essere suddivisi? [duplicare]

9

Quando ho un oggetto che ha molti campi è meglio averli tutti come campi o cercare di trovare raggruppamenti logici come oggetti propri e renderli quei campi?

Credo che si tratti di un male più grande, di troppi oggetti o di troppi campi in un oggetto.

Meno oggetti, più campi:

public class LotsOfFields Object {

    private Foo foo;
    private Bar bar;
    private Baz baz;
    private Dog dog;
    private Cat cat;
    private Goat goat;

    // Getters and setters...

}

Altri oggetti, meno campi:

public class LessFields Object {

    private ClicheMetaSyntacticVariables vars;
    private Animals animals;

    // Getters and setters...

}

public class ClicheMetaSyntacticVariables {

    private Foo foo;
    private Bar bar;
    private Baz baz;

    // Getters and setters...

}

public class Animals {

    private Dog dog;
    private Cat cat;
    private Goat goat;

    // Getters and setters...

}

Per inciso, se l'approccio "più oggetti" è migliore, è meglio avere le classi come membri della classe originale (supponendo che non siano mai state usate altrove) o che vanifichi lo scopo di non ingombrare un oggetto?

Edit to defend my question not being a duplicate: This is about a more specific issue than "what is the purpose of a class" and to me that alone is enough. To go on, I am really talking more about what makes a more readable/usable class, I'll take the blame for not specifying that though.

    
posta Captain Man 26.08.2015 - 21:10
fonte

4 risposte

17

I guess it comes down to which is the greater evil, too many Objects or too many fields in an Object.

Dipende.

Il male maggiore è che le classi fanno troppe cose o troppe classi per una cosa.

Nel tuo esempio, sembra che tu abbia tre distinti raggruppamenti che non hanno nulla a che fare l'uno con l'altro. Quindi quelli non dovrebbero essere la stessa classe. Ma se tutti fossero molto correlati e interagissero, allora c'è meno problema averli nella stessa classe.

E ogni esempio sarà diverso. Non esiste una politica universale "fai questo in ogni caso".

Fondamentalmente, un buon design dovrebbe guidare i membri di ogni classe. Ad esempio, non dovresti progettare le tue classi basandoti su un numero arbitrario massimo di 5 oggetti / classe, per esempio.

    
risposta data 26.08.2015 - 21:24
fonte
5

La cifra importante è la complessità, non il numero di oggetti / membri puri. Puoi avere una classe semplice con circa 20 membri (che è già molto puzzolente, però), e puoi avere una classe troppo complessa con solo cinque.

In ogni caso, il solo raggruppamento di membri per tipo non aiuterà. Le domande sono: quali membri devono lavorare insieme ? E quali servizi secondari possono fornire? Queste domande sono importanti, perché vuoi che i tuoi piccoli oggetti forniscano buone astrazioni che semplificano realmente le cose nella classe che li unisce, non solo i contenitori per i membri dei tuoi dati.

( foo.bar.baz è un codesmell in sé e per sé!)

    
risposta data 26.08.2015 - 21:20
fonte
2

Chiediti questo, se separi i membri in classi separate, le classi stanno svolgendo qualche lavoro indipendente significativo? Se le classi sono co-dipendenti e non possono fare nulla senza l'accesso agli altri membri, è probabilmente una cattiva idea separarle.

D'altra parte, se una classe può significativamente ridurre il carico di lavoro dell'altra classe o essere utilizzata indipendentemente dall'altra classe, allora potresti prendere in considerazione la possibilità di separarle.

    
risposta data 27.08.2015 - 20:16
fonte
0

Come sempre, dipende. Non vedo perché sarebbe sbagliato. Ho avuto classi con tanti campi, forse anche di più, in un progetto che ha scartato i dati da un sito Web, quindi una pagina era un oggetto (molti dati + alcuni valori calcolati per accelerare le cose attraverso più sessioni). Erano perfettamente imparentati tra loro.

Se i campi contenuti in una classe hanno poco a che fare l'uno con l'altro, potrebbe essere un segno di cattiva progettazione.

È una bandiera rossa, certamente, ma una bandiera rossa non ha mai ucciso nessuno da sola, giusto? Se ha senso, provaci.

    
risposta data 26.08.2015 - 22:07
fonte

Leggi altre domande sui tag