Qual è il limite al numero di metodi di una classe?

20

In diversi libri di design che ho letto, a volte viene data grande enfasi al numero di metodi che una classe deve avere (considerando un linguaggio OO, come java o C # per esempio). Spesso gli esempi riportati in questi libri sono molto accurati e semplici, ma raramente coprono un caso "serio" o complesso.
Tuttavia, il range sembra essere compreso tra 5 e 8.

In un progetto ho sviluppato una classe "Note", con il suo attributo come proprietà: Titolo, Descizione, Crea Data, ecc.
Quindi alcuni metodi di base come: getRelations (se la nota è assegnata a documenti diversi), getExpiryDate , ect.

Tuttavia, procedendo nello sviluppo dell'applicazione, erano necessarie più funzionalità e, quindi, più metodi.

So che meno metodi ha una classe, più è accoppiata. Questo è davvero un buon vantaggio in termini di modularità e riusabilità, oltre che più facile da modificare.
A proposito, se nel nostro contesto non è necessario (o nemmeno senso) creare sottoclassi e tutte le funzioni necessarie sono correlate a quella classe, quanti metodi possiamo aggiungere ulteriormente?

Sono d'accordo sul fatto che avere più di 15 metodi, quindi forse un po 'di re-design potrebbe essere richiesto.
Ma anche in questo caso, se eliminare alcuni dei metodi o dell'ereditarietà non è un'opzione, quale sarebbe il modo corretto?

    
posta Francesco 29.08.2011 - 15:52
fonte

4 risposte

28

Hai tutti i metodi che cerchi. Vorrei provare a mantenere basso il numero di metodi pubblici a quella regola 5-8 se possibile. Onestamente, la maggior parte delle persone ha il problema opposto in cui hanno pazzi super-metodi che devono essere scomposti di più, non di meno. Non importa quanti metodi di helper privati hai. Infatti, se rimanessi al di sotto di 8 metodi in Java potresti raggiungere il limite con una classe che aveva solo un costruttore, una toString e il getter / setter per 3 proprietà ... che non è esattamente una classe robusta. La linea di fondo è, non preoccuparti di quanti metodi è la tua classe. Preoccupati di assicurarti che la tua classe non assuma preoccupazioni non correlate e che tu disponga di un'interfaccia pubblica ragionevole con metodi facili da capire.

    
risposta data 29.08.2011 - 16:04
fonte
13

La risposta è davvero semplice: metti tutto in una classe che appartiene alle sue responsabilità, ma fai attenzione quando assegni le responsabilità.

A volte una grande classe è un insieme di classi più piccole con responsabilità diverse.

In generale, cerco di dividere le responsabilità in classi più piccole quando la classe diventa ingombrante nel suo utilizzo o nella manutenzione. Raramente ho classi che sono più lunghe di 500 linee. Le mie classi più grandi hanno locus approssimativamente 1.5k.

Semplicemente non puoi stabilire una regola generale come "una classe dovrebbe avere tra i metodi n e m".

    
risposta data 29.08.2011 - 16:02
fonte
8

Non c'è alcun motivo (nel design OO) per avere solo tanti metodi. Non è anche vero che una classe con meno metodi è meglio disaccoppiata.

Guarda la classe java.lang.String, per esempio. Un sacco di metodi, perché ci sono così tante cose che si possono fare con una stringa. Tuttavia non strettamente accoppiato.

Mi chiedo perché un numero magico come 15 possa separare il design buono e cattivo. No, non è così facile.

    
risposta data 29.08.2011 - 16:06
fonte
6

In PMD, il comportamento predefinito della regola TooManyMethods consiste nell'identificare e contrassegnare le classi con 10 o più metodi come potenziali errori. Questo è solo un numero arbitrario, però. È facilmente modificabile in una configurazione. Indipendentemente da che cosa sia questo numero, è solo una bandiera per uno sviluppatore per guardare una classe e vedere se c'è un problema, non che ci sia un problema con esso.

Qualcosa che è un po 'più concreto potrebbe essere la 7 più / meno 2 regola . Questo afferma che la mente umana può contenere e comprendere tra 5 e 9 "oggetti" nella memoria. Durante la lettura di una particolare classe, gli oggetti sarebbero molto probabilmente i metodi e i campi che compongono quella classe. Tuttavia, le classi hanno spesso più di 9 campi e metodi, anche se non vengono conteggiati accessor, mutatori e qualsiasi operazione standard (ad esempio, toString() , hashCode() e equals() in Java).

Le misure più rilevanti sarebbero di fan-in e fan- fuori e discussioni su accoppiamento e la coesione . Il principio di responsabilità singola e separazione di preoccupazioni dovrebbe essere applicato - una classe dovrebbe fare o rappresentare una cosa e una cosa sola. Questi sono molto meglio che cercare di assegnare numeri al numero massimo / minimo di metodi quando si valuta un progetto o un'implementazione.

    
risposta data 29.08.2011 - 16:17
fonte

Leggi altre domande sui tag