Ordine di soggetti e modificatori nei nomi di variabili

6

Sto cercando esperienze riguardanti l'ordinamento dell'oggetto e i modificatori nei nomi di variabili.

Un oggetto semplice Shape avrebbe solo un oggetto per il nome della variabile, come Area .

Un caso leggermente più complesso Sphere che ha un muro avrà un inner volume e un outer volume , che è il punto in cui la mia domanda entra in gioco.

Che cosa preferisci tra Modificatore-Soggetto o Modificatore soggetto ?

Come esempio:

class Containers_Modifier_Subject
{
  AreaAdjustmentFactor
  WallThickness
  Height
  Length
  Width
  AdjustedArea
  SurfaceAreaInner
  SurfaceAreaOuter
  LongWallArea
  ShortWallArea
  TopArea
  InnerVolume
  OuterVolume
}

class Containers_Subject_Modifier
{
  AreaAdjustmentFactor
  WallThickness
  Height
  Length
  Width
  AreaAdjusted
  AreaInnerSurface
  AreaOuterSurface
  AreaLongWall
  AreaShortWall
  AreaTop
  VolumeInner
  VolumeOuter
}

Il trigger per la mia domanda proviene da un oggetto simile agli esempi. C'erano abbastanza variabili nell'oggetto che solo una porzione viene visualizzata nella finestra di codice in anticipo / ricerca dall'IDE. Voglio assicurarmi che qualsiasi sviluppatore futuro sia portato rapidamente alla variabile corretta che cercheranno senza dover scorrere verso l'alto e verso il basso nella finestra di ricerca.

Nel mio caso, stavo cercando l'area totale, ma il fattore di area e i valori dell'area regolati erano spuntati per primi.

La coerenza nella denominazione come standard di codice è data.

Quale approccio di denominazione è stato:

  • più mantenibile?
  • più facilmente comprensibile?
  • semanticamente corretto?
    • vale a dire. quanto bene il nome della variabile corrisponde all'oggetto business e in che misura il nome della variabile scorre in conversazioni sul problema da risolvere?
  • favorevole all'utilizzo con funzionalità di ricerca del codice come Intellisense o i vari costrutti basati su Eclipse?
posta GlenH7 10.08.2012 - 20:40
fonte

6 risposte

10

Stai pensando lungo le linee giuste. La maggior parte delle persone preferisce i nomi che possono leggere nella loro testa e farlo sembrare vicino all'inglese normale.

Tuttavia, il fatto che tu abbia difficoltà con le liste lunghe in intellisense non è un problema di denominazione delle variabili, è un problema di dimensioni della classe. Quando inizi a dover distinguere per un prefisso, è un buon segno che devi dividere il prefisso nella sua entità in qualche modo. Ad esempio, Container.Area[INNER] . Usa le caratteristiche della lingua, ecco perché sono lì.

    
risposta data 10.08.2012 - 21:14
fonte
4

Nelle mie API uso sempre nomi che descrivono ciò che mi aspetto che l'utente digiti: TotalArea invece di AreaTotal , ma WallCount invece di CountWall , poiché gli ultimi esempi sono inglesi impropri.

L'uso di modificatore soggetto è qualcosa che i progettisti fanno solo per soddisfare IntelliSense, in quanto digitando Area si otterrebbe quindi un elenco di sole cose che riguardano l'area - il che è bello - ma ciò non garantire l'utilizzo di nomi strani. Un'opzione molto migliore sarebbe separare le proprietà di un'area in un oggetto Area separato. Ciò rende l'API più pulita, la classe più corta e migliora la riusabilità e la testabilità. La tua classe di esempio diventerebbe quindi:

WallThickness
Height
Length
Width
Area
Volume

Per concludere: usa l'ordine delle parole che userai quando lo scrivi in inglese normale. Se si dispone di più proprietà, campi (e metodi) prefissati, prendere in considerazione la possibilità di raggruppare tali membri in una classe correlata. Ciò migliora la manutenibilità (testabilità e riusabilità), consente a IntelliSense di suggerire solo i membri dell'area pertinenti dopo aver digitato Area. e rende gli oggetti corrispondenti ai loro oggetti di business più strettamente (nella maggior parte dei casi).

E mai e poi usi una particolare convenzione di codifica solo per soddisfare il tuo ambiente di programmazione (ad es. completamento del codice in Visual Studio o Eclipse).

    
risposta data 13.08.2012 - 00:18
fonte
3

Per quello che vale, i due fattori a cui attribuisco il maggior valore quando si assegnano nomi alle variabili (oltre al significato, ovviamente) sono

  • È leggibile, cioè quanto è probabile che io possa leggerlo in modo errato o accidentalmente sceglierlo da un elenco Intellisense?
  • Come suona quando viene pronunciato? Posso parlare delle mie variabili senza confondermi, rimanere legato alla lingua o sembrare un libro del Dr. Suess?

Quindi, per questi motivi, AdjustedArea è migliore di AreaAdjusted (sembra solo più naturale) SurfaceAreaInner e SurfaceAreaOuter sono molto meglio di SurfaceInnerSurface e AreaOuterSurface (dove il qualificatore è in realtà nascosto nel mezzo del nome), ma in realtà preferisco InnerSurfaceArea e OuterSurfaceArea, poiché è così che mi riferirei a queste cose se fossi un civile, quindi per parlare, e non uno sviluppatore.

    
risposta data 10.08.2012 - 21:01
fonte
2

Non penso che ci sia una risposta giusta a questa domanda. In realtà, confina con una questione religiosa;).

Sia modificatore soggetto che soggetto-modificatore hanno merito e svantaggi. Alcuni di questi non sono inerenti ai nomi delle variabili stessi, ma agli strumenti utilizzati per creare e mantenere il codice (tale nome assiste usando solo starts-with).

A volte, l'unica differenza tra i due può essere il tuo punto di riferimento. Ad esempio wallThickness, se sto lavorando con vari spessori, wall è il modificatore. Se guardo i muri, lo spessore è il modificatore.

Probabilmente la migliore risposta è adattarsi al tuo codice esistente. Fare altrimenti significherebbe che gli altri membri del team sarebbero sorpresi dalle scelte del tuo nome. Ciò porterà alla duplicazione del calcolo e ad un generale peggioramento della velocità di codifica e manutenzione.

In uno standard di codifica, potrei esprimere una raccomandazione per preferire l'uno rispetto all'altro, ma vorrei che non rendesse una regola dura e veloce. Mi piacerebbe che i programmatori facessero la scelta migliore in ogni circostanza particolare.

    
risposta data 13.08.2012 - 01:13
fonte
1

Penso che la denominazione delle variabili dovrebbe supportare il pensiero sopra qualsiasi altra cosa (che si tratti di una convenzione comunemente nota o di una sintassi del linguaggio). Questo prende immediatamente una decisione: la versione SubjectModifier , perché in questo modo il nome esprime l'organizzazione dei dati: PlannedStart, PlannedEnd, PlannedCost; ActualStart, ...

Considero che supporta IntelliSense non solo buono, ma importante! Quando si guarda un codice sconosciuto, non mi interessa quanti getters e setter hanno fatto, ma voglio capire quali componenti ( Soggetti) ci sono dentro, e solo allora cosa posso fare con loro (Modificatori). Alimentare correttamente IntelliSense salverà sicuramente altri programmatori (e forse anche te stesso dopo pochi mesi) alcuni secondi ogni volta che chiami una funzione o fai riferimento a una variabile membro. Questo si accumula rapidamente in ore.

... e forse qualcosa di ancora più importante: il controllo. Mi piace restringere lo scope di ogni lettera che scrivo. Preferisco scrivere il soggetto e ottenere un elenco di cose che posso fare con quel soggetto, digitare "access" e comunque navigare tra gli oggetti ... o addirittura rendersi conto che non era "accesso" ma "get" per quell'oggetto, perché il mio soggetto target non è presente nell'elenco. Aaargh ...

IntelliSense è lì per farti risparmiare tempo (e altri programmatori) e farti evitare la frustrazione. Se lo usi.

Il contenitore è un altro problema, e sono d'accordo che quando hai una domanda su un contenitore nel tuo sistema di denominazione, hai davvero una domanda sulla gerarchia delle classi . Il mio esempio è solo sulla linea, ma in questo momento ho iniziato a esitare se creare una classe TaskInfo con i campi Inizio, Fine, Costo e utilizzare InfoPlanned, InfoActual nel genitore.

La creazione di classi così piccole porta a un'applicazione più flessibile. TaskInfo mi consente di creare un TaskInfoPanel che visualizza Inizio, Fine, Costo in modo corretto e posso riutilizzare il pannello due volte per mostrare i costi pianificati e effettivi. Permetterebbe anche di avere ancora più istanze di TaskInfo per il progetto - come avere più stime fatte da persone diverse: offerte da diversi fornitori di servizi. Alla fine, questa nuova struttura sosterrebbe un sistema di pianificazione del progetto in cui è possibile separare la pianificazione delle attività (interna) e l'esecuzione (interno / appaltatore), lasciare che l'appaltatore faccia le sue offerte (forse multiple, parallele) ad alcune attività, dalle quali è possibile scegli e crea la cronologia pianificata del progetto, esegui il contratto e così via.

Un sacco di servizi validi solo perché ho deciso di estrarre un gruppo significativo di dati in una classe separata ... Ho appena giocato con l'idea in questo momento, ma la conseguenza è evidente, e quando incontrerò questo scenario, io sicuramente userei questo approccio.

Quindi, ti suggerisco caldamente di separare i tuoi dati nei contenitori più piccoli con una sola responsabilità. Ciò consente una riutilizzabilità più ampia, una struttura più flessibile, un'interfaccia stretta; e penso anche che sia molto più facile da capire. Penso che possiamo ottenere più facilmente l'immagine di un sistema che ha una gerarchia con componenti piccoli definiti con precisione rispetto ad alcuni grandi blocchi orientati alle funzionalità.

I miei 2 cent.

    
risposta data 15.08.2012 - 05:31
fonte
0

Preferisco il soggetto modificatore perché è così che solitamente viene scritto e parlato l'inglese.

Se c'è un chiaro vantaggio specifico in una certa situazione per fare un modificatore soggetto-nome, lo farò.

    
risposta data 15.08.2012 - 03:15
fonte

Leggi altre domande sui tag