c# - una - un espacio de nombres no puede contener directamente miembros como campos o métodos
Número ideal de clases por rama de espacio de nombres (7)
Con los IDE modernos y otras herramientas de desarrollo, diría que si todas las clases pertenecen a un espacio de nombres, entonces no hay un número arbitrario en el que deba dividirse un espacio de nombres solo para mantenerlo.
¿Qué cantidad de clases crees que es ideal por una "rama" de espacio de nombres? ¿En qué punto uno decidiría dividir un espacio de nombres en varios? No discutamos el agrupamiento lógico de las clases (supongamos que están lógicamente agrupadas adecuadamente), en este punto me concentro en el número de clases mantenibles vs. no mantenibles.
Creo que un espacio de nombres debe ser tan grande como debe ser. Si hay una razón lógica para crear un espacio de nombres hermano o un espacio de nombres secundario, hágalo. La razón principal por la que veo que se divide en espacios de nombres es facilitar el desarrollo, facilitando a los desarrolladores navegar por la jerarquía del espacio de nombres para encontrar lo que necesitan.
Si tiene un espacio de nombres con muchos tipos y siente que es difícil encontrar algunos, considere moverlos a otro espacio de nombres. Utilizaría un espacio de nombres secundario si los tipos están especializando los tipos de espacio de nombres padre y un espacio de nombres hermanos si los tipos pueden usarse sin los tipos de espacio de nombres originales o tienen un propósito diferente. Por supuesto, todo depende de lo que esté creando y del público objetivo.
Si un espacio de nombre tiene menos de 20 tipos, es poco probable que valga la pena dividirlo. Sin embargo, debe considerar la asignación del espacio de nombres durante el diseño para que sepa de antemano al desarrollar, qué tipos van en qué espacios de nombres. Si realiza la asignación del espacio de nombres durante el desarrollo, espere una gran cantidad de refactorización mientras determina qué debe ir a dónde.
Sé que no quiere hablar de agrupación lógica, sin embargo, para hacer una división, debe poder agrupar los dos espacios de nombres diferentes. Empezaría a considerar un nuevo espacio de nombres en alrededor de 30 clases; Sin embargo, no lo consideraría una gran preocupación.
"42? No, no funciona ..."
Ok, pongamos a funcionar nuestra proeza de programación y veamos cuál es la opinión de Microsoft:
# IronPython
import System
exported_types = [
(t.Namespace, t.Name)
for t in System.Int32().GetType().Assembly.GetExportedTypes()]
import itertools
get_ns = lambda (ns, typename): ns
sorted_exported_types = sorted(exported_types, key=get_ns)
counts_per_ns = dict(
(ns, len(list(typenames)))
for ns, typenames
in itertools.groupby(sorted_exported_types, get_ns))
counts = sorted(counts_per_ns.values())
print ''Min:'', counts[0]
print ''Max:'', counts[-1]
print ''Avg:'', sum(counts) / len(counts)
print ''Med:'',
if len(counts) % 2:
print counts[len(counts) / 2]
else: # ignoring len == 1 case
print (counts[len(counts) / 2 - 1] + counts[len(counts) / 2]) / 2
Y esto nos da las siguientes estadísticas sobre el número de tipos por espacio de nombres:
C:/tools/nspop>ipy nspop.py
Min: 1
Max: 173
Avg: 27
Med: 15
Debo decir que encuentro que todo lo anterior es una lectura muy sorprendente.
Los expertos en usabilidad nos dicen que mantengamos el número de opciones en un menú a un número limitado para que podamos ver todas las opciones de inmediato. Lo mismo se aplica a la forma en que organizas tu trabajo.
Normalmente esperaría de 4 a 10 tipos en un espacio de nombres. Ahorra tanto para buscar cosas y desplazarse hacia arriba y hacia abajo. Es tan rápido y fácil mover cosas usando reafilamiento que no veo ninguna razón para no hacerlo.
Otra cosa que debería mencionarse es que a menudo vale la pena colocar una clase que contenga métodos de extensión en su propio espacio de nombres, para que pueda habilitar o deshabilitar esos métodos de extensión con una directiva using
. Entonces, si la cosa en el espacio de nombres es una clase estática que contiene métodos de extensión, la respuesta es 1.
Una cosa que no se trata aquí, aunque se relaciona con el punto de Chris en cierto modo, es que la capacidad de aprendizaje de un espacio de nombres no está solo relacionada con la cantidad de elementos.
(Por cierto, esto se aplica al "espacio de nombres" en el sentido más amplio: una clase en sí misma es un espacio de nombres en el sentido general en el sentido de que contiene ciertos nombres que significan algo diferente en ese contexto que en otro, una enumeración es un espacio de nombres en este sentido también).
Digamos que encuentro un espacio de nombres relacionado con XML con una clase Element . Aprendo un poco sobre esto y cuando miro la clase de Atributo , veo cierta similitud. Cuando veo una clase ProcessingInstruction , puedo adivinar razonablemente cómo funciona (y es probable que sea un error de diseño si creo que está completamente equivocado; en el mejor de los casos, las diferencias no solo tienen que documentarse, sino también explicarse). Puedo adivinar que hay una clase de Comentario antes de siquiera verlo. Iré a buscar tu clase de TextNode y me pregunto si todos heredarán de Node en lugar de tener que aprender sobre ellos de los documentos. Me pregunto cuál de los varios enfoques razonables que tomó con su clase Lang en lugar de preguntarse si está allí.
Como todo se relaciona con un dominio que ya conozco, el "costo" conceptual de estas siete clases es mucho, mucho menos que si las siete clases fueran llamadas, Ovejas , Televisión , FallOfSaigon , Enuii , AmandaPalmersSoloWork , ForArtsSakeQuotient y DueProcess .
Esto se relaciona con el punto de Chirs, porque dice que se nos aconseja por la facilidad de uso para mantener el número de opciones abajo. Sin embargo, si tenemos una selección de países en orden alfabético, asimilamos inmediatamente toda la lista y elegimos la que necesitamos al instante, por lo que no se aplican los consejos para mantener las opciones (de hecho, algunas opciones a la vez pueden ser ambas) menos útil y potencialmente insultante).
Si su espacio de nombres tiene 200 nombres, pero solo tiene que aprender realmente media docena para entender el lote, entonces será mucho más fácil asimilar que tener una docena de nombres con poca relación entre ellos.