Pregunta

¿Qué número de clases crees que es ideal para un espacio de nombres " rama " ;? ¿En qué punto uno decidiría dividir un espacio de nombres en varios? No discutamos la agrupación lógica de clases (supongamos que se agrupan de manera lógica), en este punto, estoy enfocado en el número de clases mantenibles y no mantenibles.

¿Fue útil?

Solución

" 42? No, no funciona ... "

Bien, pongamos a trabajar nuestra destreza en 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 proporciona las siguientes estadísticas sobre la cantidad de tipos por espacio de nombres:

C:\tools\nspop>ipy nspop.py
Min: 1
Max: 173
Avg: 27
Med: 15

Otros consejos

Con los IDE modernos y otras herramientas de desarrollo, yo diría que si todas las clases pertenecen a un espacio de nombres, entonces no hay un número arbitrario en el que deberías dividir un espacio de nombres solo por razones de mantenimiento.

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 de hermanos o un espacio de nombres de hijos, hágalo. La razón principal por la que veo que se divide en espacios de nombres es para facilitar el desarrollo, lo que facilita a los desarrolladores navegar por la jerarquía de espacios de nombres para encontrar lo que necesitan.

Si tienes un espacio de nombres con muchos tipos y sientes que es difícil encontrar algunos, considera moverlos a otro espacio de nombres. Yo usaría un espacio de nombres secundario si los tipos se especializan en los tipos de espacio de nombres principales y un espacio de nombres de hermanos si los tipos se pueden usar sin los tipos de espacios 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 nombres tiene menos de 20 tipos, es poco probable que valga la pena dividirlo. Sin embargo, debe considerar la asignación de espacios de nombres durante el diseño para que sepa por adelantado al desarrollar, qué tipos van en qué espacios de nombres. Si realiza una asignación de espacio de nombres durante el desarrollo, espere una gran cantidad de refactorización a medida que determine qué debe ir a dónde.

Una cosa que no se trata aquí, aunque se relaciona con el punto de Chris de una manera, es que la capacidad de aprendizaje de un espacio de nombres no solo está 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, ya que contiene ciertos nombres que significan algo diferente en ese contexto de lo que podrían en otro, una enumeración También es un espacio de nombres en este sentido).

Supongamos que encuentro un espacio de nombres relacionado con XML con una clase Element . Aprendo un poco sobre esto y cuando veo la clase Attribute , veo cierta similitud. Cuando veo una clase de ProcessingInstruction , puedo hacer una estimación razonable de cómo funciona (y es probable que sea un error de diseño si creo que es completamente incorrecto, en el mejor de los casos, las diferencias no solo tienen que documentarse, sino explicarse ). Puedo adivinar que hay una clase de Comentario antes de que la vea. Iré a buscar su clase de TextNode y me preguntaré si todos ellos heredarán de Node en lugar de tener que aprender sobre ellos en los documentos. Me pregunto cuál de los varios enfoques razonables tomaste con tu clase de Lang en lugar de preguntarte si está ahí.

Debido a que todo se relaciona con un dominio del que ya tengo conocimiento, el "costo conceptual" de " de estas siete clases es mucho, mucho menos que si las siete clases fueran llamadas, Sheep , Television , FallOfSaigon , Enuii , AmandaPalmersSoloWork , ForArtsSakeQuotient y DueProcess .

Esto se relaciona con el punto de Chirs, porque dice que se nos aconseja por razones de utilidad para mantener el número de opciones bajas. Sin embargo, si tenemos una selección de países en orden alfabético, inmediatamente desarrollamos la lista completa y seleccionamos el que necesitamos al instante, por lo que no se aplican los consejos para mantener las opciones hacia abajo (de hecho, unas pocas opciones a la vez pueden ser ambas). menos útil y potencialmente insultante).

Si su espacio de nombres tiene 200 nombres, pero solo tiene que realmente aprender media docena para comprender el lote, entonces será mucho más fácil de asimilar que tener una docena de nombres con poca relación con entre sí.

Sé que no quieres discutir la agrupación lógica, sin embargo, para hacer una división necesitas 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 preocupación importante.

Debo decir que todas las lecturas anteriores son muy sorprendentes.

Los expertos en usabilidad nos dicen que mantengamos la cantidad de opciones en un menú a un número limitado para que podamos ver de inmediato todas las opciones. Lo mismo se aplica a cómo organizas tu trabajo.

Normalmente esperaría 4-10 tipos en un espacio de nombres. Ahorra tanto la caza de cosas y el desplazamiento hacia arriba y hacia abajo. Es tan rápido y fácil mover cosas usando resharper que no veo ninguna razón por la que no hacerlo.

Otra cosa que debe 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 utilizando . 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top