Generalmente, è un processo organico per me.
I miei spazi dei nomi tendono a rispecchiare i nomi delle mie cartelle, principalmente perché penso che sia più facile trovare le cose in questo modo.
I progetti aziendali hanno generalmente un prefisso aziendale di fronte allo spazio dei nomi, e per i progetti personali si alterna tra project-prefix.folder e solo cartella per i nomi.
Le cartelle "principali" tendono ad essere ovvie per il loro nome e sono generalmente correlate alla loro funzione: "Pippo". Per i progetti più grandi, aprirò la cartella principale per riflettere il principale paradigma di programmazione che potrei seguire. Quindi per MVVM avrei "Foo.View", "Foo.ViewModel" e "Foo.Model" come nomi di esempio.
Invariabilmente, le funzioni di supporto che non si adattano da nessun'altra parte iniziano a insinuarsi nel progetto. Inizierò con una cartella di tipo "comune" o "utilità" per atterrare prima di tutto. "Helpers", "Base" e "Core" funzionerebbero altrettanto bene per un atterraggio iniziale.
Cerco di assegnare un nome alle mie funzioni in base all'oggetto e / o all'azione che eseguono. Quindi potrei avere PathManager, PathChecker, ecc ... Spesso, so che avrò diverse azioni relative a un argomento, quindi chiamerò la classe dopo l'Oggetto e aggiungerò i metodi secondo necessità. Un thesaurus può tornare utile qui.
Ho trovato un'alta correlazione tra la facilità di nominare un oggetto e quanto bene posso descrivere ciò che la funzione dovrebbe fare. Uno dei miei punti di controllo personali è che se faccio fatica a nominare qualcosa, allora questo significa che ho bisogno di riflettere su ciò che la funzione dovrebbe effettivamente fare. Una volta risolti i problemi di funzionalità, il nome viene facilmente.
Man mano che raccolgo più funzioni di supporto, le migrerò nella loro cartella e / o spazio dei nomi. Se ottengono una cartella dal progetto root o se ottengono una sottocartella nella cartella dell'utilità dipende dalla natura e dalla quantità delle funzioni.