.NET Chronicles

Temas relacionados con el desarrollo de aplicaciones con .NET

Octavio Telis

Uso de Propiedades en lugar de Variables Globales

Hola ¿Qué tal?…


Ahora que hemos estado hablando de variables globales y de no utilizarlas porque ya no son más necesarias dada las nuevas características de Visual Basic.NET, inclusive de C#, primeramente tendré que explicar cómo funcionan las variables globales en Visual Basic .NET y además, dejar una alternativa eficiente para sustituir su uso, dejando a ustedes la libertad de usar la que más les convenga.


Bueno, quisiera explicar cómo se utilizan las variables globales en Visual Basic.NET y qué es lo que pasa atrás de todo eso al compilarse una aplicación de Visual Basic.NET.


Para declarar una variable global en Visual Basic.NET se agrega un module al proyecto, como en Visual Basic 6. En este module se escriben las variables y los métodos como se hacía en VB6, no es raro que sea posible dada la compatibilidad de escritura de código con las versiones anteriores al .NET Framework, sin embargo no es tal cual era en VB6, el detalle es que el compilador de VB.NET convertirá ese module en una clase con miembros estáticos, lo que no es tan malo si pensamos que el contenido está compuesto de puros métodos, ya que los métodos estáticos (shared en Visual Basic) son útiles para tareas frecuentes donde no vale la pena utilizar una instancia para usarlos, el problema está en el uso de las variables públicas, que en este caso serán compilados como campos estáticos (shared en Visual Basic) de la clase. Estos campos estáticos estaran disponibles con sus valores para ser utilizados en la aplicación, en cualquier momento. Estos campos estarán ocupando un espacio en memoria en todo momento con el contenido que se les haya definido o asignado, no es tan malo a primera vista, sin embargo, el rendimiento de una aplicación se verá afectado en proporción a la cantidad de campos estáticos que estén presentes en estos modules. Además, los campos estáticos delimitan la portabilidad de la aplicación, pensando en portar la funcionalidad de una aplicación Windows a Web, ya que en web el estado de estas variables no se mantiene entre llamadas (post back) al servidor como podría esperarse. Así que si la funcionalidad se basa en el uso de campos estáticos (como si de variables globales se tratara) entonces implicaría un rediseño de la funcionalidad para web. Pero… ¿Qué pasa con los métodos estáticos?, ¿por qué no son tan malos?, bueno, la funcionalidad de un método estático está basada en la ejecución de un bloque de código en el instante en que se requiere sin esperar que guarde algún estado, esto es, que se utiliza como funcionalidad volátil, solo para lo que es y listo, dejando que el Garbage Collector se encargue de las variables que han perdido ámbito dentro del método, estos métodos son también útiles en Web, ya que se utilizan mientras se ejecuta la llamada en el servidor. Es obvio que no toda la funcionalidad puede dejarse expuesta en métodos estáticos según la naturaleza de cada aplicación o componente, ya que habrá situaciones en las que sea requerida una instancia para utilizar un método debido a los distintos escenarios de inicialización de una clase.


Ok, pensemos en Windows Forms, que es donde más se utilizan las variables globales y donde más se extrañan. Si queremos disponer de cierto valor generado en un formulario y pasarlo a otro, se pueden utilizar las propiedades, sin embargo, el uso de toda esta metodología obliga a la definición de la aplicación basado en el flujo de información, esto es, no disponemos ya de los formularios como lo hacíamos en VB6, el formulario que se quiere utilizar, ahora se debe hacer por medio de instancias. Bien, pensemos en un formulario principal, si he de pasar un valor definido en el formulario principal a un formulario secundario, puedo hacerlo pasando el valor a través de una propiedad definida en el formulario secundario, es muy simple, solo debemos definir la propiedad en el formulario secundario y  utilizarla con la variable de instancia declarada en el formulario principal, el cual lanzará al formulario secundario, como se muestra en el siguiente código:


En el formulario principal (Form1):

    Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
        Dim frm As Form2 = New Form2()
        frm.Identificador = 2
        frm.Show()

    End Sub


En el formulario secundario (Form2):

    Private mIdentificador As Integer
    Public Property Identificador() As Integer
        Get
            Return mIdentificador
        End Get
        Set(ByVal value As Integer)
            mIdentificador = value
        End Set

    End Property


En el formulario secundario (Form2), se tiene declarada una propiedad denominada Identificador, las propiedades comúnmente se apoyan de un campo privado en el cual almacenan el valor de entrada obtenido por el bloque Get de la propiedad. Este campo privado, se puede utilizar en cualquier parte de la clase sin problemas, por lo que la información estará disponible en todo momento en toda la clase Form2, así, no tendremos necesidad de una variable global, ya que la información ya la tengo al alcance pero de manera local, esto es, en la clase que la necesitaba y no estará disponible para todas las clases de la aplicación a pesar de la requieran o no.


Las propiedades dependen de una variable para almacenar el valor de entrada y para exponer el valor de salida y para trabajar con estos valores en otras partes de la clase, sin embargo, hablando de formularios, ese valor puede ser almacenado en la propiedad de algún otro objeto, por ejemplo, en la propiedad Text de una caja de texto o de una etiqueta, veamos el equivalente a la propiedad anterior utilizando un TextBox llamado TextBox1:

    Public Property Identificador() As Integer
        Get
            Dim int As Integer
            Try
                int = Integer.Parse(TextBox1.Text)
            Catch ex As Exception
                int = -1
            End Try
            Return int
        End Get
        Set(ByVal value As Integer)
            TextBox1.Text = value.ToString()
        End Set

    End Property


Bien, esto podría ser otra opción para utilizar las propiedades, vemos aquí que se utiliza el TextBox1 directamente para manejar los valores, así pues, al utilizar la propiedad desde el Formulario principal, entonces la mostrar el formulario se mostrará con el valor asignado en el TextBox1.


El uso de las propiedades no es tan difícil, ni implica dificultad alguna, seguro podrán ver las ventajas de utilizar propiedades propias en sus formularios, pues tendrán un medio de comunicación con sus formularios. El canal de comunicación se cierra con las respuestas, y esto se logra a través de eventos, por lo que pueden consultar dentro de este blog el post acerca de delegados y eventos para ver ese forma de comunicación.


Ahora, a diferencia de VB6, podemos ver a los formularios como clases, y como tales, podemos extenderlas a nuestras necesidades, bueno… esto también era posible en VB6, así que, les recomiendo que si ven una buena oportunidad para utilizarlas, no lo duden, seguro que encontrarán grandes ventajas en ello.


Con lo que respecta a las variables globales, quiero dejar aquí una opción para sustituirlas de forma eficiente, en un futuro, mostraré otra manera de evitar el uso de variables globales, o bien, sustituirlas por un método eficiente alternativo.


Saludos…


Octavio Telis

5 Responses to Uso de Propiedades en lugar de Variables Globales

  • Fausto says:

    Muy buena informacion para novatos como yo en lo que es la programacion.

  • Vinicio says:

    Que bueno esta este post felicitaciones por el conocimiento alcanzado y gracias por compartirlo…

  • Marco Antonio Castro Suárez says:

    felicitaciones, sin embargo el uso de propiedades abarca más campos que solamente usarlos en formularios, pues es más funcional cuando se utilizan clases…

  • Marco Antonio Zaragoza says:

    yo tengo una dificultad con mi jefe ya que el desaprueba el uso de propiedades argumentado que requieren un procesamiento mayor y más código pidiendo declarar esas variables como Public.

    yo prefiero usar las propiedades ya que me permiten validar el valor antes de asignarlo y porque los valores de resultado permanecen ReadOnly dandole (creo yo) más estabilidad y seguridad.

    que opinas al respecto?

  • erick alvarez says:

    este problema me tope, y entiendo lo que expones, ahora mi pregunta es, se puede poner esta propiedad en una clase que tengo para todo mi aplicacion y desde el formulario principal instanciar la propiedad de la clase y darle un valor y en mi formulario secundario, instanciar la propiedad y recoger el valor ?, es lo mismo que expones, es correcta esa manera, o seria mejor como lo expones?

Leave a Reply

Your email address will not be published. Required fields are marked *


*

.NET Chronicles
  • Eventos del Teclado en WPF July 22, 2015
      Hola ¿qué tal? En esta ocasión como como continuidad a lo que previamente había escrito sobre los eventos del teclado en Windows Forms, haré un artículo sobre el uso de los eventos del teclado en WPF, así es en Windows Presentation Foundation. No es desconocido por muchos que el nuevo estándar de desarrollo de […]
  • Programación Orientada a Objetos (Introducción) May 14, 2014
    Hola qué tal… Aquí les dejo este video sobre la programación orientada a objetos, a manera de preámbulo a los siguientes videos, con las bases de la programación en C# y otra línea con algunas utilerías. Saludos… Octavio Telis
  • Capítulo piloto del la versión en video de .NET Chronicles May 6, 2014
    Hola qué tal??? Pues en esta ocasión estoy compartiendo con ustedes la liga de un video piloto, con el que pretendo comunicar un poco más sobre las tecnologías .NET y los lenguajes de Programación. En esta ocasión será con la presentación de C#, en un capitulo titulado “Te presento a C#”, espero que sea de […]
  • Validación de datos de entrada con enlace a datos en WPF May 27, 2012
    Tweet Hola, qué tal. Ya que he venido hablando del enlace a datos en WPF en las publicaciones anteriores, bien convendría considerar el uso del Binding para validar datos, hemos tocado ya algunos puntos necesarios para escribir esta funcionalidad. En las publicaciones anteriores vimos ya como enlazar los datos, además, cómo convertir los datos, ahora, […]
  • Uso de la propiedad Visibility con valores booleanos en WPF May 25, 2012
    Tweet    Hola que tal. En esta ocasión quiero compartir con ustedes una manera para utilizar la propiedad Visibility con un valor bool. Te preguntarás “¿Y qué sentido tiene eso?”, bien, el detalles está en que en ocasiones se requiere que la visibilidad de un control de la interfaz de usuario responda a un valor […]
  • Conversión de Valores con Enlace a Datos May 24, 2012
    Tweet     Hola que tal. En el diseño de aplicaciones con WPF tendremos muchas ventajas en cuanto a la interfaz de usuario se refiere, dado que es un modelo muy flexible, nos permite dar formato y estilo a la apariencia de la interfaz de usuario, logrando aplicaciones más agradables, vistosas y que mejoran por mucho […]
  • Mostrar archivos de imagen en WPF utilizando enlace a datos. May 23, 2012
    Tweet Holal Qué tal. Continuando con el ejemplo del post anterior (http://bit.ly/oh0m9k), referente al manejo de imágenes en WPF, ejemplificaremos el manejo de las imágenes de la misma manera pero, esta vez, utilizando enlace a datos y la clase Binding. Antes, tenemos que hablar un poco de lo que es el enlace a datos con […]
  • Mostrar archivos de imagen en WPF August 26, 2011
    Hola Qué Tal… En esta ocasión quiero comenzar una serie de artículos sobre el manejo de archivos de imágenes con .NET. En esta primera parte voy a tratar la manera de cargar un archivo de imagen en un contenedor de imagen, en este caso usaré WPF y el control Image que viene incluido en el […]
  • Comparar dos DataTables según sus DataRows August 23, 2011
    Hola que tal. En ocasiones es necesario comparar el contenido de dos DataTable para determinar qué registros (DataRow) están en una y en otra no. Supongamos tenemos dos DataTable; dt1 y dt2, ambas con el mismo esquema. La tabla dt2 contiene más registros que la taba dt1, por lo que deseamos saber qué registros de […]
  • Arquitectura – Definición de un Data Access Component (con un ejemplo) Parte 3 May 14, 2010
    Hola Qué Tal? En esta ocasión, no he dejado pasar tanto tiempo para terminar la trilogía del uso de Data Access Component con un ejemplo. Bien, pues en este artículo veremos el uso del componente ya creado, cómo extenderemos la funcionalidad del componente y cómo lo aplicamos en la interfaz de usuario. Primeramente, debemos crear […]