¿Cuál es el límite para el número de métodos de una clase?

22

En los diferentes libros de diseño que leí, a veces se pone gran énfasis en la cantidad de métodos que debe tener una clase (considerando un lenguaje OO, como java o C #, por ejemplo). A menudo, los ejemplos reportados en esos libros son muy claros y simples, pero rara vez cubren un caso "serio" o complejo.
Sin embargo, el rango parece estar entre 5 y 8.

En un proyecto desarrollé una clase "Note", con su atributo como propiedades: Título, Desctiption, CreateDate, etc.
Luego, algunos métodos básicos como: getRelations (si la nota está asignada a diferentes documentos), getExpiryDate, ect.

Sin embargo, en el desarrollo de la aplicación, se requerían más funcionalidades y, por lo tanto, más métodos.

Sé que cuantos menos métodos tenga una clase, más vagamente acoplada estará. De hecho, es una buena ventaja en términos de modularidad y reutilización, más fácil de editar.
Por cierto, si en nuestro contexto no hay necesidad (o incluso sentido) de crear subclases y todas las funciones necesarias están relacionadas con esa clase, ¿cuántos métodos podemos adjuntar?

Estoy de acuerdo en que tener más de 15 métodos, entonces quizás se requiera un pequeño rediseño.
Pero incluso en ese caso, si eliminar algunos de los métodos o la herencia no es una opción, ¿cuál sería la forma correcta?

Francesco
fuente
3
Los humanos parecen tener un rango de olvido incorporado. Una vez que pasas las siete opciones, las primeras comienzan a olvidarse. Por lo tanto, no le dé a las personas más de 7 opciones por interfaz.
Martin York
+ 1 @ Martin- 7 + or- 2
Morgan Herlocker
Esta limitación es solo para la memoria a corto plazo. De lo contrario, ¿cómo podríamos recordar todas esas letras y palabras diferentes? En serio, si la clase se va a usar mucho, puedes pensar en ella como un mini-idioma y tener tantos métodos como necesites para expresar lo que tengas que ver con ella.
artem

Respuestas:

30

Ten tantos métodos como necesites. Intentaría reducir el número de métodos públicos a esa regla 5-8 si es posible. Honestamente, la mayoría de las personas tienen el problema opuesto en el que tienen súper métodos locos que necesitan ser explotados más, no menos. Realmente no importa cuántos métodos de ayuda privada tenga. De hecho, si permaneció por debajo de 8 métodos en Java, podría alcanzar el límite con una clase que solo tuviera un constructor, un toString y el getter / setter para 3 propiedades ... que no es exactamente una clase robusta. La conclusión es que no se preocupe por cuántos métodos tiene su clase. Preocúpese por asegurarse de que su clase no tome preocupaciones no relacionadas, y que tenga una interfaz pública razonable que tenga métodos fáciles de entender.

Morgan Herlocker
fuente
Correcto, pero si es una clase de utilidad, hasta 10-15 está bien.
Sid
1
@SidCool: no digo que nunca los use, pero las clases de utilidad no son realmente una mejor práctica para empezar. Por lo general, son solo una mini clase de dios que reúne un montón de preocupaciones no relacionadas. Con eso en mente, una clase de utilidad realmente no debería existir en absoluto, y mucho menos con 15 métodos.
Morgan Herlocker
1
Mi clase "Nota" no es una clase de utilidad. Representa un objeto comercial (una nota que puede agregar comentarios y descripción a un documento). Sin embargo, estoy de acuerdo con ironcode sobre el peligro de las clases de "utilidad". Vienen en ayuda cuando tenemos prisa con nuestros plazos de entrega, pero creo que a menudo hay una mejor solución / diseño para ellos.
Francesco
13

La respuesta es realmente simple: ponga todo en una clase que pertenezca a sus responsabilidades, pero tenga cuidado al asignar responsabilidades.

A veces una clase grande es un compuesto de clases más pequeñas con diferentes responsabilidades.

En general, trato de dividir las responsabilidades en clases más pequeñas cuando la clase se vuelve difícil de manejar en su uso o mantenimiento. Raramente tengo clases que tengan más de 500 líneas. Mis clases más grandes tienen aproximadamente 1.5k locs.

Simplemente no puede establecer una regla general como "una clase debería tener entre n y m métodos".

Halcón
fuente
8

No hay ninguna razón (en el diseño OO) para tener solo tantos métodos. Tampoco es cierto que una clase con menos métodos esté mejor desacoplada.

Mire la clase java.lang.String, por ejemplo. Muchos métodos, porque hay tantas cosas que uno puede hacer con una cadena. Sin embargo, no está fuertemente acoplado.

Me pregunto por qué un número mágico como 15 podría separar el diseño bueno y el malo. No, no es tan fácil.

Ingo
fuente
Estoy de acuerdo, el número de 15 fue solo una aproximación derivada de la lectura de los libros de diseño (como "Code Complete" de Steven McConnell, como ejemplo). De hecho, la clase String tiene una miríada de métodos y todos están relacionados con la misma entidad.
Francesco
@Luca: El problema con algunos de esos libros es que los ejemplos a menudo son artificiales y, por lo tanto, más pequeños que muchos ejemplos del mundo real.
FrustratedWithFormsDesigner
Exactamente ... probablemente para aclarar los conceptos al máximo y ampliar la base potencial de los compradores también ...
Francesco
Quiero ver cualquier tipo de DataGrid o incluso control de IU con solo 15 métodos. Si divide esas clases en otras más pequeñas, la interfaz se convertiría en una pesadilla.
Falcon
6

En PMD, el comportamiento predeterminado de la regla TooManyMethods es identificar y marcar las clases con 10 o más métodos como posibles errores. Sin embargo, este es solo un número arbitrario. Se cambia fácilmente en una configuración. Independientemente de cuál sea este número, es solo una señal para que un desarrollador vea una clase y vea si hay un problema, no es que haya un problema con él.

Algo que es un poco más concreto podría ser la regla 7 más / menos 2 . Esto afirma que la mente humana puede retener y comprender entre 5 y 9 "objetos" en la memoria. Al leer una clase en particular, los objetos probablemente serían los métodos y campos que conforman esa clase. Sin embargo, las clases con frecuencia tienen más de 9 campos y métodos, incluso si no se cuenta descriptores de acceso, mutators y cualquier operación estándar (por ejemplo, toString(), hashCode(), y equals()en Java).

Las medidas más relevantes serían de fan-in y fan-out y discusiones de acoplamiento y cohesión . Se debe aplicar el principio de responsabilidad única y la separación de preocupaciones : una clase debe hacer o representar una cosa y una sola cosa. Estos son mucho mejores que tratar de asignar números al número máximo / mínimo de métodos al evaluar un diseño o implementación.

Thomas Owens
fuente
+1: la regla 7 + -2 es una regla para vivir en lo que respecta a la usabilidad.
Morgan Herlocker