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


22

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

In un progetto ho sviluppato una classe "Note", con il suo attributo come proprietà: Title, Desctiption, CreateDate, 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ù è liberamente accoppiata. Questo è davvero un buon vantaggio in termini di modularità e riusabilità, più facile da modificare.
A proposito, se nel nostro contesto non è necessario (o addirittura senso) creare sottoclassi e tutte le funzioni necessarie sono correlate a quella classe, quanti metodi possiamo ulteriormente collegare?

Concordo sul fatto che avere più di 15 metodi, forse potrebbe essere necessaria una piccola riprogettazione.
Ma anche in quel caso, se la cancellazione di alcuni dei metodi o dell'ereditarietà non è un'opzione, quale sarebbe la strada giusta?


3
Gli umani sembrano avere una gamma dimenticata integrata. Una volta superate le sette opzioni, le prime iniziano a essere dimenticate. Quindi non dare alle persone più di 7 opzioni per interfaccia.
Martin York,

+ 1 @ Martin- 7 + o- 2
Morgan Herlocker,

Questa limitazione è solo per la memoria a breve termine. Altrimenti, come potremmo forse ricordare tutte quelle diverse lettere e parole? Scherzi a parte, se la classe verrà usata pesantemente, puoi pensarla come un mini-linguaggio e avere tutti i metodi di cui hai bisogno per esprimere tutto ciò che hai a che fare con esso.
Artem


Risposte:


30

Hai tutti i metodi di cui hai bisogno. Proverei a mantenere 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 dei super-metodi pazzi che devono essere sviluppati di più, non di meno. Non importa davvero quanti metodi di supporto privato hai. In effetti, se rimanessi al di sotto di 8 metodi in Java, potresti raggiungere il limite con una classe che aveva solo un costruttore, un 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 si occupi di questioni non correlate e che tu abbia un'interfaccia pubblica ragionevole con metodi facili da capire.


Corretto, ma se si tratta di una classe di utilità, fino a 10-15 va bene.
Sid,

1
@SidCool - Non sto dicendo che non li uso mai, ma le classi di utilità non sono davvero una buona pratica per cominciare. Di solito sono solo una mini classe divina che mette insieme un mucchio di preoccupazioni non correlate. Con questo in mente, una classe di utilità in realtà non dovrebbe esistere affatto, tanto meno con 15 metodi.
Morgan Herlocker,

1
La mia classe "Note" non è una classe di utilità. Rappresenta un oggetto business (una nota che può aggiungere commenti e descrizione a un documento). Tuttavia, concordo con ironcode sul pericolo delle classi di "utilità". Ci vengono in aiuto quando abbiamo fretta con le scadenze di consegna, ma penso che spesso ci sia una soluzione / un design migliore per loro.
Francesco,

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 composto di classi più piccole con responsabilità diverse.

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

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


8

Non c'è motivo (nella progettazione di OO) per avere solo così tanti metodi. Inoltre, non è vero che una classe con meno metodi sia meglio disaccoppiata.

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

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


Sono d'accordo, il numero di 15 era solo un'approssimazione derivata dalla lettura di quei libri di progettazione (come "Codice completo" di Steven McConnell, come esempio). In effetti, la classe String ha una miriade di metodi e tutti realizzati nella stessa entità.
Francesco,

@Luca: Il problema con alcuni di questi libri è che gli esempi sono spesso inventati e quindi più piccoli di molti esempi del mondo reale.
FrustratedWithFormsDesigner,

Esatto ... probabilmente per rendere più chiari i concetti e ampliare anche la base potenziale degli acquirenti ...
Francesco,

Voglio vedere qualsiasi tipo di controllo DataGrid o persino dell'interfaccia utente con solo 15 metodi. Se abbassi quelle classi in classi più piccole, l'interfaccia diventerebbe un incubo.
Falcon,

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 cambiato in una configurazione. Indipendentemente da cosa sia questo numero, è solo una bandiera per uno sviluppatore guardare una classe e vedere se c'è un problema, non che ci sia un problema.

Qualcosa che è un po 'più concreto potrebbe essere la regola 7 più / meno 2 . Questo afferma che la mente umana può contenere e comprendere tra 5 e 9 "oggetti" in memoria. Quando si legge una classe particolare, 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 si contano di accesso, mutator e le eventuali operazioni standard (ad esempio, toString(), hashCode(), e equals()in Java).

Le misure più pertinenti sarebbero il fan-in e il fan-out e le discussioni sull'accoppiamento e sulla coesione . L' unico principio responsabilità e separazione degli interessi dovrebbero essere applicate - una classe deve 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.


+1: la regola 7 + -2 è una regola da rispettare per quanto riguarda l'usabilità.
Morgan Herlocker,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.