Cómo nombrar una variable cuando la palabra es tanto un sustantivo como un verbo

48

Me he encontrado con un problema de esquina con la guía general de:

  • sustantivos para variables
  • verbos para funciones

Específicamente, tengo un caso en el que la palabra es ambigua: puede ser un verbo o un sustantivo. Y en algunos casos, cuando estamos discutiendo la aplicación, se usará en ambos sentidos en la misma oración.

Mi intención es asegurarme de que el programa seguirá siendo legible para futuros desarrolladores, así como para mí, cuando regrese a las secciones del código meses después.

Uno de los ejemplos es con a battery. A batterytiene una chargey también puede charge()una batería.

Creo que tener ambos Battery.Chargey Battery.Charge(value)será confuso para futuros desarrolladores.

Mi solución actual es simplemente elegir una palabra diferente para uno o ambos casos (la variable y la función). Mi problema con ese enfoque es Batteryque la variable y la función del objeto chargeno se alinearán con las discusiones de diseño que involucran el Battery.

Mi pregunta es si hay otra / mejor manera de manejar este conflicto en la convención de nomenclatura.


Algunas lecturas adicionales sobre el tema. Ninguno realmente abordó lo particular de mi pregunta.

Comunidad
fuente
3
hacer que el addCharge función de carga fácil y lo suficientemente claro
monstruo de trinquete
2
¿Podría prefijar la variable sustantiva con "Current-"? ¿Entonces "CurrentCharge" vs "Charge ()"?
Brian Snow
66
o simplemente ChargeLevel para obtener la carga actual
fanático del trinquete el
55
Inventa una palabra. WordNet no cree que enqueuesea ​​una palabra, pero es un verbo en Java. ¿Qué tal doCharge? Todavía fallará la prueba de simetría porque sus otros métodos no tendrán este prefijo
Variable miserable
55
"Actual" = ahora, o "actual" = flujo de carga. ¡La única solución real es reemplazar el inglés con un idioma más sensible!
DarenW

Respuestas:

38

En situaciones similares trato de encontrar sinónimos. En este caso, usaría "recargar" para el verbo. El "re" es ligeramente redundante, pero el significado es claro. Usar la simple "carga" para la carga restante en la batería es ambiguo porque no especifica ninguna unidad física. Preferiría "availableAmpHours", "hoursUntilRecharge" o algo similar. Las unidades dependerán de lo que sea conveniente para la aplicación.

Mi preferencia personal es usar verbos solo para funciones que cambian de estado. Yo uso sustantivos para funciones no mutantes. Supongo que depende de tu punto de vista. A nivel de máquina, las funciones no mutantes hacen algo, pero a nivel de modelo, no lo hacen.

Kevin Cline
fuente
2
Excelente punto sobre las unidades. Las unidades se dejan explícitamente en este caso porque pueden cambiar dependiendo del análisis que estamos ejecutando. Es decir, estamos usando diferentes escalas de tiempo y la batería ajusta sus operaciones en términos de la escala del análisis.
1
Prefiero verbos para funciones caras y no mutantes. Por ejemplo, funciones que ejecutan una consulta en una base de datos.
Brian
20

Solo lanzando esto, pero tal vez la solución para esta instancia de ambigüedad de nombres es eliminar esa funcionalidad de la batería por completo. Nunca he visto una batería de carga automática y tendría más sentido para mí tener una clase BatteryCharger. Esto ayudaría a mantener sus preocupaciones más desacopladas y hacer que la acción sea más explícita.

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

Para mí, la segunda forma es mucho más comprensible y mantiene todo su código de "Carga" en un solo lugar en lugar de rociarlo en todas sus clases de batería.

mortalapeman
fuente
66
No es un mal pensamiento, pero en este caso Batteryes una abstracción para el sistema de batería + carga. Nuestra aplicación no requiere dividir los dos aspectos en objetos separados, por lo que se enrollan en uno (aka Battery) para mayor comodidad. En última instancia, la física de una batería recargable dicta que tiene algún tipo de función para aceptar una carga.
En ese caso, afirmo que la respuesta de kevin cline es lo que estás buscando. Para mayor claridad, usaría Recharge and Discharge para las funciones de mutación y Charge para el nombre de la propiedad. Quizás ChargePercent también sería bueno.
mortalapeman
¿Eres quizás un programador de Java? Esto es claramente una violación de No te repitas. De hecho, estás repitiendo TODO excepto el parámetro "50". No podría encontrar un peor ejemplo de una violación SECA si lo intentara.
caja el
@boxed ¿Estás tomando mi ejemplo? Porque no estoy seguro de cómo puedes afirmar que estoy violando DRY cuando no tengo implementación. Soy un gran defensor de los principios SÓLIDOS y simplemente no veo cómo llegaste a esa conclusión.
mortalapeman
Está violando DRY al crear una clase innecesaria BatteryCharger que de alguna manera causará un cambio de estado en la batería. Por lo tanto, BatteryCharger aceptará alguna entrada que luego pasará inmediatamente a la batería.
Kevin Cline
9

Evita los significados dobles

Usted ha seleccionado deliberadamente una palabra que tiene más de un significado, y esa primera decisión es el problema. Hay un montón de palabras que son problemáticas para los programadores. Otro ejemplo sería phone. Puede phonealguien, o podría tener uno phoneen su bolsillo.

Usar captadores y setters

El nombre estándar para la mayoría de los objetos son los métodos getters / settings para propiedades.

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

Las propiedades son estados, no sustantivos

Creo que te equivocas al clasificar las propiedades de los objetos como sustantivos, y las variables también podrían pensarse en estados. Son estados relevantes para el alcance local de su existencia.

Podría describir el valor que tienen como sustantivo, pero no estoy seguro de que sea cierto en todos los casos.

En la terminología OOP, las propiedades del objeto describen el estado de ese objeto. En su caso, Batteryes un objeto y Chargees un estado. Eso sería una propiedad del objeto, pero esto depende del contexto de cómo se usa.

Si necesita poder usar Chargela batería y también saber cuál es su corriente Charge, entonces tiene un problema.

Uso del alcance para hacer cumplir el contexto

El contexto es lo que aclarará qué significado de una palabra desea que transmita un método o propiedad. Ámbito es establecer la accesibilidad de una propiedad / método desde fuera del objeto.

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

Los métodos son verbos

Puede describir el método de un objeto como un verbo, pero la palabra acción es más adecuada. En la terminología de OOP, realiza acciones sobre objetos utilizando sus métodos. Es una mala forma modificar la propiedad de un objeto desde fuera del objeto. Se prefiere llamar a un método que realice las acciones necesarias que provoquen cambios en su estado.

La palabra Chargees un verbo, pero también es un sustantivo. Cuando se usa para llamar al método de una acción, queda claro que se está usando el verbo Battery.Charge(....).

Pero, el contexto es muy importante. Si bien la palabra Charge()es un verbo, no es tan significativa como startCharging().

Métodos válidos para Batterypodría incluir Charging, Discharging, setCharge, getCharge, hasCharge, Dischargey Charged.

Métodos simples palabras una frecuencia no se indica explícitamente sus acciones claridad, pero hay algunos casos como openy closedonde se requiere poca explicación.

Entonces, no hay realmente una respuesta correcta sobre cómo nombrar estos tipos de propiedades / métodos. Excepto que debe usar las técnicas anteriores con prudencia para asegurarse de que no haya confusión.

Reactgular
fuente
2
Para el registro, el cliente es el que está usando la terminología ambigua. No creé ese desastre. :-) Planteé la pregunta ya que pensé que podría no ser la única persona que entrara en tal situación. Tienes algunos puntos válidos en tu respuesta. , En este caso en particular, no estamos trabajando en la granularidad de tiempo que StartCharge()e EndCharge()implicaría. De hecho, esa terminología agregaría una sobrecarga significativa al manejo del sistema de batería. En cada intervalo puede Charge()o bien Discharge().
1
La lucha principal es mantener la semántica de programación interna sincronizada con la terminología que está utilizando el cliente. ChargeResulta ser la palabra ambigua más fácil de entender para este dominio. Hay varios otros.
6

Añádelos con verbos que los harán verbos o sustantivos.

Battery.doCharge()

Battery.getCharge()
Jürgen Paul
fuente
4

Para el caso verbal, creo que Chargeestá bien. Para el caso sustantivo, ¿ getCurrentChargeLevelfuncionaría para usted?

FrustratedWithFormsDesigner
fuente
No estoy seguro de eso. Dado que estamos usando C #, podemos declarar get y set en la Propiedad en lugar de necesitar funciones separadas. Independientemente de eso, me preocupa el mantenimiento y cómo se verá una vez que haya olvidado lo que escribí. ¿ getCurrentChargeLevel()Todavía no tendría que referirse a una variable interna de Battery, y cuál sería el nombre de esa variable?
¿se carga una tensión o un porcentaje?
mhoran_psprep
1
@ GlenH7: Ah, ya veo. No especificó C # y mi cerebro está en modo Java. Bueno, de cualquier manera, creo que para el sustantivo que representa la cantidad de carga actualmente en la batería, algo similar Battery.currentChargeLevelpodría funcionar. Podría intentar usar Battery.coloumbso Battery.ampereHourspero eso podría no ser tan obvio ...
FrustratedWithFormsDesigner
1
@mhoran_psprep, tampoco. ;-) Chargees Energycuál es Power(Voltios * Amperios == Vatios) multiplicado por el tiempo. Entonces, en este caso, el cargo es un número. También hay un estado de carga que resulta ser un porcentaje.
@FrustratedWithFormsDesigner: sí, dejé C # fuera porque pensé que el caso de la esquina más amplia era aplicable independientemente del idioma. Watt*timedefinitivamente no se alinearía con las conversaciones de diseño, pero lo ChargeLevelharía.
0

En la mayoría de los casos, agregar un verbo, adverbio o adjetivo de ayuda es lo suficientemente bueno como para distinguirlos y en realidad puede ayudar con la comprensión. Con su caso de carga y carga () en una batería, DeltaCharge () podría mostrar que es una función que puede manejar la carga o la descarga.

Delta (en los casos en que hay un cambio pero ambiguo) es un modificador que uso y recomiendo a otros todo el tiempo para entregar un cambio de estado (incluso si el verbo es semi-obvio).

Jeff Langemeier
fuente
0

Notación húngara al rescate. Puede tener intChargey fcnCharge(value), por lo tanto, evitar la confusión y no agregar un nombre largo y loco cuando tres letras funcionarán bien.

O simplemente podría usar el mismo nombre y dejar que el IDE lo maneje. Crear un nombre más largo o diferente puede ser igualmente confuso a largo plazo de todos modos.

Ryathal
fuente
+1 para la perspectiva única de la respuesta. Lamentablemente, la notación húngara está explícitamente verboten según nuestras pautas de estilo de código. Eso no cambia el mérito potencial de su respuesta, solo que no puedo usarlo como mi solución real.