È meglio caricare una classe con metodi o estendere la funzionalità dei membri in una sottoclasse locale?

4

Quale ti piace di più? Classe 1:

public class SearchClass
{
    public SearchClass (string ProgramName)
    { /* Searches LocalFile objects, handles exceptions, and puts results into m_Results. */ }

    DateTime TimeExecuted;
    bool OperationSuccessful;

    protected List<LocalFile> m_Results;
    public ReadOnlyCollection<LocalFile> Results
    {
        get { return new ReadOnlyCollection<LocalFile>(m_Results); }
    }

    #region Results Filters
    public DateTime OldestFileModified
    {
        get { /* Does what it says. */ }
    }

    public ReadOnlyCollection<LocalFile> ResultsWithoutProcessFiles()
    {
        return new ReadOnlyCollection<LocalFile> ((from x in m_Results
                                                   where x.FileTypeID != FileTypeIDs.ProcessFile
                                                   select x).ToList());
    }
    #endregion
}

Oppure classe # 2:

public class SearchClass
{
    public SearchClass (string ProgramName)
    { /* Searches LocalFile objects, handles exceptions, and puts results into m_Results. */ }

    DateTime TimeExecuted;
    bool OperationSuccessful;

    protected List<LocalFile> m_Results;
    public ReadOnlyCollection<LocalFile> Results
    {
        get { return new ReadOnlyCollection<LocalFile>(m_Results); }
    }

    public class SearchResults : ReadOnlyCollection<LocalFile>
        {
        public SearchResults(IList<LocalFile> iList) : base(iList) { }

        #region Results Filters
        public DateTime OldestFileModified
        {
            get { /* Does what it says. */ }
        }

        public ReadOnlyCollection<LocalFile> ResultsWithoutProcessFiles()
        {
            return new ReadOnlyCollection<LocalFile> ((from x in this
                                                       where x.FileTypeID != FileTypeIDs.ProcessFile
                                                       select x).ToList());
        }
        #endregion
    }
}

... con l'implicazione che OperationSuccessful è accompagnato da una serie di proprietà più interessanti su come l'operazione è andata, e OldestFileModified e ResultsWithoutProcessFiles () hanno anche molti più fratelli nella sezione Filtri risultati.

    
posta Calvin Fisher 07.03.2011 - 20:22
fonte

2 risposte

1

Come sempre, queste cose sono una questione di gusti. In questo caso, non sono pazzo della seconda soluzione per alcuni motivi:

  1. C'è sempre un piccolo onere intellettuale nel definire le classi e le loro relazioni. Non è chiaro quale vantaggio la classe nidificata fornisce oltre al codice di partizionamento. L'approccio di una classe è semplice e chiaro.
  2. Non sono pazzo di classi pubbliche nidificate. Ciò implica che dovrei essere in grado di istanziarlo al di fuori del contesto SearchClass che non ha molto senso.
  3. Ereditare raccolte generiche non è il mio preferito. Quando mi imbatto in questo corso, non è immediatamente chiaro che si tratta solo di un semplice% di% co_de. Non mi piace il passaggio in più di ricordare cosa c'è dietro la tenda.

Inoltre, potresti voler una sorta di metodo statico per creare il tuo ReadOnlyCollection<LocalFile> . Nel tuo esempio, la classe esegue l'elaborazione nel costruttore che non gli consente di fallire con garbo. L'unica opzione è lanciare un'eccezione. Se si utilizza un metodo statico, è possibile restituire null in caso di errore (o qualche altro schema di errore alternativo).

    
risposta data 08.03.2011 - 06:27
fonte
0

Seguo il principio KISS (Keep it simple, stupido) Quindi il primo a me è il più preferibile dei due. Non mi piacciono affatto le classi nidificate, inoltre so che avere molti metodi in una classe può essere abbastanza lungo a volte, ma per me è più semplice cercare quei metodi che cercare in più sottoclassi.

    
risposta data 08.03.2011 - 15:31
fonte

Leggi altre domande sui tag