Hola invitado         31 Jul, 2010 - 07:50
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Interoperabilidad VFP y .NET lecturas 6092
 Enviado por amby en Lunes, 25 Julio, 2005
General En la actualidad hablamos cada vez más de VFP y .NET. Este escrito y los ejemplos que se publicarán a continuación pretenden mostrar mis experiencias al trabajar con ambas herramientas. Queda mucho por decir. Así que… mantengámonos en contacto, y aprendamos… que hay futuro para este tema.

Interoperabilidad VFP y .NET

Por Amby


Me motivan a escribir sobre este tema los continuos debates en foros de VFP, sobre temas que unen o dividen a Visual FoxPro y .NET.

Para comenzar cualquier análisis sobre el tema, repasaría el enfoque dado por Claudio Lassala, foxero y desarrollador experimentado en C#.NET, actualmente Claudio es MVP en C#.NET. El artículo se titula "Visual FoxPro y .NET: lo mejor de ambos mundos" y se puede leer en idioma español en:http://www.portalfox.com/article.php?sid=1161

En este artículo, Claudio Lassala detalla varias razones por las que se debe enfocar desde un punto de vista constructivo, aprovechando, como el dice, "lo mejor de ambos mundos". Sobre esta base, que en lo personal, yo comparto, les propongo ver algunas características de la Programación Orientada a Objetos desde .NET y desde VFP.

Mis comentarios están basados en un grupo de artículos escritos por el propio Claudio Lassala junto a Markus Egger. Además me he basado en escritos de Cathy Gero, Les Pinter y Rick Strahl. Al final de este escrito se muestran enlaces a sitios y artículos de interés. Vamos al tema.

OOP en VFP y .NET

Aunque consideramos que VFP es un lenguaje construido sobre bases OOP, en realidad VFP admite programación procedural y OOP

Veamos este ejemplo:

VFPVB.NET
LOCAL loObject
loObject = CREATEOBJECT("TestClass")
? loObject.GetCurrentDate()

DEFINE CLASS TestClass AS CUSTOM
  FUNCTION GetCurrentDate()
    RETURN "La fecha es: " + TRANSFORM(DATE())
  ENDFUNC
ENDEFINE
Console.Writeline("La fecha es: "+ Datetime.Today.ToString))

En este caso utilizamos un método de un objeto, que se basa en una clase heredada de una clase base VFP - Custom. A primera vista es un código OOP. Pero estamos utilizando dos funciones Date() y Transform() para devolver la fecha y convertirla en cadena. Estas funciones NO son miembros de objetos, por tanto, es procedural.

En Visual Studio .NET, no hay función Date() ni tampoco Transform() En su lugar hay un objeto DateTime que tiene una cantidad de PM que devuelven la fecha, la hora, etc.

El código VB.NET emplea la función Today para devolver la fecha y Console.WriteLine para mostrar la salida, es el equivalente con "?" de VFP. En C# la diferencia es un punto y coma al final.

Sobre Transform(), vemos como primera diferencia que l dato devuelto por Date() no es un objeto, no tiene PEMs. En .NET, todo es un objeto, por tanto, el valor almacenado en la propiedad Today es un objeto de la clase DateTime. Este objeto, a su vez, tiene PEMs, uno de ellos es el equivalente a Transform() es el método ToString()

Definición de clases

VFPVB.NETC#.NET
DEFINE CLASS TestClass AS Custom
ENDDEFINE
Public Class TestClass
End Class
public class TestClass
{
 }
 
Public Class TestClass
  Inherits Object
End Class 
public class TestClass : Object
{
 } 

Aquí vemos cómo la apariencia es un poco diferente; pero la idea es la misma.

  • VFP y VB.NET emplean una palabra END para indicar término de la definición. C#, por su parte emplea llaves (})
  • Como en .NET todo es objeto, si el compilador encuentra clases que no definen una clase padre, se selecciona automáticamente la clase Object. Se puede indicar de esta forma Inherits Object

Por estos elementos comunes entre las dos herramientas, vemos que los desarrolladores VFP tienen un camino andado cuando van a aprender .NET. Hay más…

Escritura estrictamente tipada

VFPVB.NET
LOCAL oForm
oForm = CreateObject("Form")
oForm = CreateObject("TestClass")
oForm.Show()
Dim oForm as Form
oForm = New Form

En VFP se pueden cometer estos errores, recordemos que la clase TestClass, que fue definida anteriormente, no tiene método Show. Entonces, mientras VFP admite este código en tiempo de diseño y programación, va a fallar en tiempo de ejecución, por su parte, en VS.NET, todo es un objeto; pero no es cualquier objeto. Siempre que los objetos son utilizados, son de una clase determinada.

La palabra clave "Dim" es similar a Local de VFP

En ambos casos existe la cláusula AS; pero no nos debemos confundir. En VFP el compilador ignora esta referencia, se incluyó en VFP 7.0 solo a efectos de IntelliSense.

VFPVB.NET
LOCAL oForm as Object
LOCAL oForm as Form
LOCAL oForm As Object
oForm = "Hola mundo!"
? oForm
Dim oForm As Form
Dim sTest as String
sTest = "Hola mundo!"
oForm = sTest

En .NET si referencia la variable con su tipo. Este código genera error en .NET.

El compilador de VB.NET compara el tipo de variable con el valor asignado, se da cuenta de que es una cadena y no un formulario y no compila.

Una diferencia interesante y es un punto a favor de .NET es que se pueden hacer dos pasos en uno:

Dim oForm As Form = new Form
Dim oForm As New Form 

Se agradecería que VFP aceptara una sintaxis del tipo:

LOCAL oForm = CreateObject("Form") 

Espacios de nombre

Lo más parecido a los espacios de nombre en VFP son las bibliotecas de clases.

Una de las mayores diferencias es que el namespace de una clase forma parte de su nombre

Public Namespace MyNamespace
  Public Class TestClass
  End Class
End Namespace 

Ahora puede instanciar una clase llamada "TestClass." Pero este es sólo el nombre informal de la clase.

Su nombre real es "MyNamespace.TestClass." Cuando utilizar el nombre completo o no depende de la situación. En nuestros ejemplos veremos que para no utilizar los nombres tan largos, se definen al inicio del todo del código.

En C#:

using MyNamespace;

En VB:

Imports MyNamespace 

Después de esta declaración, se puede utilizar el nombre corto, aunque es válido emplear el nombre largo.

Podemos verlo como nuestro:

SET PROCEDURE TO
*-- ó --
SET CLASSLIB TO 

Podemos imaginar que son bibliotecas de clases; pero no es lo mismo. Es mucho más fácil mantener muchos namespaces que muchas bibliotecas de clases. Los namespaces no tienen nada que ver con localización física de archivos.

Pueden ser ordenadas jerárquicamente. Por ejemplo, todas las clases relacionadas con Windows se guardan en System.Windows, todas las relativas a Web, System.Web.

Herencia

A la vista no saltan grandes diferencias, el sentido es el mismo; pero SI hay diferencias.

Como vimos antes en .NET la clase Contacto no indica su clase padre, mientras que en VFP está claramente definido que hereda de Custom

En .NET - Inherits y en VFP AS

En .NET la herencia se indica en una línea nueva, en VFP en la misma instrucción

Heredar y sobreescribir métodos

Si programamos en .NET pensando en VFP y queremos sobreescribir el comportamiento de un método, escribimos el código en la instancia actual y asumimos que el compilador entenderá que debe ignorar lo que existía en la clase padre o alguna en la herencia.

.NET no lo entiende así, entiende que ha habido un accidente, va a ignorar lo instanciado actualmente y ejecutará lo que hay en la herencia, a no ser que se le indique directamente al compilador que explícitamente estamos intentando sobrescribir este comportamiento.

En C# cláusula override y en VB - overrides

Public Class Customer
  Inherits Contact
  Public Overrides Function GetFullName() As String
    Return "Lassala, Claudio"
  End Function
  ... 

Pero aun así no es suficiente. El compilador aun no está satisfecho. El problema está en que al definir el método no se indicó que sería sobreescribible. Esto es nuevo para desarrolladores VFP. El comportamiento predeterminado es NO sobreescribible, se debe a que tiene mayor control y se logra mejor rendimiento.

En C# - palabra clave virtual

En VB.NET, palabra clave Overridable.

Public Class Contact
  Public Overridable Function GetFullName() As String
    Return "Egger, Markus"
  End Function
  ... 

Se pueden sobreescribir clases, este comportamiento si es predeterminado, para el comportamiento contrario se indica sealed (C#) and NotInheritable (VB.NET).

Comparar métodos, propiedades y campos

Además de las diferencias evidentes en cuanto al lenguaje VFP, VB.Net y C# los métodos no son muy diferentes, son acciones que un objeto puede acometer. La llamada de un método en los 3 lenguajes se realiza de igual forma.

En .Net s imprescindible definir el tipo de los parámetros y el tipo retornado por el método.

Hay que especificar si los parámetros se pasan por valor o por referencia. Aquí hay ayuda del IDE de .Net que escribe de forma predeterminada by Value.

En C#, se eliminan las palabras procedure / function y se escribe primero el tipo de parámetro y luego el nombre.

Sobre el valor de retorno

VFP todos los métodos retornan algo, aun cuando se escribe return o no se escribe, se retorna .T.

En C# hay que declarar el Return como void y tendremos entonces un método que no devuelve nada.

En VB.Net existen Sub (subrutinas) que tiene igual comportamiento.

Visibilidad del método

Este es un aspecto en el que nos vemos perjudicados, porque nos podemos confundir, los conceptos son diferentes.

VFP el predeterminado es Public, puede ser Protected y Hidden

VB.Net es igual

C# el predeterminado es Private (visible solo por la clase, invisible para el resto, incluidos sus hijos.)

Recomendación: Indicar siempre la visibilidad porque el predeterminado puede traer un comportamiento completamente diferente en C# y VFP

Nombres de métodos repetidos

En VFP no se admiten nombres de métodos repetidos para un mismo objeto.

En .Net se pueden repetir los métodos, porque cambia la cantidad y tipo de parámetros, esto se conoce como method overlading. Ventaja: No es necesaria ni una línea de código para la verificación del dato.

¿Y cómo podemos ver estos aspectos en la práctica? En los próximos días se irán publicando varios ejemplos de cómo pueden interactuar la herramientas.

  • Consumir en NET datos VFP con OLE DB
  • Consumir componentes COM VFP desde .NET
  • Exponer desde .NET objetos VFP como Servicios Web
  • Consumir Servicios Web .NET desde VFP

Conclusiones

Visual FoxPro es una herramienta de programación de aplicaciones que se encuentra en constante perfeccionamiento.

.NET es una herramienta estable y actual que brinda un conjunto de clases y capacidad integrada de gran utilidad para los desarrolladores.

La mejor perspectiva es sin dudas: "Aprovechar lo mejor de ambos mundos".

Los desarrolladores VFP tienen un gran adelanto a la hora de asimilar y aprender las técnicas de .NET, por la base común de Programación Orientada a Objeto.

Esto es apenas una introducción a partir de mis propias experiencias, queda mucho por decir, estudiar y aprender.

Ver además:

Cuando ya pensaba enviar estas líneas a PortalFox, encontré estos enlaces en la página principal de MS VFP (http://msdn.microsoft.com/vfoxpro).

Quedan citar también dos libros:

Saludos,

Ana María Bisbé York
www.amby.net


 Versión imprimible  
Interoperabilidad VFP y .NET | Entrar/Crear una cuenta | 0 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.



Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.