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

46

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 estemos discutiendo la aplicación, se usará ambas en la misma oración.

Mi intención es asegurarme de que el programa seguirá siendo legible para los futuros desarrolladores y para mí cuando regrese a las secciones del código meses más tarde.

Uno de los ejemplos es con un battery . Un battery tiene un charge y también puedes charge() a batería.

Creo que tener tanto Battery.Charge como Battery.Charge(value) será confuso para los 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 la variable Battery object y la función para charge no se alineará con las discusiones de diseño que involucran a 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ó el detalle de mi pregunta.

pregunta GlenH7 25.01.2013 - 20:40

7 respuestas

38

En situaciones similares trato de encontrar sinónimos. En este caso yo 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. En el nivel de la máquina, las funciones no mutantes hacen algo, pero a nivel del modelo, no lo hacen.

    
respondido por el kevin cline 25.01.2013 - 21:03
20

Solo estoy lanzando esto, pero quizás la solución para esta instancia de nombrar ambigüedad 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 desconectadas y hacer que la acción sea más explícita.

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

Para mí, el segundo formulario es mucho más comprensible y mantiene todo su código de "Carga" en un solo lugar en lugar de rociarlo en todas las clases de baterías.

    
respondido por el mortalapeman 26.01.2013 - 18:37
8

Evita los significados dobles

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 phone alguien, o podría tener phone en su bolsillo.

Usar Getters y Setters

La denominación estándar para la mayoría de los objetos son los métodos de obtención / configuración de las 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 son nombres

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 al alcance local de su existencia.

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

En la terminología de la POO, las propiedades del objeto describen el estado de ese objeto. En su caso, el Battery es un objeto, y el Charge es un estado. Entonces, eso sería una propiedad del objeto, pero esto depende del contexto de cómo se usa.

Si necesita poder Charge la batería, y también saber qué es Charge actual, entonces tiene un problema.

Usando el alcance para imponer el contexto

Contexto es lo que aclarará qué significado de una palabra quiere transmitir a un método o propiedad. El alcance 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 OOP, realiza acciones sobre objetos utilizando sus métodos. Es una mala forma modificar la propiedad de un objeto desde fuera del objeto. Es preferible llamar a un método que realice las acciones necesarias que hacen que cambie su estado.

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

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

Los métodos válidos para Battery podrían incluir Charging , Discharging , setCharge , getCharge , hasCharge , Discharge y Charged .

Los métodos simples de una palabra a menudo no expresan explícitamente sus acciones, pero hay algunos casos como open y close donde se requieren pocas explicaciones.

Entonces, realmente no hay 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.

    
respondido por el cgTag 26.01.2013 - 20:10
6

Propóngalos con verbos que los convertirán en un verbo o un sustantivo.

Battery.doCharge()

Battery.getCharge()
    
respondido por el Jürgen Paul 31.01.2013 - 20:53
4

Para el caso del verbo, creo que Charge está bien. Para el caso del sustantivo, getCurrentChargeLevel trabajaría para usted?

    
respondido por el FrustratedWithFormsDesigner 25.01.2013 - 20:43
0

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

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

    
respondido por el Jeff Langemeier 25.01.2013 - 22:45
0

Notación húngara al rescate. Puede tener intCharge y fcnCharge(value) , evitando así la confusión y no agregando un nombre largo loco cuando tres letras funcionarán bien.

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

    
respondido por el Ryathal 25.01.2013 - 22:54

Lea otras preguntas en las etiquetas