https://foro.gambas-es.org/viewtopic.php?f=1&t=2167&p=12462#p12462
-----------------------------------
fabianfv
Martes, 07 Febrero 2012, 16:29

Re: Nombre De Las Variables.Traducciones Y Demas Palabras Rebuscadas
-----------------------------------
Hola Shell, viene bien tu consulta para revisar un poco este tema.

Este tipo de notaciones o convenciones de nombre en las que se pone énfasis en que el nombre contenga prefijos que indiquen su tipo de datos, proviene de lenguajes como C que son débilmente tipificados y en los que el ámbito de una variable puede ser muy amplio.

Si en un programa se usan variables globales resulta muy importante saber con sólo leer su nombre qué tipo de datos se pueden almacenar en ella, porque la declaración de las variables no suele estar a la vista del programador cuando éste escribe código que las usa.

Si lenguaje es débilmente tipificado o directamente no tipificado, puede resultar aún más importante porque de lo contrario el programador podría guardar datos de tipos incorrectos en la variable y ello llevaría a un error que sólo se manifestaría en tiempo de ejecución.

Ahora bien, en Gambas las variables globales no existen y si el programador comprende mínimamente que la mejor forma de tratar con la complejidad es hacer que las unidades de programa (módulos, funciones, procedimientos, clases, métodos) sean realmente lo más pequeñas e independientes que sea posible, entonces, el problema desaparece.

Veamos, si al escribir un método o función el programador sabe que ese código debe ser breve (entre 15 y 20 líneas para dar una métrica fácilmente comprensible), entonces siempre tendrá a la vista la declaración de las variables locales, por lo que no es necesario usar prefijos que indiquen su tipo de datos.

Si al escribir una clase el programador aplica la misma idea (no más de 50 líneas) resulta que la declaración de las variables también queda a la vista. Además fácilmente puede utilizar la característica de ocultamiento del editor de código para sólo ver las signaturas de los métodos y la declaración de variables de la clase. Lo mismo aplica si lo que está escribiendo es un módulo.

Entonces, no es necesaria una convención de nombres compleja. Lo más importante usar UpperCamelCase o lowerCamelCase para que los nombres sean fácilmente legibles.

Hay otra cuestión y es que Gambas no maneja espacios de nombres. El problema se da, por ejemplo, cuando se debe declarar una propiedad y una variable privada asociada o un parámetro real cuyo valor se debe asignar a una variable privada, porque no pueden tener el mismo nombre y no se pueden distinguir usando una letra mayúscula o minúscula en una de ellas (porque Gambas no es "case sensitive"):

[code linenumbers=false syntax=gambas]
'Este código no es válido
Private Nombre AS String

Property Nombre AS String
[/code]


[code linenumbers=false syntax=gambas]
'Este código tampoco es válido
Private nombre AS String

Property Nombre AS String
[/code]

Entonces, estamos obligados a escribir dos identificadores diferentes y aprovechando esa situación lo que solemos hacer es colocar como prefijo de la variable privada un signo pesos:

[code linenumbers=false syntax=gambas]
'Este código sí es válido
Private $Nombre AS String

Property Nombre AS String
[/code]

Pero tal convención no es necesaria realmente para indicar el ámbito de la variable (que en este caso es privada) sino para evitar la doble declaración del mismo identificador.

Otro ejemplo típico es:

[code linenumbers=false syntax=gambas]
Private Nombre AS String

'Este código no es válido porque se repite la declaración del identificador Nombre
Public Sub _new(Nombre AS String)
  Nombre = Nombre
End

Public sub DiTuNombre()
  Print Nombre
End
[/code]

[b]El caso anterior es problemático porque Gambas no lo maneja bien. Gambas no nos advertirá de ningún problema, pero lo que obtendremos es un error lógico: al ejecutar el método DiTuNombre la variable Nombre contiene una cadena vacía.[/b]

En conclusión, las convenciones de nombres que utilizan prefijos para indicar el tipo de datos de una variable o su ámbito no son realmente necesarias si el programador escribe código bien modularizado. Sin embargo, necesitamos recordar que debemos usar identificadores distintos para una propiedad y su variable privada asociada o para un parámetro cuyo valor inicializará a una varible privada.

Un caso en que sí puede ser útil utilizar un prefijo es para distinguir arrays o colecciones de variables simples porque distinguirlas sólo con Plural/Singular puede ser propenso a errores.

[code linenumbers=false syntax=gambas]
Private $Persona AS Persona

Private $Personas AS Persona[]

Public sub HagoAlgo()
  ...
  'Es fácil cometer este error:
  $Persona.Count
End
[/code]

[code linenumbers=false syntax=gambas]
Private $Persona AS Persona

'La a significa Array, si fuera una colección usaríamos $cPersonas
Private $aPersonas AS Persona[]

Public sub HagoAlgo()
  ...
  'Ahora es un poquito más difícil cometer este error:
  $Persona.Count
End
[/code]


Saludos.

[b]PD: este tema deberías haberlo puesto en el foro General no en OffTopic[/b]


