Domanda

Quale numero di classi pensi sia l'ideale per uno spazio dei nomi " branch " ;? A che punto si deciderà di suddividere uno spazio dei nomi in più spazi dei nomi? Non parliamo del raggruppamento logico delle classi (supponiamo che siano raggruppate logicamente correttamente), a questo punto sono focalizzato sul numero di classi gestibili rispetto a quelle non mantenibili.

È stato utile?

Soluzione

" 42? No, non funziona ... "

Ok, mettiamo al lavoro la nostra abilità di programmazione e vediamo qual è l'opinione di 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

E questo ci fornisce le seguenti statistiche sul numero di tipi per spazio dei nomi:

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

Altri suggerimenti

Con gli IDE moderni e altri strumenti di sviluppo, direi che se tutte le classi appartengono a uno spazio dei nomi, allora non esiste un numero arbitrario in cui dovresti dividere uno spazio dei nomi solo per manutenibilità.

Penso che uno spazio dei nomi dovrebbe essere grande quanto deve essere. Se esiste un motivo logico per creare uno spazio dei nomi di pari livello o uno spazio dei nomi figlio, quindi farlo. La ragione principale per cui la vedo divisa in spazi dei nomi è quella di facilitare lo sviluppo, rendendo più semplice agli sviluppatori la navigazione nella gerarchia dello spazio dei nomi per trovare ciò di cui hanno bisogno.

Se hai uno spazio dei nomi con molti tipi e ritieni che sia difficile trovarne alcuni, considera di spostarli in un altro spazio dei nomi. Vorrei utilizzare uno spazio dei nomi figlio se i tipi sono specializzati nei tipi di spazio dei nomi padre e uno spazio dei nomi fratello se i tipi possono essere utilizzati senza i tipi di spazio dei nomi originali o hanno uno scopo diverso. Naturalmente, tutto dipende da cosa stai creando e dal pubblico di destinazione.

Se uno spazio dei nomi ha meno di 20 tipi, è improbabile che valga la pena dividere. Tuttavia, è necessario considerare l'allocazione dello spazio dei nomi durante la progettazione in modo da sapere in anticipo durante lo sviluppo, quali tipi vanno in quali spazi dei nomi. Se si esegue l'allocazione dello spazio dei nomi durante lo sviluppo, aspettarsi un sacco di refactoring quando si determina cosa dovrebbe andare dove.

Una cosa che non è trattata qui, sebbene si riferisca in qualche modo al punto di Chris, è che l'apprendibilità di uno spazio dei nomi non è solo correlata al numero di elementi.

(Per inciso, questo vale per "spazio dei nomi" nel senso più ampio - una classe stessa è uno spazio dei nomi nel senso generale in quanto contiene alcuni nomi che significano una cosa diversa in quel contesto di quanto potrebbero in un altro, un enum è uno spazio dei nomi anche in questo senso).

Diciamo che incontro uno spazio dei nomi relativo a XML con una classe Element . Imparo un po 'su questo e quando guardo la classe Attributo , vedo delle somiglianze. Quando vedo quindi una classe ProcessingInstruction , posso fare un'ipotesi ragionevole su come funziona (ed è probabilmente un difetto di progettazione se immagino completamente sbagliato, nella migliore delle ipotesi le differenze non devono essere solo documentate, ma spiegate ). Posso immaginare che ci sia una classe Comment prima ancora di vederla. Vado a cercare la tua classe TextNode e mi chiedo se questi ereditano tutti da Nodo piuttosto che doverli imparare dai documenti. Mi chiederò quale dei diversi approcci ragionevoli hai adottato con la tua classe Lang piuttosto che chiedermi se è lì.

Poiché tutto si riferisce a un dominio di cui ho già conoscenza, il "costo" concettuale di queste sette classi è molto, molto meno che se le sette classi fossero chiamate, Pecora , Televisione , FallOfSaigon , Enuii , AmandaPalmersSoloWork , ForArtsSakeQuotient e DueProcess .

Questo si riferisce al punto di Chirs, perché dice che ci viene consigliato per motivi di usabilità di mantenere basso il numero di scelte. Tuttavia, se abbiamo una scelta di paesi in ordine alfabetico, cerchiamo immediatamente l'intero elenco e scegliamo quello di cui abbiamo bisogno all'istante, quindi i consigli per mantenere le scelte basse non si applicano (in effetti, alcune opzioni alla volta possono essere entrambe meno utile e potenzialmente offensivo).

Se il tuo spazio dei nomi ha 200 nomi, ma devi solo davvero imparare una mezza dozzina per capire il lotto, allora sarà molto più facile grok che avere una dozzina di nomi con poca relazione con l'un l'altro.

So che non vuoi discutere del raggruppamento logico, tuttavia per fare una divisione devi essere in grado di raggruppare i due diversi spazi dei nomi. Comincerei a considerare un nuovo spazio dei nomi in circa 30 classi; tuttavia non lo considero una preoccupazione importante.

Devo dire che trovo tutte queste letture molto sorprendenti sopra.

Gli esperti di usabilità ci dicono di limitare il numero di scelte in un menu a un numero limitato in modo da poter vedere immediatamente tutte le scelte. Lo stesso vale per l'organizzazione del tuo lavoro.

Normalmente mi aspetto 4-10 tipi in uno spazio dei nomi. Salva così tanto giro di caccia per roba e scorrendo su e giù. È così facile e veloce spostare le cose usando il resharper che non vedo alcun motivo per non farlo.

Un'altra cosa che dovrebbe essere menzionata è che spesso paga mettere una classe contenente metodi di estensione nel proprio spazio dei nomi, in modo da poter abilitare o disabilitare quei metodi di estensione con una direttiva using . Quindi, se la cosa nello spazio dei nomi è una classe statica contenente metodi di estensione, la risposta è 1.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top