/*
 * $Id: strotype.txt 6073 2003-07-13 16:24:32Z alex_degarate $
 */

/*
 * Las siguientes partes son derechos adquiridos de sus autores individuales.
 * www - http://www.harbour-project.org
 *
 * Copyright 2001
 *   Documentacin en Ingls de: strotype.txt
 *
 * Copyright 2002 Alejandro de Grate <alex_degarate@hotmail.com>
 *   Documentacin en Espaol de: strotype.txt
 *
 * Vea doc/license.txt por los trminos de la licencia.
 *
 */

/*  $DOC$
 *  $FUNCNAME$
 *      Fuertemente tipeado
 *  $CATEGORY$
 *      Documento 
 *  $ONELINER$
 *      Chequeo de Tipo en Tiempo de Compilacin
 *  $DESCRIPTION$
 *      El Strong Type Checking, podra ser tambin descripto como 
 *      "Chequeo de tipo en Tiempo de Compilacin". 
 *      Como Ud. podra saber Clipper genera un error en Tiempo de Ejecucin
 *      ("Type Mismatch") cuando nosotros intentamos realizar algunas 
 *      operaciones con el tipo equivocado de variable.
 *      
 *      Ejemplos:
 *
 *      LOCAL Var1 := "A"
 *
 *      ? Var1 * 3       // Error 
 *
 *      @ Var1, 7 SAY 'Hello'   // Error 
 *
 *      ? SubStr( "Hello", Var1 ) // Error 
 *      
 *      Las 3 lneas superiores podran todas resultar en un error de Tiempo 
 *      de Ejecucin, porque Var1 es del tipo CHARACTER, pero las lneas de
 *      arriba la usan como si fuera del tipo NUMERIC.
 *      
 *      Usando un chequeo de Tipo Fuerte,  Chequeo de Tipo en Tiempo de 
 *      Compilacin, el problema de arriba podra haber sido descubierto y
 *      y reportado en tiempo de compilacin, antes que esperar que el 
 *      inevitable problema sea descubierto cuando finalmente nosotros 
 *      ejecutemos el programa.
 *      
 *      Los lenguajes fuertemente tipeados permiten al programador "decirle"
 *      al compilador (declarar) cual es el tipo de cada variable, as el
 *      compilador puede advertirle al programador, cuando esa variable
 *      declarada (Strong Typed), es usada en un contexto el cual es 
 *      incompatible con su tipo declarado.
 *      
 *      Por ejemplo si nosotros le "contamos" al compilador que la Var1 de
 *      arriba es del tipo CHARACTER (LOCAL Var1 AS CHARACTER), el compilador
 *      de Harbour, podra en devolucin advertirnos que nosotros intentamos
 *      realizar el calculo:
 *
 *      Var1 * 3
 *      
 *      porque el compilador sabe que nosotros no podemos realizar la 
 *      mutiplicacin de un CHARACTER. (Nosotros podramos hacerlo en algn
 *      contexto pero eso esta mas all del alcance de esta discusin).
 *      Similarmente nosotros podramos haber sido advertidos cuando 
 *      intentamos usar Var1 como un numero de Fila ( @ Var1 ),  como el
 *      segundo operando de la funcin SUBSTR(), SUBSTR( "Hello", Var1)
 *      porque el compilador sabe que esas operaciones requieren un tipo
 *      NUMERIC antes que CHARACTER.
 *      
 *      Lo de arriba puede ahorrarnos un montn de tiempo, sealandonos un
 *      problema del cual no podemos escapar, porque ese cdigo nunca 
 *      funcionar correctamente una vez ejecutado.
 *      As que antes de esperar al ciclo de testeo, para que tales problemas
 *      sean descubiertos, (y algunas veces an despus de que nosotros 
 *      hemos distribuido nuestras aplicaciones) en su lugar nosotros podemos
 *      saber de esos problemas tan pronto como nosotros tipeamos:
 *      
 *           HARBOUR ProgName -w3
 *      
 *      Harbour tambin ofrece un modo hbrido, donde puede reportar este
 *      tipo de problemas, an sin el requerimiento que el programador 
 *      declare el tipo de variables. Esta caracterstica es referida como
 *      Chequeo Adaptativo de Tipo (Adaptive Type Checking).
 *      No es necesario que el programador haga ningn cambio en el cdigo
 *      para tomar ventaja de sta caracterstica. Todos los 3 errores de
 *      arriba podran haber sido reportados tan efectivamente como si el
 *      programador hubiera declarado Var1 como de Tipo Fuerte.
 *      
 *      Harbour podra haber sido capaz de reportar tales problemas en 
 *      tiempo de compilacin, porque la asignacin Var1 := "A" implica que
 *      Var1 es del tipo CHARACTER, hasta que a sta le sea asignado otro
 *      valor. As entonces Harbour podra "recordar" que Var1 a "adaptado"
 *      el tipo CHARACTER, y as la multiplicacin subsecuente   Var1 * 3
 *      ser reportada como un error, tan pronto como Ud. intente compilar
 *      tal cdigo.
 *      
 *      La parte hermosa de este modo hbrido, es que a diferencia de las 
 *      variables Strong Typed, Ud. no tiene que declarar el cdigo, as
 *      que no son necesarios cambios en el cdigo fuente, el Tipo en su
 *      lugar es asumido por implicacin (el Tipo del valor asignado).
 *      El otro beneficio es que, es completamente correcto asignar un nuevo
 *      valor de diferente tipo, en cualquier momento, a esa variable no
 *      declarada (variante). Tan pronto como nosotros asignemos un nuevo
 *      tipo, el compilador entonces nos proteger de usar la variable en un
 *      contexto incompatible, dado que la variable a "adaptado" este Tipo 
 *      tan pronto como nosotros le hemos asignado un valor, el cual implica
 *      un Tipo.
 *      
 *      Mientras el Chequeo Adaptativo de Tipo puede ser completamente 
 *      efectivo en reportar muchos errores comunes, para tener todos los 
 *      beneficios del Chequeo en Tiempo de Compilacin es recomendado 
 *      declarar el Tipo de las variables, cuando sea posible.
 *      
 *      Las caractersticas del Tipo fuerte (Strong Type), tambin permiten
 *      la declaracin de parmetros esperados (incluyendo opcionales) de las
 *      funciones definidas por el usuario, asi como tambin el tipo 
 *      retornado.
 *      Similarmente, Ud. puede declarar el tipo de cualquier variable de
 *      Clase, Mtodos y Parmetros de Mtodos.
 *
 *  $END$
 */  
 

