OO: le classi grandi sono accettabili? [duplicare]

7

Nonostante molti anni nel settore IT, continuo a lottare con il design OO. Un problema particolare che mi sembra di finire è quello di classi grandi, spesso contenenti molte centinaia di righe di codice.

Il mondo OO parla molto di SRP, e io potrei sostenere che queste grandi classi con cui finisco gestiscono ciascuna una singola responsabilità. La natura complessa dell'app (un sistema di elaborazione dati scientifico) significa che una di queste responsabilità richiede un sacco di codice! Per esempio. una classe potrebbe avere un solo metodo pubblico Calculate() , ma potrebbero esserci 15-20 o più metodi privati per supportare questa operazione.

Dove possibile estrarrò i metodi in classi separate per la riutilizzabilità, ma spesso c'è poco o nessun margine per questo. Una parte di me dice che dovrei dividere queste grandi classi solo per migliorare la leggibilità (ad esempio raggruppando metodi simili nelle loro classi), ma i tempi che ho fatto mi sembrano un esercizio sprecato - tutto quello che ho fatto è diffondere i metodi in giro, ha creato più dipendenze di classe e ha reso le cose un po 'più difficili da trovare per altri sviluppatori.

Ma poi leggo articoli in cui gli sviluppatori parlano di come tutte le loro classi siano abbastanza piccole da adattarsi allo schermo senza scorrere, e temo che sto facendo qualcosa di sbagliato! In un precedente lavoro, ho lavorato su un sistema in cui era stato OO all'estremo, ed era comune vedere classi contenenti un solo metodo, spesso con non più di una o due righe di codice. Personalmente ho trovato questo difficile trovare il modo di aggirare il codice base e di eseguire il debug, e per questo motivo (e il numero assoluto di classi) potrei sostenere che diventa più difficile da mantenere, non l'obiettivo di un buon design OO. Immagino sia dovuto al gusto personale.

Quindi, è accettabile avere grandi classi o puoi suggerire altri modi con cui potrei gestirmi?

    
posta Andrew Stephens 20.06.2013 - 09:47
fonte

3 risposte

11

have a single public method Calculate(), but there could be 15-20 or more private methods to support this operation.

Questo non mi sembra molto "grande", a patto che i tuoi 15-20 metodi abbiano dimensioni ragionevoli. Almeno, non in generale. Tuttavia, per scoprire se le tue lezioni hanno un ambito ragionevole, dovrai mostrarle a un altro sviluppatore esperto e discuterne con lui.

But then I read articles where developers talk about how all their classes are small enough to fit on the screen without scrolling, and I worry that I'm doing something wrong!

Non preoccuparti: finché i tuoi metodi sono abbastanza piccoli da adattarsi allo schermo. Ok, alcune persone, me compreso, pensano che sia ancora troppo lungo. Se si applica il principio SRP e SLA ("single level of astrstraction", si veda, ad esempio, qui ) a < em> metodi , in genere diventeranno più brevi di 20 righe.

La cosa più importante da porsi è: soffri di problemi di manutenibilità? Hai spesso bisogno di giorni per trovare un bug specifico perché hai difficoltà a isolare il problema a causa della complessità del tuo codice? Se la risposta è "sì", allora le tue classi sono probabilmente troppo grandi. Se la risposta è "no", non preoccuparti delle dimensioni delle tue classi solo perché "leggi alcuni articoli di alcuni esperti OO". Trova ciò che funziona per il tuo caso.

    
risposta data 20.06.2013 - 10:20
fonte
2

Alcune classi sono inevitabilmente più grandi di altre, quindi questo non avrebbe immediatamente attivato alcun campanello d'allarme. Tuttavia, potresti voler rivedere il tuo design di classe se una delle seguenti condizioni è vera:

  • Hai una classe che forma l'intero (o gran parte del programma)
  • Ci sono grossi pezzi di codice all'interno della classe relativi a a preoccupazione specifica
  • Il codice simile è presente in altre classi
  • Gli stessi parametri con i tipi di dati di base vengono passati in giro dal metodo al metodo, ad es.

DoSomethingToThis(string name, int rating, datetime when, bool flag) {...}

DoSomethingToThat(string name, int rating, datetime when, bool flag) {...}

DoSomethingToTother(string name, int rating, datetime when, bool flag) {...}

A seconda del tuo linguaggio di implementazione, potrebbero esserci anche altri modi per suddividere il codice, ad es. code region e namespace.

    
risposta data 20.06.2013 - 10:31
fonte
2

Scrivi test per mantenere il tuo codice? Altrimenti, scoprirai che il tuo codice diventerà probabilmente molto più atomico. Tuttavia, mi concentrerei davvero su ciò che dice "Doc Brown" in merito alla manutenibilità. Questa è la cosa fondamentale.

Una grande classe con molti piccoli metodi è probabilmente più facile da utilizzare con molte piccole classi ognuna con un solo metodo. Recentemente ho fatto una riscrittura al lavoro prendendo una grande classe di Dio di quasi 9000 righe di codice e dividendola. Ci sono ancora classi che contengono quasi mille linee di codice. Sembra piuttosto terribile quando viene scritto in questo modo, ma al lavoro stiamo trovando molto più facile trovare e capire le cose. Ci sono più classi ora e più cartelle ma è più ordinato.

C'è un divario tra teoria e pratica. Quali aspetti e suoni, in teoria, e in genere dimostrati con un semplice esempio, non funzionano se applicati a una grande applicazione reale.

    
risposta data 20.06.2013 - 11:38
fonte