Quando dovrei refactoring una classe privata in una classe pacchetto-privata?

1

Quando ho iniziato a implementare una classe nel mio sistema (chiamiamola A ), mi sono reso conto che avevo bisogno di qualche tipo di oggetto che facesse qualcosa. Quindi avevo bisogno di una nuova classe (chiamiamola B ), ma l'ho resa un private static class di A .

Ora, B è sempre usato solo da A , ma A è cresciuto molto più grande. Compreso il codice per B , è lungo 320 LoC.

La domanda è: dovrei spostare B al di fuori di A , in una classe package-private separata? È sempre usato solo da A , ma dal momento che A sta diventando grande penso che dovrei dividerlo in parti più piccole.

    
posta Aviv Cohn 24.09.2014 - 01:27
fonte

2 risposte

1

La dimensione della classe A non ha molta importanza, purché segua i seguenti criteri:

  1. È responsabile solo di una cosa
  2. Raggruppa funzionalità logicamente correlate

Finché i criteri sono soddisfatti, non è necessario dividere la funzionalità in classi separate. La difficoltà è nel determinare se la classe è effettivamente responsabile di più di una cosa.

Tendo ad evitare le classi private mentre ingombrano il codice. L'unica ragione per cui creo una classe privata di solito è per un contenitore di dati per dati temporanei che viene utilizzato solo da quella classe. In praticamente ogni altra circostanza vorrei creare classi separatamente l'una dall'altra.

    
risposta data 24.09.2014 - 03:01
fonte
0

Cerco di evitare le classi interne in generale a meno che non siano semplici lambda, ascoltatori con una o due righe di codice, ecc.

Una volta che una classe interiore ha una vita propria ed esegue funzioni più complesse, la refactoring nella sua classe di alto livello. Userò un'interfaccia standard o la creerò per la classe che ha usato per racchiuderla ( A ). Quindi costruisco la classe B e passa un riferimento all'interfaccia che A implementa e viene utilizzato da B .

Sebbene A e B siano strettamente accoppiati, probabilmente non è necessario che lo siano. Separare quell'accoppiamento e utilizzare interfacce e riferimenti piuttosto che un puntatore / riferimento% implicito di classe esterna% co_de significa ora che this è un passo più vicino alla riusabilità. C'è una astrazione tra di loro.

Spesso la ragione per introdurre un'altra classe è che la classe che racchiude deve svolgere un lavoro aggiuntivo che non può fare da sé. È probabile che tale lavoro aggiuntivo (secondo la mia esperienza) violi il principio di responsabilità singola . Spostarlo in una classe interiore è un passo per risolverlo, ma è (secondo me) una soluzione non ottimale. Refactoring come ho detto sopra risolverà i problemi di accoppiamento stretto e di "responsabilità multipla".

Un ultimo motivo per dividere in più classi di primo livello è che riduce i file di origine. Questo non ha nulla a che fare con i principi OOP ed è puramente estetico.

    
risposta data 24.10.2014 - 17:06
fonte

Leggi altre domande sui tag