Lasciatemi fare un esempio dell'uso di classi nidificate che potrebbero chiarire quando questo tipo di architettura è appropriato. Di recente avevo bisogno di generare una tabella HTML estraendo colonne selezionate da una tabella di dati e "ruotandole" in modo che le righe diventassero colonne e viceversa.Nel mio caso, ci sono state due operazioni fondamentali: la rotazione dei dati e la generazione di un output piuttosto complesso (non stavo solo mostrando i dati: ogni colonna di dati/riga della tabella era soggetta a operazioni per estrarre il titolo, generare tag immagine, impostare link, ecc. quindi usare un pivot SQL non aveva proprio ragione).
Dopo un tentativo iniziale di creare una classe per eseguire l'intera operazione, ho riconosciuto che molti dei dati/metodi sono stati suddivisi in tre partizioni distinte: elaborazione intestazione, elaborazione riga e pivot. Così, ho deciso che un approccio migliore sarebbe stato quello di incapsulare la logica per "intestazione" e "riga" in classi separate e annidate. Ciò mi ha permesso di separare i dati detenuti da ciascuna riga e programmare le operazioni di pivot in modo molto pulito (chiamando un oggetto riga separato per ogni colonna nella tabella dati). Alla fine delle operazioni pivot, ho generato l'output chiamando l'oggetto header e quindi ogni oggetto row a sua volta per generare il suo output di nuovo alla classe principale.
Le classi separate non erano appropriate perché A) le classi nidificate avevano bisogno di alcuni dati dalla classe master e B) l'elaborazione era molto specifica e non utile altrove. La semplice programmazione di una grande classe era semplicemente disordinata a causa della confusione che circonda termini come "colonna" e "riga" che differivano a seconda che si stesse parlando di dati o di output HTML. Inoltre, questo era un lavoro insolito in quanto stavo generando HTML nella mia classe di business, quindi volevo separare la pura business logic dalla generazione dell'interfaccia utente. Alla fine, le classi nidificate hanno fornito il perfetto equilibrio, quindi, di incapsulamento e condivisione dei dati.
fonte
2009-03-26 13:24:49
È vero? Dai miei test, la classe Y non può accedere ai dettagli della classe X. Come sarebbe possibile? – Nitax
Nevermind, appena trovato http://blogs.msdn.com/b/oldnewthing/archive/2006/08/01/685248.aspx – Nitax