Come nominare una variabile quando la parola è sia un nome che un verbo

46

Mi sono imbattuto in un caso a caso con la guida generale di:

  • nomi per variabili
  • verbi per le funzioni

In particolare, ho un caso in cui la parola è ambigua - può essere un verbo o un nome. E in alcuni casi, quando stiamo discutendo l'applicazione, saranno usati entrambi modi nella stessa frase.

Il mio intento è di assicurarmi che il programma rimanga leggibile sia per gli sviluppatori futuri che per me stesso quando tornerò a sezioni di codice alcuni mesi più tardi.

Uno degli esempi è con battery . A battery ha charge e puoi anche charge() di batteria.

Penso che avere Battery.Charge e Battery.Charge(value) possa confondere gli sviluppatori futuri.

La mia soluzione attuale è semplicemente scegliere una parola diversa per uno o entrambi i casi (la variabile e la funzione). Il mio problema con questo approccio è che la variabile dell'oggetto Battery e la funzione per charge non saranno allineate con le discussioni sul design che riguardano Battery .

La mia domanda è se esiste un altro / modo migliore per gestire questo conflitto nella convenzione sui nomi?

Alcune letture aggiuntive sull'argomento. Nessuno ha veramente affrontato il particolare della mia domanda.

posta GlenH7 25.01.2013 - 20:40
fonte

7 risposte

38

In situazioni simili cerco di trovare sinonimi. In questo caso userei "ricarica" per il verbo. Il "ri" è leggermente ridondante, ma il significato è chiaro. L'uso della semplice "carica" per la carica rimanente nella batteria è ambiguo perché non specifica alcuna unità fisica. Preferirei "availableAmpHours", "hoursUntilRecharge" o qualcosa di simile. Le unità dipenderanno da ciò che è conveniente per l'applicazione.

La mia preferenza personale è di usare i verbi solo per le funzioni che cambiano stato. Uso nomi per funzioni non mutanti. Suppongo che dipenda dal tuo punto di vista. A livello macchina, le funzioni non mutanti fanno qualcosa, ma a livello di modello non lo fanno.

    
risposta data 25.01.2013 - 21:03
fonte
20

Basta lanciarlo fuori, ma forse la soluzione per questa istanza di ambiguità di denominazione è rimuovere completamente tale funzionalità dalla batteria. Non ho mai visto una batteria autoportante e per me sarebbe più sensato avere una lezione BatteryCharger. Ciò aiuterebbe a tenere le vostre preoccupazioni più disgiunte e rendere l'azione più esplicita.

battery.Charge(50) vs batteryCharger.Charge(battery, 50)

Per me, la seconda forma è molto più comprensibile e mantiene tutto il codice di "Ricarica" in un unico posto invece di spargerlo in tutte le classi di batteria.

    
risposta data 26.01.2013 - 18:37
fonte
8

Evita i Doppi significati

Hai deliberatamente selezionato una parola che ha più di un significato, e quella prima decisione è il problema. Ci sono un sacco di parole che sono problematiche per i programmatori. Un altro esempio potrebbe essere phone . Puoi phone qualcuno, oppure potresti avere phone in tasca.

Usa getter e setter

La denominazione standard per la maggior parte degli oggetti è i metodi getter / impostazioni per le proprietà.

Battery.Charge            // would be a property
Battery.setCharge(value)  // would set the property
Battery.getCharge()       // would get the property

Proprietà sono stati non nomi

Penso che ti sbagli classificando le proprietà degli oggetti come nomi e le variabili potrebbero anche essere pensate per stati. Sono stati rilevanti per lo scopo locale della loro esistenza.

Potresti descrivere il valore che hanno come nome, ma non sono sicuro che sia vero in tutti i casi.

Nella terminologia OOP le proprietà dell'oggetto descrivono lo stato di quell'oggetto. Nel tuo caso il Battery è un oggetto, ed è Charge è uno stato. Quindi questa sarebbe una proprietà dell'oggetto, ma questo dipende dal contesto in cui viene utilizzato.

Se devi essere in grado di Charge della batteria e anche sapere qual è il valore corrente di Charge , allora hai un problema.

Utilizzo dell'ambito per imporre il contesto

Il contesto è ciò che chiarirà il significato di una parola che si intende un metodo o una proprietà da trasmettere. Scope sta impostando l'accessibilità di una proprietà / metodo dall'esterno dell'oggetto.

Batter._charge            // a hidden private property
Battery.setCharge(value)  // would set the private property
Battery.getCharge()       // would get the private property
Battery.Charge()          // would perform the Charge action

I metodi sono verbi

Puoi descrivere il metodo di un oggetto come un verbo, ma l'azione della parola è più adatta. Nella terminologia OOP si eseguono azioni sugli oggetti usando i loro metodi. È una cattiva forma modificare la proprietà di un oggetto dall'esterno dell'oggetto. È preferibile chiamare un metodo che esegua le azioni richieste che ne determinano lo stato.

La parola Charge è un verbo, ma è anche un nome. Quando viene utilizzato per chiamare il metodo di un'azione, diventa chiaro che il verbo viene utilizzato Battery.Charge(....) .

Ma il contesto è molto importante. Mentre la parola Charge() è un verbo, non è significativa quanto startCharging() .

I metodi validi per Battery potrebbero includere Charging , Discharging , setCharge , getCharge , hasCharge , Discharge e Charged .

Spesso i metodi a una sola parola spesso non dichiarano esplicitamente le loro azioni in modo chiaro, ma ci sono alcuni casi come open e close dove è richiesta poca spiegazione.

Quindi non esiste una risposta corretta su come denominare questi tipi di proprietà / metodi. Tranne il fatto che devi usare le tecniche di cui sopra con saggezza per assicurarti che non ci sia confusione.

    
risposta data 26.01.2013 - 20:10
fonte
6

Prependili con i verbi che renderanno loro un verbo o un nome.

Battery.doCharge()

Battery.getCharge()
    
risposta data 31.01.2013 - 20:53
fonte
4

Per il caso verbale, penso che Charge sia OK. Per il caso nominale, getCurrentChargeLevel dovrebbe funzionare per te?

    
risposta data 25.01.2013 - 20:43
fonte
0

Nella maggior parte dei casi aggiungere un verbo, un avverbio o un aggettivo di aiuto è sufficiente per distinguerli e può effettivamente aiutare a capire. Con il tuo caso di Charge and Charge () su una batteria che lo rende DeltaCharge () potrebbe mostrare che è una funzione che può gestire sia la ricarica che la scarica.

Delta (nei casi in cui c'è un cambiamento ma ambiguo) è un modificatore che uso e raccomando agli altri tutto il tempo per passare il cambiamento nello stato (anche se il verbo è semi-ovvio).

    
risposta data 25.01.2013 - 22:45
fonte
0

Notazione ungherese in soccorso. Puoi avere intCharge e fcnCharge(value) , evitando così la confusione e non aggiungendo un pazzo nome lungo quando tre lettere funzioneranno perfettamente.

O potresti semplicemente usare lo stesso nome e lasciare che sia l'IDE a gestirlo. Creare un nome più lungo o diverso potrebbe comunque confondere a lungo andare.

    
risposta data 25.01.2013 - 22:54
fonte

Leggi altre domande sui tag