El real valor de las certificaciones del mundo informático de sus realidades, mitos y proyección opiniónnº3 abril 2004 • Precio: 6,00 € España Visual Studio 2005 y SQL Server 2005 Whidbe
Trang 1El real valor de las certificaciones del mundo informático (de sus realidades, mitos y proyección) opinión
nº3 abril 2004 • Precio: 6,00 € (España)
Visual Studio 2005 y SQL Server 2005
Whidbey y Yukon ya tienen nombre
El poder de la reflexión en NET
Generación de tipos en tiempo de ejecución
Visual Studio 2005 y SQL Server 2005
Whidbey y Yukon ya tienen nombre
El poder de la reflexión en NET
Generación de tipos en tiempo de ejecución
Laboratorio Crystal Enterprise v10 Open Source
datNet Comunidades Concurso de creación de páginas Web con ASP.NET
Laboratorio Crystal Enterprise v10 Open Source
datNet Comunidades Concurso de creación de páginas Web con ASP.NET
Equivalencia de instrucciones
de C# y VB NET (y III) • Configuración de aplicaciones Web de ASP.NET
• Gestión de concurrencia en ADO.NET • Introducción a GDI+ • SQL-Server Diseñar la estrategia de copias de
seguridad y restauraciones •
El Señor Arquitecto
Equivalencia de instrucciones
de C# y VB NET (y III) • Configuración de aplicaciones Web de ASP.NET
• Gestión de concurrencia en ADO.NET • Introducción a GDI+ • SQL-Server Diseñar la estrategia de copias de
seguridad y restauraciones •
El Señor Arquitecto
dotNetManía
Visual Basic.NET • C# • Delphi • ASP.NET • ADO.NET • NET Framework • Windows Server System
Trang 3Por supuesto, la noticia del mes es el retraso quesufrirán los lanzamientos de Whidbey y Yukon que
se trasladan a mediados del 2005 y que saldrán almercado conjuntamente bajo los nombres VisualStudio 2005 y SQL Server 2005 Algunos usuarioshan mostrado su malestar al respecto, puesto quehabían pagado por el programa Software Assurancedurante tres años sin recibir ninguna actualizaciónprincipal a cambio Luego están los que se preocu-pan por el soporte de las versiones actuales que pue-den terminar de ofrecerse con poca diferencia conlas versiones nuevas Otros opinan que lo mejor esque el software salga al mercado cuando realmenteesté listo y que esto es mejor aunque haya que espe-rar algo más Pero es que todo esto afecta a tantascosas que sería mejor que estos chicos de Microsoftafinasen más, si bien es cierto, que yo me encuentroentre los que opinan que los lanzamientos precipi-tados para cumplir fechas son a la larga peores paralos usuarios
Acabamos de recibir la noticia de la multa decasi 500 millones de euros (la más alta impuestahasta ahora por este organismo) que la ComisiónEuropea ha impuesto a Microsoft por supuestoabuso de posición dominante en el mercado euro-peo Ahora se iniciará una nueva, larga y aburridabatalla legal, por supuesto Esto viene después deque Steve Ballmer hiciera un viaje inesperado aBruselas, cancelando su keynote en el Summit elmiércoles 17, en la que se especulaba que habríauna demo de Indy, para intentar llegar a una sali-
da negociada que finalmente no fue posible
¿Tendremos un Windows europeo distinto del
res-to? ¿Esta Comisión no debería ser más dura conotros monopolios de hecho que sufrimos los usua-rios de manera sangrante? ¿Lo han hecho en bene-ficio de los usuarios o de los competidores deMicrosoft? Me consta que los fabricantes de RealPlayer, Real Networks están muy satisfechos
Personalmente a mí me importa poco si Windowslleva o no Windows Media Player, de todas formas
yo uso Winamp, pero un sistema operativo debeser capaz de abrir el máximo tipo de archivos posi-ble ¿Harán lo mismo con los visualizadores deotros tipos de archivos? ¿Es mejor para los usua-rios un sistema operativo incapaz de abrir archi-vos en aras a que la competencia pueda vender susvisores?
No quisiera terminar sin tener un sentidorecuerdo para las víctimas y sus familiares y ami-gos del atentado cometido por seres humanos enMadrid el 11 de marzo Extraña palabra la palabra
“humanidad” que suele usarse como aglutinadora
de todos los buenos sentimientos que sólo loshumanos podemos sentir Me pregunto si tambiéndebería servir para aglutinar todo lo malo que sólolos humanos podemos hacer Sólo un humano pue-
de ser tan despiadado ¿Fue, pues, éste un acto de
“humanidad”? Cómo me avergüenza pertenecer a
la misma especie animal que alguno de mis géneres No debemos olvidar tampoco a los muer-tos en Nueva York, en Irak, en Afganistán, en Pales-tina, en Israel, y en tantos sitios donde mueren ino-centes y no tan inocentes a manos de asesinos lega-les o ilegales ¿en nombre de quién? Desde luego
Alejandro Mezcua, Angel Esteban,
Antonio Quirós, Antonio Rojo, David
Carmona, Eladio Rincón, Francisco
Charte, Fernando Guerrero, Fernando Nogueras, Guillermo ‘guille’ Som, Iván González, Jesús López, Jordi Rambla, Jorge Serrano, José Manuel Alarcón, Juan Torres, Liborio López, Luis Miguel Blan-
co, Marino Posadas, Miguel Egea, Miguel Katrib, Pablo Abbate, Pedro Gómez, Pedro Pozo, Pepe Hevia, Salvador Ramos
Diseño y Maquetación
Éride Diseño Gráfico Tel.: (34) 91 477 48 85 eride@eride.net • www.eride.net
Edita
Netalia c/ Robledal, 135
28529 Rivas-Vaciamadrid (Madrid)
Tf (34) 91 6667477 Fax (34) 91 4991364
Imprime
Gráficas Vallehermoso www.graficasvallehermoso.com
Trang 4El real valor de las certificaciones del mundo informático 8-10 (de sus realidades, mitos y proyección)
El mundo de las certificaciones IT, casi desde su aparición ha generado
controversia, entusiastas y detractores.
Equivalencia de instrucciones de C# y VB NET (y III) 11-14
Cómo hacer las mismas cosas (o casi) en C# y Visual Basic NET
Tercera y última entrega de esta serie de artículos en la que hemos pretendido explicarle
cómo hacer las mismas cosas (o casi) tanto en C# como en Visual Basic NET
En versiones anteriores de la tecnología ASP, la configuración de aplicaciones Web
se realizaba de forma muy distinta En este artículo damos un breve repaso a las
opciones principales de configuración de ASP.NET
La concurrencia, en un entorno multiusuario, es siempre una cuestión
problemática, pero si además se trata de un entorno desconectado como el que se
usa en ADO.NET con sus DataSets y DataAdapters, la problemática es aún
mayor debido a la propia naturaleza desconectada del entorno.
Este trabajo muestra cómo usando reflection se define un conversor de tipos que
permite a partir de un objeto, el cual comparte una misma funcionalidad con un
interface, obtener un objeto proxy equivalente en funcionalidad al original pero
que garantiza ser subtipo de dicha interface.
La llegada de la tecnología NET ha venido acompañada de GDI+ (Graphics
Device Interface), que como su nombre deja entrever, se trata de la nueva
generación del API gráfico de Windows, adaptado a la plataforma NET
Framework.
SQL-Server Diseñar la estrategia de copias de seguridad y restauraciones 43-49
Todos los sistemas necesitan una salvaguarda, pero aquellos que contienen datos
importantes mucho más aún En una base de datos suele guardarse información
muy viva y casi siempre trascendental para el negocio que sustentan.
Parece que la arquitectura está de moda ¿A qué se debe toda esa artillería?
¿Hemos de escondernos en la trinchera hasta que pase la tormenta, o ese bombardeo
sirve para allanar el camino hacia el combate con nuestro enemigo virtual?
Business Objects, líder en el área de Business Intelligence, acaba de lanzar las primeras
versiones bajo su égida de los productos Crystal, adquiridos a Crystal Decisions En este
artículo presentamos Crystal Enterprise 10 [CE10], el hermano mayor de una familia
que también incluye a Crystal Analysis y al ampliamente conocido Crystal Reports.
C# al descubierto de Joseph Mayo.
Arquitectura de aplicaciones para NET Diseño de apicaciones y servicios de
Microsoft Press.
Concurso de creación de páginas Web con ASP.NET para la comunidad de
desarrolladores de ASP.NET en España
dataNet
Trang 5a nu
es tro
s p ro
am as
Trang 6En el número anterior de dotNetManía ya
ade-lantábamos como rumor el retraso que sufriríaWhidbey, según palabras del “padre” de ASP.NET
2.0, Scott Guthrie Pues bien, ya no es un rumor.
El día 10 de marzo, Microsoft hizo público el
retra-so que sufrirán tanto Whidbey como Yukon, quepasan de estar listos antes de terminar el 2004 aestarlo en el primer semestre de 2005 Fue elmomento para asignarles su nombre comercial:
Visual Studio 2005 y SQL Server 2005.
Según fuentes de Microsoft, “Microsoft hatomado la decisión de retrasar la entrega de estosproductos para poder llegar a ofrecer los altísi-mos requerimientos que nos han pedido nuestrosclientes”
Según Tom Rizzo, Director of Product
Management for SQL Server, hemos decidido sacar
una beta 2 de Yukon y una beta 1 de Whidbey haciamediados de 2004 y finalmente una beta 3 deYukon para finales de 2004 que no estaba previs-
ta Ambos productos van a estar estrechamenteintegrados, se lanzaron a la vez
El soporte completo de SQL Server 7 y SQLServer 2000 termina en el año 2005, por lo que elretraso en la salida de la nueva versión de SQLServer, significa que habrá menos tiempo para lamigración ¿Supone este retraso en la salida deYukon, un retraso igual en la fecha tope de sopor-
te de las versiones anteriores? Según el citado TomRizzo, Microsoft está considerando una amplia-ción de este soporte
Además, esto puede tener, a nuestro juicio, unclaro efecto dominó Longhorn, la siguiente ver-sión de Windows, sufrirá posiblemente un retra-
so en su salida, al igual que puede ocurrir con elOffice 12, la versión de Office para este sistemaoperativo Hay que tener en cuenta que este sis-tema operativo usará a Yukon para gestionar losdatos del sistema Así mismo, las nuevas versiones
de productos como SharePoint Portal Server,Content Management, Commerce Server depen-den estrechamente de ASP.NET 2.0 e igualmen-
te se pueden ver afectados
Claro que hay fuentes que aseguran que elretraso es precisamente porque una buena parte
de los desarrolladores de Yukon están trabajando
en WinFS, y no sería de extrañar pues la salida deLonghorn es vital para la compañía y empieza aespecularse que podría irse hasta el 2007
Oficialmente, Microsoft sólo reconoce el ble retraso de Orcas que estaría disponible un par
posi-de años posi-después posi-de la salida posi-de Whidbey, según
afirma AriBixhorn, Visual Studio Lead Product
Manager, en una entrevista concedida a eWeek.
Trang 7<<
Nuevas versiones de Windows
Windows 2003 R2 para 2005
Microsoft ha confirmado su intención de lanzar Windows 2003
R2, una actualización que evolucionará al actual Windows 2003
Server antes de la salida de Longhorn Se rumorea que
posible-mente aparezca en el verano de 2005
Estará diseñado para combinar las características de la versión
gold de Windows 2003, Windows 2003 SP1 y los llamados
“fea-ture packs” o actualizaciones que se han ido sirviendo desde su
apa-rición Aún no tenemos noticias sobre su comercialización,
aun-que esperamos sea una actualización gratuita para los clientes
actua-les de Windows 2003
El SP1 de Windows 2003 quizá esté disponible para finales de este año
Una de las posibles mejoras que la nueva versión tenga sea soporte para Indigo así como otras
carac-terísticas del lado del servidor de Longhorn, aún por determinar, e incluirá la nueva versión del NET
Framework que saldrá el año que viene
Esto es completamente lógico pues la nueva versión del sistema operativo del servidor aparecerá
des-pués de Longhorn y el actual Windows 2003 tendrá que soportar a los PCs que se conecten con Longhorn
actualiza-la red;un bloqueador de popups y ungestor de descargas en el también nuevo Internet Explorer junto con mejoras de seguridad en el
Outlook Express y en el Windows Messenger; un nuevo Windows Update; una remodelada
protec-ción de memoria para evitar los comunes “overruns”; mejoras de seguridad en el Windows Media
Player; y otros cambios
La RC1(Release Candidate 1) de Windows XP SP2 ya está disponible y los betatesters registrados
pueden descargarla desde http://www.microsoft.com/sp2preview Puede obtener más información
en el MSDN en
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwxp/html/secu-rityinxpsp2.asp
Trang 8De sus realidades y de sus mitos
Cuando estaba en la universidad, una de las cosasque siempre tuve muy claras era la del hecho de bus-car una certificación IT avalada Cuando rendí mi pri-mer examen, hace ya varias líneas de código = ), la ver-dad estaba demasiado nervioso Como cualquier neó-fito, compartí mi tensión , con mis parceros (amigos)
y mi familia, hablándoles de lo que para mí en eseentonces implicaba un espléndido reto Al final delexamen todo salió bien (es un momento que aúnrecuerdo con sonrisa en el rostro), llamé a mi familia
y le escribí a mis amigos del suceso… Varios de des se preguntarán porqué esta introducción de índo-
uste-le tan personal; pues bien así de importante fue para
mi rendir mi primer examen de certificación, pero con
el correr de los días dicha ilusión fue al traste…
" Las certificaciones IT, desafortunadamente, noson tan importantes como crees, es más, fue un dife-renciador algún tiempo, pero con los días se ha con-vertido en toda una farsa.", me repitió mi maestra deconstrucción de software Lo curioso es que para esosdías en Colombia (hace siete años aproximadamente),
la cantidad de certificados era mucho menor, e
inclu-so, ella viajó a Estados Unidos para tomar la ción debida, pues no existía en el país ese tipo de entre-namiento aun Le pregunté por qué razón afirmaba talcuestión, " Willy, verás en estas URL's los exáme-nes están a la venta…", la verdad no podía creerlo, no
capacita-podía creer que después de invertir cerca de 500 res en una semana de educación técnica (demasiadodinero para las economías "latam" en esos días e inclu-
dóla-so hoy) y pagar 80 dólares aproximadamente por elexamen, alguien vendiera la prueba por 200 dólaresaproximadamente (mucho más que para esos días elsalario promedio para un desarrollador no sumaba más
de 220 dólares mensuales en el mejor de los casos aeste lado del charco), quedé realmente desilusionado,
y entendí que nunca las certificaciones equivaldrían osuperarían las ingenierías por dos razones: una de ellas,
la que acabo de relatar; y la siguiente, porque las nologías tienen una duración muy corta, en cambio,cuando eres ingeniero, tus bases "ingeniériles" duranpara siempre (aunque la verdad es que hoy me lleva-ría un rato recordar la metódica de solución a las trans-formadas de fourier =P)
tec-Con ello y otros bemoles, seguí igual tomando miscursos técnicos y rindiendo mis exámenes (incluso per-
dí el 70-300, un examen de arquitectura de NET en
el primer intento, hace sólo algunos meses) A estasalturas usted se puede preguntar ¿porqué seguir rin-diendo estas pruebas, que pareciere que día a día, estu-vieren más y más a la venta por unos pocos dólares?(La verdad es que me asombra el nivel de fidelidad deesos documentos; es tal el descaro, que salen hasta lascapturas de pantalla) ¿Porqué rendir una prueba quetiene un coste tan alto, si las respuestas están a la ven-
ta por un valor con el cual podría comprar el examen
El real valor de las certificaciones del mundo informático (de sus realidades,
Trang 9entu-completo? -Cuando hago referencias a ellos, no me
refiero a las pruebas de preparación o a los libros que
se escriben sobre tema, desde luego- Ojalá las
multi-nacionales IT que tienen que ver con estos procesos de
certificación, acaben con este cuento pronto;
realmen-te es lamentable que ello suceda y no se pronuncien
Todas las compañías después de aprobar algunos de
sus exámenes, hacen llegar una especie de certificado
impreso y alguna documentación, pero siendo
objeti-vos, no pasa de allí la cuestión, la verdad es que me
pare-ce un poco desigual el "trato" El porqué de este
comen-tario viene a lo siguiente: si una compañía IT
promue-ve como un alto grado de avance el hecho de
certifi-carse, lo mínimo que esperaría sería la generación de
bolsas de empleo de las personas que certifican o la
pro-moción de dichas personas por algún tipo de canal, cosa
que ha día de hoy no sucede y parece que se divise (este
último comentario es una generalidad, desde luego, por
estos lados, las personas de Microsoft, están
retoman-do el tema con toda la fuerza que amerita)
Una perspectiva mundial
y los certificados
Recientemente una de las publicaciones más
importantes en el tema, MCPMag.com, publicó el
resultado de su estudio de salarios con respecto a los
profesionales certificados (no sólo de Microsoft, sino
de diferentes compañías), disponibles en
http://mcp-mag.com/salary2003/ (les recomiendo mucho la
lec-tura de este documento) Muestra dos tendencias
cla-ras: el nivel de profesionales ha aumentado
conside-rablemente, a medida que las certificaciones técnicas
han pasado a ser necesidad por solicitud de los adores y una tendencia al aumento de sus salarios…
emple-entonces ¿qué es lo inclusive de esta encuesta? Bueno,dicha labor de recolección de información, sólo se lle-
vó acabo en Estados Unidos, ¿y el resto de nosotrosdonde quedamos? ¿Será que nuestras economías pue-den equipararse en proporción a salarios…? La res-puesta evidentemente es no Lo que implicaría que elcoste de dicho tipo de educación fuere proporcional-mente ajustada No son lo mismo 100 dólares enEstados Unidos que en Latam
Figura 2 Reporte de MCP's en los últimos nueve meses
Figura 3 Reporte de MCSD's en los últimos nueve meses
Figura 4 Reporte de MCT's en los últimos nueve meses
Trang 10Desde luego las variables
macroeco-nomías influyen localmente, pero si se ve
con detenimiento el coste de este tipo de
formación IT, no sólo debería ser
ajus-tada localmente, sino después de
ajusta-da, reducirse por lo menos a la mitad La
justificación de esta premisa está en que
somos nosotros los IT (me refiero a todo
el gremio, pero con más fuerza a los
desa-rrolladores de software) quienes
hace-mos que las plataformas permanezcan
y/o se difundan, ello debido a nuestra
inclinación hacia la misma (llámese como
se llame), pues si no hay productos para
la plataforma X o Y, ésta pierde su
posi-cionamiento pero bueno ello daría para
otro escrito de esta saga
Debido al crecimiento de las
certi-ficaciones como requisito, se hace cada
vez más importante la intervención de
la industria, para que estas credenciales
conserven (o en algunos casos
recupe-ren) su buen nombre
Una buena alternativa, pudiere ser el
hecho de exigir un tiempo comprobable
con la tecnología antes de rendir la
prue-ba de certificación de la misma y con ellosustentar la credencial en caso de rendirpositivamente la prueba A día de hoy,algunas compañías, mantienen esta mecá-nica Esto permite mantener la credibi-lidad en la credencial y en consecuenciadel profesional que decide tomarlas y melleva al siguiente punto de este escrito
¿Contrataría usted a un profesional sin experiencia
de campo y con certificaciones
a su haber?
Esta es la misma pregunta que rían hacerse las personas que se lograncertificar de una manera, cómo decir-lo… "poco ortodoxa"
debe-Si me hicieran esta pregunta, mi puesta sería un contundente JAMÁS (¿dequé me sirve un experto de diploma, si
res-en realidad tres-engo un fiasco como ado?) Desde mi perspectiva, es sencilla-
emple-mente inconcebible que un profesionaldiga tener credenciales que lo habilitancomo experto en un frente tecnológico
y que no posea experiencia Si usted esempleador, es muy buena idea enterarsedel Skill de cada certificación, y con ellodeterminar si es equiparable lo uno con
lo otro Es notorio que la certificación es
un diferenciador, pero no lo será pormucho tiempo, pasará a ser un requisito(así se puede leer en la encuesta de
MCPMag que recomendaba unas líneas
arriba), aunque bueno fuera que brara su estatus de credibilidad
reco-A pesar de esta posición un pocoescéptica (y desde luego desde una pers-pectiva muy personal y ya para rematarestas líneas), usted debe tener en cuen-
ta que las certificaciones son buena idea,pero aún mejor idea es conocer a fon-
do las tecnologías para ser un real to… así no te certifiques Nos vemos en
exper-un próximo articulo… debo seguir diando para rendir mi próxima certifi-cación =)
noticias noticias noticias noticias
Con motivo del Silicon Valley Speaker Series,
en marzo de 2004, Microsoft presentó
BizTalk® Server 2004 BizTalk es una
solu-ción de integrasolu-ción líder en la industria y
miembro del Windows Server System™ Las
aplicaciones creadas con BizTalk Server 2004
corren bajo NET Framework, lo cual
per-mite a los clientes automatizar y administrar
procesos empresariales complejos al integrar
aplicaciones, socios comerciales y
emplea-dos con el núcleo de organización de
proce-sos altamente escalable de BizTalk Server.
BizTalk Server 2004 ayuda a incrementar la
productividad de los trabajadores con
infor-mación, los profesionales en TI y los
desa-rrolladores a través de herramientas
especí-ficas para desarrollar, administrar y acceder
a los procesos empresariales en entornos
familiares tales como Microsoft Office
System y Visual Studio® NET 2003
“En la actualidad, las empresas se
enfren-tan a retos imporenfren-tantes para administrar y
automatizar los procesos empresariales cada
vez más desconectados BizTalk Server 2004
permite a los clientes administrar y
automa-tizar sus procesos empresariales, al tiempo
que brinda a los usuarios herramientas para
diseñar, implementar y supervisar estos
pro-cesos en tiempo real”, dijo Ted Kummert,
vicepresidente corporativo del Grupo de Servidores E-Business de Microsoft “Los primeros usuarios han obtenido gran valor
de sus soluciones BizTalk Server 2004, y el día de hoy nos emociona poder ofrecer los mismos resultados a más clientes”.
Nuevas características que zan y administran los procesos empre- sariales de principio a fin Además de las
organi-capacidades de integración de aplicaciones contenidas en las versiones anteriores, BizTalk Server 2004 brinda nuevas capaci- dades que permiten a las empresas admi- nistrar y aplicar reglas a los procesos empre- sariales, conectarse con los socios comer- ciales y analizar el estado de los procesos empresariales en forma más efectiva Las nuevas funciones incluidas en BizTalk Server 2004 incluyen lo siguiente:
• Administración de procesos riales (BPM) Ofrece una máquina de
empresa-mensajes y organización muy escalable con capacidad BPM de nivel empresarial, incluyendo soporte para Business Process Execution Language (BPEL), un nuevo estándar para enlazar los procesos empre- sariales entre los socios comerciales, las aplicaciones y los usuarios empresariales
• Integración en Visual Studio NET
2003 Permite a los desarrolladores
cre-ar, organizar y administrar los procesos empresariales a través de un ambiente de desarrollo integrado y muy productivo
• Supervisión de actividad de estado (HAT) Permite a los administradores
supervisar y administrar el estado de sus procesos empresariales dentro de sus ambientes BizTalk Server
• Entrada única empresarial Optimiza el
proceso de verificación de entrada de los usuarios Windows y no Windows que acce- den a las aplicaciones de giro empresarial
• Máquina de normas empresariales muy escalable Permite a los analistas empre-
sariales crear normas y políticas flexibles
y de mejor respuesta en torno a los cesos empresariales
pro-• Supervisión de actividad empresarial (BAM) Ofrece a los trabajadores con
información supervisión en tiempo real de los procesos empresariales a través de herramientas conocidas como Microsoft Office Excel o Microsoft Office SharePoint Portal Server 2003
• Integración en Microsoft Office System Permite el análisis de procesos y
datos.
Microsoft lanza BizTalk Server 2004
Trang 11En algunas de estas instrucciones se utilizan
expresiones que devolverán un valor verdadero
(true) o falso (false)
En esas expresiones podemos utilizar cualquiera
de los operadores condicionales mostrados en la
tabla 8 También podemos formar expresiones
múl-tiples usando los operadores condicionales
mos-trados en esa misma tabla
En la tabla 9 se muestran algunos ejemplos de
cómo usar las instrucciones de selección o de tomas
de decisiones según usemos if elseo switch
case / Select Case
En los comentarios se indican algunas de laspeculiaridades de C# y de Visual Basic NET
Las instrucciones para realizar bucles
Las instrucciones para realizar bucles nos miten iterar un número determinado (o indeter-minado) de veces sobre una parte del código Elcódigo lo incluiremos dentro de dicho bucle
per-En C# el código a usar en un bucle puede seruna sola instrucción, terminada con un punto ycoma, o un bloque de código, incluido dentro de
un par de llaves
En VB NET los bucles siempre estarán dentro
de un bloque de código bien delimitado, es decir,
Menor, menor o igual, mayor o mayor o igual son los
Tabla 8 Instrucciones (operadores) de comparación
Tercera y última entrega de esta serie de artículos en la que hemos pretendido explicarle cómo hacer las mismas cosas (o casi) tanto en C# como en Visual
Basic NET
Trang 12En Visual Basic NET un tructor se define por medio de un pro-cedimiento (Sub) llamado New En C#
cons-el constructor será un
procedimien-to “especial” que se llama igual que lapropia clase (o tipo) que estamos defi-niendo
Por otro lado, un destructor se liza cada vez que destruimos un obje-
uti-to, en NET Framework se llamafinalizador, de hecho, en Visual Basic.NET se utiliza como destructor unasobrecarga del método Finalizedecla-rado en la clase Object En C# el des-tructor se define usando el nombre
de la clase precedida con ~ Un tructor se llamará cuando un objetodeje de estar en “ámbito” o se asigne
des-un valor nulo a la variable Hay quetener en cuenta que en NET losobjetos no se destruyen inmediata-mente, sino que cuando dejan de ser
Tarea a realizar C# VB NET
Toma de decisiones con if if(a != b) <código>; If a <> b Then <código>
Toma de decisiones con if if(a > b){ If a > b Then
con varias instrucciones <código> <código>
Instrucción if que si se if(a > b) If a > b Then
cumple haga una cosa y si no <código> <código>
usando varias líneas <código> <código>
End If
Varias instrucciones if else if(a != b) If a <> b Then
asociadas a otro if <código> <código>
else ElseIf b > i AndAlso a
> b Then if(b > i && a > b){
<código>
<código>
Else }
En C# no se distingue entre un if de simple línea o multilínea, pero si queremos usar varias instrucciones en
lugar de una sola acabada con un punto y coma, las incluiremos dentro de un bloque entre un par de llaves {}
En VB NET podemos crear un bloque If multilínea acabándola con End If, tanto en el bloque If como en el
blo-que Else o ElseIf podemos indicar una o más líneas con instrucciones Si no se indica End If se tomará como una
instrucción de una línea, en la que se puede incluir también la parte Else, pero siempre en la misma línea física
Seleccionar entre varias switch(<expresión>){ Select Case <expresión>
opciones usando switch case <constante1>: Case <valor1>
<código> <código>
break;
case <constante2>: Case <valor2>, <valor3>
case <constante3>: <código>
<código> Case <valorA> To <valorB>
En C# sólo se pueden usar valores constantes con cada cláusula case Podemos anidar una tras otra indicando
varios case seguidos Después de cada bloque case hay que usar la instrucción break o bien se debe salir del
blo-que de código, ya blo-que no se permite pasar de un case a otro, salvo blo-que usemos goto case <constante>
En VB NET en cada cláusula Case se pueden indicar varios valores separados por comas, incluso un rango de
valores usando To o un valor condicional usando Is Esos valores no tienen porqué ser constantes, pueden ser
también expresiones
Tabla 9 Instrucciones de decisión < <
Trang 13se hará inmediatamente, este punto esimportante ya que si nuestro objetomantiene recursos externos éstos no
se liberarán inmediatamente, en esoscasos, es recomendable definir unmétodo al que llamemos de formaexplícita para liberar esos recursos jus-
to cuando ya no los necesitemos
Los constructores siempre rán a un constructor de la clase deri-vada, si no lo indicamos expresamen-
llama-te, el compilador intentará llamar a
un constructor sin parámetros Encaso de que la clase base no tenga defi-nido un constructor sin parámetros,tendremos que realizar nosotros esallamada, indicando el constructor ade-cuado, si no lo hacemos se producirá
destru-de forma explícita
En la tabla 11 podemos ver cómodefinir los constructores y destructo-res, así como la forma de invocar aotra sobrecarga de un constructor de
la misma clase e incluso de la clase de
la que se deriva
Tarea a realizar C# VB NET
Bucle for for(<inicio>; <final>; For <contador> =
<incremento>) <inicio> To <final>
<código> <código>
Next
Bucle for infinito for(;;) ; For i = 0 To 0 Step 0:
Nota: Espero que a nadie en su Next
sano juicio se le ocurra hacer esto
Bucle for con incremento for(int i = 0; i<10; i For i = 0 To 9 Step 2
distinto de uno += 2)
<código> <código>
Next
Bucle for para recorrer de mayor for(int i = 10; i>0; i—) For i = 10 To 1 Step -2
Next
En C# podemos indicar varias instrucciones después de if o else incluyéndolas dentro de un bloque entre
un par de llaves {} o bien una sola instrucción acabada con punto y coma
En VB NET podemos crear un bloque If acabándola con End If, tanto en la parte If como en la parte Else
podemos indicar una o más líneas con instrucciones Si no se indica End If se tomará como una instrucción
en una sola línea
<código> <código>
}while(true) Loop
Bucle con una condición después do{ Do
de cada iteración, se repetirá <código> <código>
mientras se cumpla la condición }while(<expresión>) Loop While <expresión>
Bucle con una condición al principio while(<expresión>) Do While <expresión>
<código>; <código>
Loop While <expresión>
<código>
End While
Bucle que continúe la ejecución do{ Do
hasta que se cumpla <código> <código>
la condición }while(! <expresión>) Loop Until <expresión>
Bucle que continúe la ejecución while(! <expresión>){ Do Until <expresión>
hasta que se cumpla la condición, <código> <código>
al principio del bucle
Salir de un bucle do o while break; Usar Exit seguida del
tipo de bucle:
Exit Do para Do Loop Exit While para While
End While
En C# los bucles do se utilizan con una instrucción while al final del bucle, esta instrucción es la que se
encarga de comprobar si el bucle debe seguir ejecutándose o no Si queremos que el bucle se repita
indefi-nidamente podríamos usar una expresión que siempre devuelva un valor verdadero
En Visual Basic NET podemos usar la instrucción While o la instrucción Until, en C# no existe la
ins-trucción Until, pero se puede simular usando un while en el que se niega la expresión usada
En VB NET se puede usar While como instrucción asociada a Do Loop o como instrucción
indepen-diente, en ese caso el final del bloque del código se indicará con End While
Tabla 10 Instrucciones de bucles
Trang 14Definir clases abstractas
y selladas, miembros tractos y virtuales, redefinir
abs-y ocultar métodos
Las clases abstractas son clases quesólo se pueden utilizar para derivarnuevas clases, no se podrán usar paracrear nuevos objetos Una clase abs-tracta puede contener métodos y pro-piedades normales así como abstrac-tos, los métodos abstractos sólo sedefinen como en las interfaces: sincódigo que los hagan operativos.Por otro lado los métodos virtua-les son los que podremos redefinir en
la clase derivada, para dar la nalidad adecuada que creamos conve-niente Las referencias a las instanciascreadas en memoria siempre usaránlas versiones redefinidas de los méto-dos (o miembros) virtuales Por defec-
funcio-to, los métodos y propiedades de unaclase no son virtuales, es decir, no sepueden redefinir en las clases deriva-das, sin embargo podemos ocultarlos.Esos miembros ocultados sólo perte-necerán a la instancia de la clase quelos define, no a las referencias obte-nidas a través de tipos de la clase base.Los miembros abstractos siempreson virtuales
También podemos definir clasesselladas, lo contrario de las clases abs-tractas, es decir, clases que no se pue-den usar para derivar nuevas clases apartir de ellas
También podemos ocultar tiposademás de los miembros de una clase
En la tabla 12 podemos ver unalista de las instrucciones usadas paradeclarar clases abstractas, miembrosabstractos, virtuales, así como las ins-trucciones usadas para ocultar miem-bros y para redefinir los miembrosvirtuales de las clases base
Por supuesto no se han cubiertotodas las posibilidades sintácticasentre los dos lenguajes más usados de
la plataforma NET, pero espero que
al menos ahora tengas una idea tante aproximada de cómo hacer lastareas más comunes tanto en C#como en Visual Basic NET, de for-
bas-ma que en cualquier momento teresulte fácil poder escribir código encualquiera de estos dos lenguajes
Tarea a realizar C# VB NET
Definir un constructor de una clase public Cliente() Public Sub New()
que la clase se llama Cliente
Definir un constructor que recibe public Cliente(int id) Public Sub New(id As
En C# el constructor siempre se llama como la clase
En VB NET el constructor siempre es un método Sub llamado New
Los destructores sólo se pueden usar en las clases no en las estructuras
Definir un constructor que llama a otro public Cliente(int id, Public Sub New(id As
constructor de la propia clase string nombre) : Integer, nombre As
this(id) String) {} Me.New(id)
End Sub
Definir un constructor que llama public Cliente(int id, Public Sub New(id As
a otro constructor de la clase base string nombre) : Integer, nombre As
base(id) String) {} MyBase.New(id)
End Sub
Tabla 11 Constructores y destructores.
Tarea a realizar C# VB NET
Definir una clase abstracta abstract class Prueba MustInherit Class
Los miembros abstractos sólo definen el método o propiedad, pero no contienen código que lo defina
Redefinir un miembro abstracto o override void Prueba() Overrides Sub Prueba()
End Sub
Definir un miembro que oculta new void Prueba3() Shadows Sub Prueba3()
En VB NET si se quiere ocultar un miembro virtual, además de usar Shadows debemos usar la
instruc-ción Overloads
Nota sobre seguridad: Los miembros declarados como virtual internal (Overridable Friend en VB) en
teo-ría sólo se pueden reemplazar en clases definidas en el propio ensamblado, pero esa “restricción” sólo es
aplicable a los compiladores de C# y de VB, el CLR no tiene esa restricción, por tanto es teóricamente
posi-ble reemplazar esos miembros desde otro ensamblado, al menos por compiladores que no tengan dicha
res-tricción Para más información: /cpguide/html/cpconkeyconceptsinsecurity.htm
/cpguide/html/cpconsecurityconcernsforinternalvirtualoverloadsoverridablefriendkeywords.htm
Tabla 11 Constructores y destructores.
Trang 16ASP.NETesto ha cambiado y nos permite realizar
una configuración de las aplicaciones
Web basada en ficheros en formato
XML Este sistema de configuración de
ASP.NET hace uso de dos tipos de
ficheros de configuración:
1 Configuración del servidor: Que se
alma-cena en un fichero denominado
machi-ne.config Este fichero va a representar
la configuración por defecto de todas
las aplicaciones ASP.NET existentes
en el servidor y se localiza en el
direc-torio Windows \Microsoft.NET
\Framework\[versión]\config.
2 Configuración de la aplicación: Se
almace-na en el fichero web.config Un servidor
Web puede contener varios ficheros
web.config, cada uno de ellos dentro del
directorio raíz de cada una de las
apli-caciones ASP.NET del servidor La
con-figuración indicada dentro de un
fiche-ro web.config sobrescribe los valores
espe-cificados en el fichero machine.config.
Ventajas
Este nuevo mecanismo de
configu-ración que encontramos en la
platafor-ma NET para configurar las nes Web de ASP.NET, aporta lassiguientes ventajas:
aplicacio-• Valores de configuración en formato
legible: Es muy sencillo abrir un
fichero XML y leer o modificar laconfiguración
• Actualizaciones inmediatas: Las
modificaciones realizadas en laconfiguración de las aplicaciones
se aplican de forma inmediata sinnecesidad de reiniciar el servidorWeb o parar los servicios
• Configuraciones fácilmente repetibles:
Para tener una aplicaciónASP.NET con la misma configu-ración que otra aplicación distin-
ta, únicamente debemos copiar losficheros de configuración en eldirectorio de la aplicación corres-pondiente
• Bloqueo de valores de configuración:
Podemos bloquear los valores deconfiguración que deseemos paraque no sean sobrescritos
• ASP.NET configura de maneraautomática el servidor Web IIS paraque no sea posible que un clienterealice una petición a un fichero
web.config, y de esta forma pueda ver
la configuración de nuestra ción ASP.NET
aplica-Proceso de obtención
de la configuración de una aplicación Web
A continuación se va a comentar elproceso que sigue la plataforma NETpara obtener y aplicar la configuraciónfinal de una aplicación ASP.NET
A la hora de obtener la ción se produce una fusión entre los
configura-ficheros machine.config y web.config Los
valores de configuración se heredanentre distintas aplicaciones ASP.NET,
siendo el fichero machine.config la
con-figuración raíz de la que heredan elresto
Por lo tanto, en primer lugar
tene-mos el fichero machine.config que
afec-tará a todas las aplicaciones ASP.NETexistentes en el servidor Web A los valo-res de configuración indicados en estefichero se le añadirían o sobrescribirí-
an los presentes en el fichero web.config
que posee un sitio Web, que actúa comouna aplicación ASP.NET
rea-en un repositorio binario drea-enominado metabase de Internet Information Server Se trea-enía que acceder a las distintas hojas de propiedades que nos ofrecía IIS para poder configu- rar nuestra aplicación.
Pero en la tecnología
<
Trang 17Si dentro de este sitio Web tenemos
definida una aplicación ASP.NET, que
ofrece su propio fichero web.config, éste
se combinaría con el fichero XML
pre-sente en el sitio Web predeterminado
Y así podríamos seguir una cadena de
combinación de ficheros web.config.
Formato de los ficheros de
configuración de una
aplicación ASP.NET
Tenga a mano el contenido de un
fichero machine.config y web.config para
seguir el artículo de forma más
senci-lla y conseguir un mayor
aprovecha-miento del mismo
Los ficheros machine.config y el
fiche-ro web.config internamente presentan el
mismo formato XML El elemento raíz
es siempre <configuration> Dentro de
éste podemos encontrar dos secciones
generales: Sección de los manejadores y
sección de los valores de configuración
Sección de los manejadores
Identifican las clases de NET
Framework que se utilizarán cuando el
sistema de configuración se carga Esta
sección se encuentra entre las etiquetas
<configSections> La función de estas
cla-ses es la de leer los valores de la sección
de los valores de configuración que les
corresponda
El atributo name de la etiqueta
<sec-tion> define el nombre de la etiqueta del
elemento de la sección de los valores de
configuración del que se va a encargar
el manejador, cuya clase especificamos
en el atributo type, dentro de este
atri-buto además se indica el assembly en el
que se encuentra la clase junto con su
versión correspondiente
Si se desea definir manejadores para
una sección de valores de configuración
que a su vez va a tener varias secciones,
las distintas etiquetas <section> irán
inclui-das entre las etiquetas <sectionGroup>.
En el fuente 1 se muestra un
frag-mento del fichero machine.config que se
corresponde con la definición de dos
manejadores para las secciones
sessionState y trace, que a su vez
perte-necen al grupo <system.web>, también se
define el manejador para la sección
appSettings El grupo <system.web> va a
ser de gran interés, ya que nos va a mitir configurar los distintos aspectos
per-de nuestras aplicaciones ASP.NET
Una vez que se ha declarado la ción de los manejadores no es necesa-rio volver a declararla en los ficheros
sec-web.config, ya que si se encuentran en el
fichero machine.config, o en un fichero
web.config de nivel superior, la
En muchos de los casos necesitaremossaber únicamente el significado de laopción que vamos a modificar
Normalmente los valores de ración de la aplicación ASP.NET no los
configu-vamos a indicar en el fichero
machine.con-fig, ya que estos valores afectarán a todas
las aplicaciones ASP.NET del servidor,
sino que utilizaremos un fichero
web.con-fig particular para una aplicación ASP.NET
determinada En este fichero web.config
heredaremos la sección de los
manejado-res indicada en el fichero machine.config.
Tareas de configuración más comunes
Si examinamos detenidamente el
fichero de configuración machine.config
que tenemos en nuestro equipo, mos encontrar alrededor de treintaopciones de configuración distintas Eneste artículo no vamos a tratar todasestas tareas de configuración, sino quevamos a ver las más comunes y las quemás se pueden usar en un entorno real
web.config.
Configuración general
En esta sección se va a indicar una serie
de parámetros de configuración cos para la aplicación ASP.NET Para ello
genéri-se hace uso de la etiqueta <httpRuntime>.
Esta etiqueta tiene como más vos los siguientes atributos:
significati-• executionTimeout: En este atributo
indicaremos en segundos el tiempo
de espera que se aplicará a la ción de un recurso solicitado Una
< sectionGroup name =”system.web”>
< section name =”sessionState”
type =”System.Web.SessionState.SessionStateSectionHandler, System.Web, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”
allowDefinition =”MachineToApplication” />
< section name =”trace”
type =”System.Web.Configuration.TraceConfigurationHandler, System.Web, Version=1.0.2411.0, Culture=neutral,
Trang 18vez sobrepasado este tiempo de
espera la aplicación ASP.NET
fina-lizará la ejecución del recurso Por
si al cliente se le va a devolver una
URL completa o una URL
relati-va Por defecto es false, por lo que
se enviará una URL relativa
Configuración de la página
Mediante la etiqueta <pages>
pode-mos controlar algunos de los
compor-tamientos de las páginas ASP.NET
presentes en una aplicación La
eti-queta <pages> puede tener los
siguien-tes atributos:
• autoEventWireup: Indica si los
even-tos de la página se van a lanzar de
for-ma automática Por defecto es true.
• buffer: Se utilizará para activar o
desactivar el búfer de las páginas
ASP.NET de la aplicación actual
Puede tomar valores true/false.
• enableSessionState: Este atributo
per-mite activar o desactivar el estado de
sesión, es decir, permite o no la
uti-lización del objeto Session para
alma-cenar información común a la sesión
actual del usuario con la aplicación
Web Puede tomar valores true/false.
• enableViewState: Permite activar o
desactivar el mantenimiento
auto-mático de los valores de los
contro-les Web dentro de los formularios
Web Por defecto es true.
Estos atributos se corresponden con
los atributos del mismo nombre de la
directiva @Page, por lo que utilizando
esta directiva podemos sobrescribir estos
valores de configuración para una
guración vamos a utilizar pares clave/valor.
Estos valores de configuración
defi-nidos en la sección <appSettings> los
vamos a poder recuperar en las páginasASP.NET de la aplicación Esta etiqueta
de configuración de la aplicación no se
encuentra dentro de la sección
<sys-tem.web>.
Dentro de la etiqueta <appSettings>
tenemos unas subetiquetas <add>.
Existirá una etiqueta <add> por cada
parámetro o valor que queremos car en la aplicación, esta etiqueta posee
indi-dos atributos: key, que es la clave con la
que después vamos a poder acceder aeste parámetro a través de la colección
AppSettings, y value que va a ser el valor
que le vamos a asignar al parámetro
En el fuente 4 se muestra el
frag-mento de un fichero web.config en el que
se definen dos parámetros para la cación: Se indica una cadena de cone-xión y una sentencia SQL
apli-Configuración de la sesión
Desde el fichero de configuración
de la aplicación ASP.NET tenemos laposibilidad de configurar la forma en laque se va a utilizar el estado de sesión
mediante la etiqueta <sessionState> Para
ello presenta los siguientes atributos:
• mode: Indica el modo de
almacena-miento utilizado para el proceso que
se corresponde con el estado de lasesión Los valores que podemos
asignar a este atributo son: InProc,
el estado de sesión se encuentra en
el proceso actual de ASP.NET; Off,
el estado de sesión se encuentra
desactivado; SQLServer, se utiliza
un proceso de SQL Server para
almacenar el estado; StateServer, se
utiliza un proceso en forma de vicio de Windows para almacenar
ser-el estado Por defecto es InProc.
• stateConnectionString: En este
atri-buto se indica la dirección IP y elnúmero de puerto utilizados paracomunicarse con el servicio deWindows que ofrece las facilidades
de almacenamiento Este atributoúnicamente tiene sentido utilizarlo
cuando el atributo mode tiene el valor de StateServer.
na debe incluir la dirección IP y el
nombre y contraseña de usuariopara conectar a la base de datos deSQL Server
• cookieless: Atributo que indica si el
objeto Session utiliza cookies para
almacenar el identificador de sesión,
o por el contrario no las utiliza y elidentificador de sesión lo va mante-niendo a través del mecanismo deURLs El mecanismo de URLs seráutilizado cuando el valor de este atri-
buto sea true Por defecto es false.
• timeout: El atributo timeout
especifi-ca, en minutos el intervalo de
inac-tividad para el objeto Session Si el
usuario no actualiza o solicita unapágina durante ese intervalo, la sesióntermina Por defecto es 20 minutos
< pages buffer =”true” enableSessionState =”true”
enableViewState =”true” autoEventWireup =”true”/>
< add key =”conexion” value =”server=aesteban;database=datos;uid=sa;pwd=”/>
< add key =”sentencia” value =”select nombre, apellidos,email from Usuarios”/>
</ appSettings >
</ configuration >
Fuente 3 Ejemplo de uso de la etiqueta <appSettings>
Trang 19Los valores indicados en la sección
<globalization> nos va a permitir
confi-gurar las opciones de codificación y
cul-tura La etiqueta <globalization> nos
ofrece cinco atributos para indicar
diver-sos aspectos de la codificación utilizada
en nuestra aplicación:
• requestEncoding: Mediante este
atri-buto podemos indicar la
codifica-ción utilizada en cada solicitud Por
defecto tiene la codificación utf-8.
• responseEncoding: Este atributo
tie-ne el mismo significado que el
ante-rior pero aplicado a una respuesta
enviada al cliente Por defecto
tie-ne la codificación utf-8.
• fileEncoding: Permite indicar el tipo
de codificación aplicado a los
fiche-ros Por defecto tiene la
codifica-ción utf-8.
• culture: Podemos especificar el lugar
en el que nos encontramos para que
se aplique a las cadenas el idioma
ade-cuado, así como también a las fechas
y su formato Por ejemplo, en-US
representa al idioma inglés de Estados
Unidos y fr-FRfrancés en Francia
• uiCulture: Indica la misma
infor-mación que en el atributo anterior,
pero se va a utilizar para realizar
búsquedas en las cadenas del
idio-ma correspondiente
Identidad de la aplicación
En la sección <identity> vamos a
poder configurar la identidad del
pro-ceso que ejecuta ASP.NET en el
servi-dor Para ello esta etiqueta nos ofrece
los siguientes atributos:
• impersonate: Si posee el valor true
indi-ca que el proceso de ASP.NET se va
a ejecutar bajo la identidad por
defec-to, el usuario IUSR_NombreServidor,
o bien bajo el usuario que nosotros le
indiquemos Por defecto es false.
• name: Este atributo estará
disponi-ble cuando el atributo impersonate tenga el valor true, y lo vamos a uti-
lizar cuando deseemos indicar unacuenta de usuario de Windows espe-cífica para representar al proceso deejecución de ASP.NET
• password: En él indicaremos la
con-traseña del usuario que se va a lizar en el proceso
uti-En el fuente 6 se puede observar eluso de esta etiqueta En este caso se indi-
ca que utilice como identidad del
proce-so de ASP.NET un usuario de Windows
Si quisiéramos utilizar el usuario de IIS,
le asignaríamos el valor de cadena vacía
a los atributos name y password:
Configuración de trazas
La configuración del mecanismo detrazas que de ASP.NET se hace a tra-
vés del uso de la etiqueta <trace> que
tie-ne los siguientes atributos:
enabled: Este atributo indica si el
mecanismo de trazas se encuentra
acti-vado a o no Tiene por lo tanto la
ma funcionalidad que el atributo de
mis-mo nombre de la directiva @Page Su valor por defecto es false.
requestLimit: En este atributo
indi-caremos el número máximo de ciones HTTP de las que se va a alma-cenar información de trazas Las tra-zas van a ser almacenadas en un regis-tro de trazas mediante un mecanismocircular en las que permanecerán las
peti-últimas n peticiones Por defecto es
10
• pageOutput: Indica si la información
de trazas se va a mostrar al final decada página ASP.NET, tal como sehace con las trazas a nivel de pági-
na Por defecto es false.
• traceMode: Este atributo nos permite
indicar el modo de ordenación de losmensajes de trazas en la sección
Información de seguimiento Puede
pre-sentar los valores SortByCategory y
SortByTime Por defecto es SortByTime.
• localOnly: Indica si la información
de trazas se muestra únicamente alos clientes locales o por el con-trario, se muestra también a losclientes remotos Por defecto es
false.
Le animo a que siga investigando lasnumerosas posibilidades de configura-ción para las aplicaciones Web que ofre-
ce ASP.NET Lo mejor es empezar porobservar los contenidos de los ficheros
de configuración
< configuration >
< system.web >
< globalization requestEncoding =”utf-8” responseEncoding =”utf-8”
culture =”es-ES” uiCulture =”es-ES”/>
Trang 20la última vez que lo leyó Por ejemplo, remos la siguiente secuencia de sucesos:
conside-• Los usuarios A y B leen el registro R1 de
la base de datos cargándolo en un DataSet
• El usuario A modifica R1
• El usuario A guarda R1 en la base de datos
• El usuario B modifica R1
• El usuario B guarda R1 en la base de datos
• El usuario B recibe una excepción
DBConcurrencyException, indicando un
con-flicto de concurrencia al haber sido ficado R1 desde la última vez que B lo leyó
modi-Los conflictos de concurrencia no se cen solamente al actualizar un registro porqueotro usuario lo haya modificado, también ocu-rren si el registro ha sido eliminado por otro usua-rio Asimismo, tienen lugar cuando un usuariointenta eliminar un registro que ha sido modifi-cado e incluso que ha sido eliminado Con lainserción, sin embargo, es evidente que no se pro-ducen conflictos de concurrencia, ya que es impo-sible que otro usuario pueda modificar un regis-tro que aún no existe en la base de datos En defi-nitiva, los conflictos de concurrencia pueden pro-ducirse:
Otro aspecto básico acerca de los conflictos
de concurrencia es la forma de detectarlos Latécnica de detección se basa fundamentalmente
en incluir en la cláusula WHERE de la ción UPDATE o DELETE el valor original delos campos, es decir, el valor que tenían los cam-pos del registro cuando se leyeron de la base dedatos Pongamos un ejemplo para aclarar ideas
instruc-Gestión de concurrencia en ADO.NET
Por Jesús López Méndez
(SqlRanger)
La concurrencia, en un entorno multiusuario, es siempre una cuestión mática, pero si además se trata de un entorno desconectado como el que se usa en ADO.NET con sus DataSets y DataAdapters, la problemática es aún mayor debido a la propia naturaleza desconectada del entorno.
proble-Veamos, en primer lugar,
<
Trang 21Supongamos que estamos trabajando
con la siguiente tabla en una base de
datos de SQL Server:
El comando UPDATE que
detec-ta conflictos de concurrencia sería el
siguiente:
Como veis, están todos los valores
originales en la cláusula WHERE de
esta instrucción parametrizada De
esta manera, si ha cambiado alguno
de los campos, no se cumplirá la
con-dición, y por tanto la instrucción no
actualizará ningún registro, o lo que
es lo mismo, el número de registros
afectados será cero Solamente la
ins-trucción tendrá éxito, o sea,
actuali-zará el registro, si éste no ha
cambia-do Así es como ADO.NET detecta
los conflictos de concurrencia,
con-cretamente un DataAdapter lanzará
una excepción DBConcurrencyException
cuando el comando de actualización
afecte a cero registros Observad que
este comando incluye todos los
cam-pos en la cláusula SET, excepto el
IdEmpleado que es autonumérico y por
tanto de sólo lectura Esto viene a
suponer que se actualizarán todos loscampos en la tabla, independiente-mente de si se han modificado o no,
lo que implica una falta de ción
optimiza-Sin embargo, es posible que no nosinterese detectar conflictos de concu-rrencia y que queramos que la actua-lización se lleve a cabo independien-temente de si el registro ha sido modi-ficado o no desde la última vez que seleyó En ese caso sólo incluiríamos la
clave primaria en la cláusula WHERE.
La instrucción UPDATE sería la
siguiente:
Aún así, podríamos obtener unconflicto de concurrencia, pero sólo
en el caso de que haya sido eliminado
el registro Un inconveniente de estaopción es que es posible perder modi-ficaciones Si por ejemplo, los usua-rios A y B leen el empleado 10, elusuario A modifica su nombre y loguarda, y luego B modifica el apelli-
do y lo guarda, las dos actualizacionestienen éxito, pero la modificación quehizo A se pierde, ya que el nombre essobrescrito con el valor que leyó B
En ciertos sistemas, esta posible dida de modificaciones es inaceptable
pér-y por tanto habría que elegir otraopción
Otra alternativa sería incluir en la
cláusula SET sólo los campos que se
han modificado De esta manera, que sólo incluyéramos la clave pri-
aun-maria en la cláusula WHERE, no se
perderían las modificaciones También
es una opción interesante incluir en
la cláusula SET sólo los campos ficados, y en la cláusula WHERE la
modi-clave primaria más el valor original delos campos que han cambiado, así elconflicto de concurrencia que detec-taríamos sería en el caso de que otrousuario hubiera modificado alguno delos campos que han sido modificados
o en el caso de eliminación Por plo, si los usuarios A y el B leen elempleado 10, el usuario A modifica su
ejem-nombre y lo guarda y el usuario Bmodifica su nombre y lo guarda, elusuario B recibe un conflicto de con-currencia Pero si lo que ocurre es que
el usuario A modifica el nombre y el
B el apellido, no hay conflicto de currencia y las dos actualizaciones tie-nen éxito
con-Una última alternativa para la
cláu-sula WHERE es incluir la clave
pri-maria más el valor original de un
cam-po de ticam-po TimeStamp que cam-por
supues-to tendría que formar parte de la tabla
El funcionamiento es equivalente aincluir los valores originales de todos
CREATE TABLE Empleados (
IdEmpleado INT IDENTITY(1,1) PRIMARY KEY,
DNI VARCHAR(12) NOT NULL UNIQUE,
Nombre VARCHAR(50) NOT NULL,
Apellidos VARCHAR(50) NOT NULL
)
UPDATE Empleados
SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos
WHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND
Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos
UPDATE Empleados SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos WHERE IdEmpleado=@Original_IdEmpleado
Los conflictos de concurrencia no se producen
solamente al actualizar un registro porque otro usuario
lo haya modificado, también ocurren si el registro
ha sido eliminado por otro usuario
Trang 22ins-tipo TimeStamp en SQL Server es una especie de
autonumérico de 64 bits único en toda la base dedatos No puede haber dos registros en una base de
datos con el mismo valor de TimeStamp, incluso
aunque pertenezcan a distintas tablas Cada vez que
se modifica un registro que tiene un campo
TimeStamp, el valor del campo también cambia.
Debido a esto y si usamos esta alternativa, después
de modificar un registro, sería necesario volver a
leer el campo TimeStamp para poder realizar más
modificaciones en el mismo registro
Detectar conflictos de concurrencia en la minación es similar a la actualización, con la salve-dad de que en este caso sólo podemos jugar con la
eli-cláusula WHERE de la instrucción DELETE.
Podríamos incluir sólo la clave primaria, en cuyocaso sólo obtendremos conflictos de concurrenciacuando otro usuario haya eliminado el registro En
la mayoría de los casos, este conflicto
sencillamen-te lo podríamos ignorar También podríamos incluirtodos los valores originales de los campos o la cla-
ve primaria más el TimeStamp, en cuyo caso
reci-biremos un conflicto de concurrencia cuando otrousuario haya modificado o eliminado el registro
Una vez que tenemos decidido cómo vamos adetectar los conflictos de concurrencia y cómovamos a hacer las actualizaciones y eliminaciones,hemos de decidir cómo los vamos a tratar, o sea,qué acciones vamos a tomar en el caso de un con-flicto de concurrencia Cada conflicto de concu-rrencia lo trataremos de manera diferente en fun-ción de si se ha producido al hacer una actualiza-ción o al realizar una eliminación y en función de
la causa del conflicto, esto es, si ha sido porqueotro usuario lo ha modificado o porque lo ha eli-minado
Empecemos primero por los conflictos que seproducen al actualizar Si la causa es que otro usua-rio lo ha modificado podríamos tener las siguien-tes alternativas:
• Descartar las modificaciones y refrescar el registro
volviéndolo a leer de la base de datos Al usuario
le avisaríamos del conflicto de concurrencia y
le daríamos la oportunidad de volver a hacerlas modificaciones
• Refrescar sólo los valores originales sin descartar las
modificaciones Al usuario le avisaríamos del
con-flicto Entonces él tendría la oportunidad dever las modificaciones deshaciendo cambios o
de volver a guardar con lo que forzaría la lización
actua-• Directamente forzar la actualización Esto se
conoce como la técnica “el último que llegagana” En realidad esta acción no es una res-puesta a un conflicto de concurrencia, ya quepara llevarla a cabo incluiríamos únicamente
la clave primaria en la cláusula WHERE, no
detectándose conflictos de concurrencia pormodificación
Si la causa es que otro usuario lo ha eliminado,las alternativas serían las siguientes:
• Volver a insertar el registro en la base de datos En
el caso de que tengamos un autonumérico en
la tabla no sería posible volver a insertar elregistro exactamente igual a como era ante-riormente
• Eliminarlo del DataSet Esta es la opción que
más se suele utilizar
Detectar la causa del conflicto, al igual querefrescar un registro, puede realizarse volviendo aleer tal registro de la base de datos basándose en laclave primaria, pero si la clave primaria puede cam-biar, esta técnica no sirve para su propósito ya que
si ésta ha cambiado no es posible identificar el tro y no es posible determinar si el conflicto de con-currencia ha ocurrido por modificación o por eli-minación Por eso sería recomendable usar clavesprimarias artificiales como autonuméricos oGUID’s
regis-En cuanto a los conflictos de concurrencia que
se producen al eliminar un registro, podríamos tenerlas siguientes alternativas cuando la causa es pormodificación:
• Deshacer la eliminación y refrescar el registro Al
usuario le informaríamos del conflicto y dría la posibilidad de volverlo a eliminar des-pués de haber visto los cambios realizados
ten-La técnica de detección se basa fundamentalmente
en incluir en la cláusula WHERE
de la instrucción UPDATE o DELETE
el valor original de los campos
Trang 23• Forzar la eliminación En realidad
esta acción no es una respuesta a
un conflicto de concurrencia, ya
que para llevarla a cabo
incluiría-mos únicamente la clave primaria
en la cláusula WHERE con lo que
no se detectan conflictos de
con-currencia por modificación
Por último, el conflicto de
concu-rrencia que se produce al eliminar un
registro que ha sido eliminado,
gene-ralmente puede tratarse
sencillamen-te ignorando el conflicto y
eliminan-do definitivamente el registro del
DataSet.
Como hemos visto, existen varias
alternativas para detectar y tratar los
conflictos de concurrencia Veamos
ahora qué nos ofrece ADO.NET en
este sentido
En ADO.NET tenemos una serie
de clases, los DataAdapters, que son
los encargados de revertir las
modi-ficaciones realizadas en un DataSet
sobre la base de datos mediante su
método Update Los DataAdapters
tie-nen tres propiedades: DeleteCommand,
UpdateCommand e InsertCommand que
son los comandos de actualización
Estos comandos son parametrizados,
de manera que sirvan para todas las filas
de un DataTable Cuando invocamos al
método Update de un DataAdapter, éste
recorre todas las filas del DataTable, y
si la fila es una fila eliminada, ejecuta
el DeleteCommand; si la fila es una fila
modificada, invoca el UpdateCommand;
y si es una fila nueva, invoca al
InsertCommand Si al invocar al
Update-Command o al DeleteUpdate-Command, el
número de registros afectados es cero,
el DataAdapter lanza una excepción
DBConcurrencyException indicando que
se ha producido un conflicto de
con-currencia Antes de invocar un
coman-do de actualización, el DataAdapter
establece el valor de los parámetros del
comando con los valores originales o
actuales de los campos de la fila
basán-dose en la configuración del propio
comando Cada parámetro de la
colec-ción Parameters de un comando tiene
la propiedad SourceColumn que indica
el nombre del campo cuyo valor
debe-rá copiarse al padebe-rámetro, y la
propie-dad SourceVersion que indica si se trata
del valor actual o del valor original
Antes de poder invocar al método
Update de un DataAdapter tenemos
que configurarlo correctamente, esto
es, tenemos que establecerle loscomandos de actualización Para con-
figurar un DataAdapter tenemos tres
alternativas:
• Usar el asistente para la
configu-ración del DataAdapter
• Usar un CommandBuilder
• Configurarlo manualmenteescribiendo nosotros mismos elcódigo
Para usar el asistente, sólo
tene-mos que arrastrar un DataAdapter
de la ficha datos del cuadro deherramientas a nuestro formulario
o componente y seguir sus ciones En el paso “Generar las ins-trucciones SQL” tenemos un botón
instruc-“Opciones avanzadas” que nos
pre-senta el cuadro de diálogo de lafigura 1
Como vemos, el asistente puedegenerar por nosotros los comandos de
actualización INSERT, UPDATE y
DELETE Si elegimos “Usar
concu-rrencia optimista”, el asistente
inclui-rá en la cláusula WHERE de las trucciones UPDATE y DELETE el
ins-valor original de todos los campos delregistro Mientras que si no activamosesa casilla de verificación, la cláusula
WHERE sólo incluirá la clave
prima-ria Si elegimos “Actualizar el junto de datos” el asistente añade una
con-instrucción SELECT a los comandos
de actualización para refrescar el tro En cualquier caso, la instrucción
regis-UPDATE incluye en la cláusula SET
todos los campos
Esta sería la instrucción
UPDA-TE para nuestra tabla de ejemplo
usando concurrencia optimista Vertabla 1
Figura1 Opciones avanzadas de generación de instrucciones SQL.
UPDATE Empleados SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos WHERE IdEmpleado=@Original_IdEmpleado AND DNI=@Original_DNI AND Nombre=@Original_Nombre AND Apellidos=@Original_Apellidos
Trang 24Como hemos dicho anteriormente, también
podemos usar un CommandBuilder Este sería el
código a usar para nuestra tabla de ejemplo:
Las instrucciones UPDATE y DELETE serían
equivalentes a las generadas por el asistente
usan-do concurrencia optimista y sin actualizar el junto de datos
con-La alternativa de configurar manualmente el
DataAdapter no es muy recomendable, ya que
requiere escribir bastante código y la funcionalidadobtenida es exactamente igual a la conseguida usan-
do el asistente Además es posible que cometamosalgún error al escribir el código, mientras que elasistente no los comete
Como vemos, el DataAdapter sólo nos deja la bilidad de incluir en la cláusula WHERE de las ins- trucciones UPDATE y DELETE o bien la clave pri-
posi-maria, o bien todos los campos No tenemos las otrasalternativas que se mencionan en este artículo Además
en la cláusula SET de la instrucción UPDATE, sólo
podemos incluir todos los campos, no tenemos laopción de incluir sólo los modificados
Por otra parte, ADO.NET sólo da soporte para
la detección del conflicto de concurrencia, no haynada que nos ayude a gestionarlo, por lo que ten-dremos que escribir nosotros mismos el códigonecesario
El código de ejemplo del fuente 1 muestra comogestionar conflictos de concurrencia, refrescando
el registro si ha sido modificado y eliminándolo si
ha sido eliminado
Como vemos, gestionar los conflictos de rrencia no es trivial y repetir el mismo código una yotra vez para cada caso es muy laborioso y pesado
concu-Una buena alternativa a los DataAdapters que
vie-nen incluidos en NET Framework, es escribir
nues-tro propio DataAdapter que no tenga estas
limita-ciones, que sea capaz de gestionar los conflictos deconcurrencia y que disponga de todas las opciones
mencionadas en este artículo Podéis encontrar un
DataAdapter para SQL Server (SqlRanger.SqlAdapter)
escrito por mí en la web de la revista o en mi propiapágina web: http://sqlranger.com/descargas.aspx
Este DataAdapter es completamente gratis y se
incluye el código fuente así como un ejemplo de su
uso El SqlRanger.SqlAdapter tiene propiedades
espe-cíficas para tratar la concurrencia Entre las que seincluyen:
• UpdateCriteria: Determina los campos a incluir
en la cláusula WHERE de la instrucción
UPDATE Puede tomar los siguientes valores:
• All: Se incluirán los valores originales de
todos los campos
• Key: Se incluirá sólo la clave primaria.
• Modified: Se incluirá la clave primaria más
los valores originales de los campos ficados
modi-• TimeStamp: Se incluirá la clave primaria más
el valor original del campo TimeStamp si es
que existe
• UpdateColumns: Determina qué campos recerán en la cláusula SET de la instrucción
apa-UPDATE Puede tomar los siguientes valores:
• All: Se incluyen todos los campos.
• Modified: Se incluyen sólo los campos
modi-ficados
• DeleteCriteria: Determina los campos a incluir
en la cláusula WHERE de la instrucción
DELE-TE Puede tomar los siguientes valores:
• All: Se incluirán los valores originales de
todos los campos
• Key: Se incluirá sólo la clave primaria.
• TimeStamp: Se incluirá la clave primaria más
el valor original del campo TimeStamp si es
que existe
UPDATE Empleados SET DNI=@DNI, Nombre=@Nombre, Apellidos=@Apellidos WHERE IdEmpleado=@Original_IdEmpleado
SqlDataAdapter Adapter = new SqlDataAdapter(“SELECT * FROM Empleados”, Connection);
SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);
Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();
Adapter.InsertCommand = CommandBuilder.GetInsertCommand();
Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();
Trang 25public void Guardar(DataTable Empleados)
{
// creamos un adapter para realizar la actualización
SqlDataAdapter Adapter = new SqlDataAdapter(“SELECT * FROM Empleados”, this cn);
// usamos un command builder para configurar los comandos de actualización
SqlCommandBuilder CommandBuilder = new SqlCommandBuilder(Adapter);
Adapter.UpdateCommand = CommandBuilder.GetUpdateCommand();
Adapter.InsertCommand = CommandBuilder.GetInsertCommand();
Adapter.DeleteCommand = CommandBuilder.GetDeleteCommand();
// este comando nos sirve para refrescar un registro
SqlCommand Resync = new SqlCommand(“SELECT * From Empleados WHERE IdEmpleado=@IdEmpleado”, this cn);
Resync.Parameters[“@IdEmpleado”].Value = ex.Row[“IdEmpleado”, DataRowVersion.Original];
// el método Fill buscará el registro en el DataTable
// por clave primaria (IdEmpleado) y lo “refrescará”
// y volvemos a lanzar la excepción ex.Row.Delete();
// la causa del conflicto es que ha sido modificado
// Si el conflicto ha sido al eliminar el registro
// Fill ya lo habrá “recuperado” y refrescado
// Aparecerá el registro con el error
// Si el conflicto ha sido al modificar el registro
// Fill lo habrá “refrescado” Y aparecerá el registro
Trang 26Determina la acción a realizar en
caso de un conflicto de
concu-rrencia al actualizar un registro
porque haya sido modificado
des-de la última vez que se leyó Puedes-de
tomar los siguientes valores:
• NoAction: No hace nada.
• ResyncAllValues: Refresca todos
los valores del registro, dolo a leer de la base de datos
volvién-• ResyncOriginalValues: Refresca los
valores originales del registro,leyéndolo de la base de datos
• ConflictUpdatingDeletedAction:
Determina la acción a realizar en
caso de un conflicto de
concurren-cia producido al actualizar un
regis-tro porque haya sido eliminado
des-de la última vez que se leyó Puedes-de
tomar los siguientes valores:
• Delete: Elimina
definitivamen-te el registro del DataSet.
• Insert: Vuelve a insertar el
re-gistro en la base de datos
• NoAction: No hace nada.
• ConflictDeletingChangedAction:
Determina la acción a realizar encaso de un conflicto de concu-rrencia producido al eliminar unregistro porque haya sido modi-ficado desde la última vez que seleyó Puede tomar los siguientesvalores:
• NoAction: No hace nada.
• ResyncAllValues: Refresca el
registro, volviéndolo a leer de
la base de datos
• ResyncCommand: Comando
parametrizado basado en
cla-ve primaria utilizado pararefrescar un registro
El SqlRanger.SqlAdapter genera
auto-máticamente los comandos de
actualiza-ción y el ResyncCommand, no siendo
nece-sario proporcionárselos Para ello hace
uso del SqlRanger.CommandBuilder.
Conclusión
La concurrencia es un tema mático en ADO.NET dada su natura-leza desconectada Existen varias opcio-nes para detectar y tratar los conflictos
proble-de concurrencia Cada una proble-de estasopciones tiene sus ventajas e inconve-nientes y es necesario elegir cuidadosa-mente la más adecuada para el sistema
en cuestión ADO.NET da soportelimitado para la gestión de la concu-rrencia, siendo una buena alternativa
escribir nuestro propio DataAdapter para
superar las limitaciones
noticias noticias noticias noticias
¿Qué es Whitehorse?
Whitehorse es el nombre en clave del software que se incluirá en
Visual Studio 2005 y que aporta herramientas de diseño model-driven
dirigida a los arquitectos de software, enlazando el modelo conceptual
al código
Tendremos más información en el devdays que se celebrará en San Diego,
California entre el 23 y el 28 de Mayo
(http://www.microsoft.com/semi-nar/teched2004) En Europa se celebrará en Ámsterdam, Holanda, entre el
29 de Junio y el 2 de Julio (http://www.microsoft.com/europe/teched).
Entretanto puede descargarse un video demostrativo de la web de
MSDNTV en http://msdn.microsoft.com/msdntv
¿Qué es Laguna?
En el Microsoft Mobile DevCon Conference 2004 celebrado en
San Francisco entre el 23 y el 27 de marzo se habló de “Laguna”,
nom-bre en clave del SQL Server CE 3.0 Esta versión se verá retrasada igual
que la versión completa, el SQL Server 2005 Según nuestras noticias,
ambas versiones saldrán juntas, si bien la versión beta 1 de Laguna
esta-rá disponible cuando esté la beta 2 de Yukon.
La web del Mobile DevCon Conference 2004 está en:
http://www.microsoftmdc.com.
Puede ver información de la versión actual de SQL Server CE 2.0
en: http://www.microsoft.com/sql/ce
¿Qué es Indy?
Indy es el nombre en clave de una nueva herramienta de gestión
desarrollada por Microsoft Research y que se comercializará por la
divi-sión Enterprise Management de Microsoft Simula un centro de datos
empresarial derivado del modelo de hardware, software y los sistemas
de servidores del cliente.
Indy está inmerso en la versión 2.0 de la suite Microsoft System Center para la que aún no hay fecha prevista de salida, ni tan siquiera una aproximación La versión actual, la 1.0 llamada System Center 2005
es la primera suite de gestión integrada para el Windows Server System
e incluye el System Management Server 2003, Microsoft Operations Manager 2005 y el nuevo sistema común de reporting.
Se habló de él en el Summit celebrado en Las Vegas el pasado mes de marzo La web del Summit 2004: http://www2.mms2004.com.
Más información en Microsoft Watch: http://www.microsoft-watch.com
y en el sito Betanews http://www.betanews.com/article.php3?sid=1079576470
¿Qué es Lonestar?
Aparte de un mítico grupo de rock catalán de los años 70, Lonestar es
el nombre en clave de la próxima versión del sistema operativo de Microsoft para Tablet PC Si bien se iba a vender como un add-on para los usuarios
de Tablet PC, finalmente será incluido dentro de Windows XP SP2 Tendrá
un nuevo SDK para desarrolladores e integración con Office 2003.
¿Qué es Windows XP Reloaded?
Windows XP Reloaded es el nombre en clave para la versión de Windows XP que hará de puente entre la actual y Longhorn.
¿Qué es Symphony y Harmony?
Symphony es el nombre en clave de la próxima versión de Windows
XP Media Center Edition el cual está basado en XP SP2 Una versión previa a Windows XP Media Center Edition 2004 Harmony es el nom- bre en clave del próximo Windows XP Media Center Edition 2004 Incluirá soporte para High Definition Televisión, soporte para múl- tiples sintonizadores, soporte para diferentes formatos de grabación de vídeo y radio.
¿Qué es qué?
¿Qué es qué?
Trang 27Componentes y Reflexión antes de NET
Las tecnologías orientadas a componentescomo COM y CORBA utilizan lenguajes deDefinición de Interfaces (IDLs) para especifi-car tipos Pero los IDLs se basan sólo en las sig-naturas de los métodos y no incluyen más infor-mación semántica que la que se puede deducir
de los tipos y nombres de los métodos y de susparámetros
Java alivia la limitación anterior porque la
noción de tipo definido por un interface 1estáincluida en el propio lenguaje de programaciónJava Sin embargo, la tecnología Java tiene lasdebilidades siguientes:
• Debido a su enfoque monolingüístico,una componente en Java sólo se puedeusar por otra componente Java No hayuna forma simple de conectar una com-ponente Java con una componente escri-
ta en otro lenguaje o viceversa
• Un buen aporte de Java es que permiteincluir información extra en una compo-nente por vía de determinados convenios
en la escritura de comentarios especiales
Pero el mecanismo de reflexión de Java
no ofrece recursos para recuperar estainformación que se ha incluido en unacomponente en forma de comentarios
Los desarrolladores deben conocer y bajar directamente con la forma en queinternamente estos comentarios están den-tro de un fichero Java byte code De modoque un cambio en esta forma de repre-sentación implicaría cambios en las apli-caciones que utilizan estos comentarios
27
El poder de la reflexión en NET
Por Mario del Valle y Miguel Katrib
Grupo Weboo Universidad de La Habana
Entre otras razones NET supera a gías de componentes precedentes por la transparencia con la que integra código y metadatos favoreciendo con ello la metapro- gramación Este trabajo muestra cómo usan-
tecnolo-do reflexión (reflection) se define un
conver-sor de tipos que permite a partir de un
obje-to, el cual comparte una misma funcionalidad con un interface, obtener un objeto proxy equivalente en funcionalidad al original pero que garantiza ser subtipo de dicha interface.
De este modo el objeto proxy puede ser lizado como si estáticamente hubiese decla-
uti-rado que implementa el tipo interface Con
ello se facilita la adaptabilidad del software y
la factorización de código ya existente para poder aprovechar una funcionalidad común.
La solución propuesta permite ilustrar más la existencia de un peligroso agujero de seguridad en el sistema de tipos de NET, el cual lamentablemente no es controlado por
ade-el CLR.Esta falla permitiría la escritura de
códi-go malicioso aún ejecutando bajo el supuesto modo seguro del código administrado.
<
1 Para evitar confusiones hemos mantenido el término en inglés interface para referirnos a una de las formas de tipo en NET Lamentablemente
éste término es malinterpretado y usado incorrectamente en castellano cuando en ocasiones se escribe “interfase” o cuando se usa “interfaz” con
el que muchos lectores identifican el concepto de interfaz gráfica de usuario (GUI).
< <
Trang 28Componentes y Reflexión
en NET
Las componentes de software en
.NET se basan en el concepto de
ensamblado (assembly).
• Un ensamblado en NET es
neu-tral desde el punto de vista del
len-guaje Un ensamblado NET se
puede utilizar de modo simple
des-de otro ensamblado con indes-depen-
indepen-dencia del lenguaje fuente en que
haya sido escrito cada uno
• Un ensamblado en NET contiene
código y metadatos Estos
metada-tos pueden ser extraídos de la
com-ponente mediante los recursos de
reflexión que el propio NET
ofre-ce De modo que las aplicaciones
que extraen y procesan la
informa-ción inmersa en un ensamblado en
forma de metadatos no dependen
de cambios en el formato físico en
que se representan estos metadatos
• NET introduce los atributos, una
nueva creación para que los
desa-rrolladores puedan añadir sus
pro-pios metadatos Los atributos son a
fin de cuentas objetos y por tanto
pueden gozar de muchos de los
beneficios que el modelo Orientado
a Objetos soporta
Con el presente trabajo
comenzare-mos a ir descubriendo el uso de la
refle-xión en NET y la utilidad de los
atri-butos y lo que la mezcla de ambos
pue-de significar para potenciar las
capaci-dades de metaprogramación de NET
Factorizando tipos en NET
Una tarea frecuente en
programa-ción consiste en reproducir un
com-portamiento similar mediante
diferen-tes implementaciones Si el
desarrolla-dor puede prever esta situación lo usual
debe ser entonces definir un tipo raíz
(sea definido por una clase o por un
interface en NET) y definir los
dife-rentes tipos que heredan (o
implemen-tan) del tipo raíz
Pero qué podemos hacer si varios
tipos ya existentes tienen un
comporta-miento común pero no han sido
defini-dos con una tal raíz común ¿Qué hacer
si queremos incorporar una nueva
fun-cionalidad que pueda trabajar con quiera de estos tipos de comportamiento
cual-“similar”?
Supongamos que tenemos dos tipos
By C que tienen un subconjunto demétodos f1, f2, … fncomunes a ambospero desafortunadamente estos tipos B
y C no fueron concebidos como ses derivadas de una clase base común
cla-A(o como implementaciones de un tipo
¿Cómo implementar una nueva cionalidad NewMethodque sea capaz detrabajar con objetos que tengan esta fun-cionalidad común f1, f2, … fninde-pendientemente si los objetos son detipo Bo de tipo C?
fun-Solución 1: Replicar la nueva lidad para cada uno de los tipos B y C
funciona-Como en NET disponemos desobrecarga de métodos la solución mástradicional fuerza a reescribir la nuevafuncionalidad reescribiendo el mismocódigo para usar cada uno de los tipos ( B y C en nuestro ejemplo)
solu-el bajo grado de escalabilidad debido a
la replicación de código que esto
impli-ca Si queremos que un nuevo tipo D
con funcionalidad similar a la de B y C
pueda usarse como parámetro de
NewMethodhabría que escribir un nuevo
NewMethod con un código similar al delos ya existentes sólo para poder acep-tar un parámetro del nuevo tipo D
Solución 2: Escribir un único método que haga una selección múltiple
Otro enfoque es escribir un único
NewMethodque se base en que el metro formal está declarado estática-mente como del tipo raíz Object y lue-
pará-go aplicar internamente la dad correspondiente según el tipo delparámetro real en ejecución
funcionali-void NewMethod(Object x){
if (x is B) ((B)x).f1();
else if (x is C) ((C)x).f1();
if (x is B) ((B)x).fn();
else if (x is C) ((C)x).fn();
}
Pero esta solución tiene también unalto grado de dependencia y baja escala-bilidad Si se desea incorporar un nuevotipo D hay que reprogramar el NewMethod
ya existente (para lo cual habría que poner del código fuente) para introducirinternamente las nueva alternativa
dis-if (x is D) ((D)x).fn();
Si bien esta variante de solución noreplica código como la anterior, es inefi-ciente debido a las preguntas para deter-minar el tipo que dinámicamente tendrá
el objeto que se pasa como parámetro y
a las operaciones de conversión o
Trang 29deo (casting) para poder interpretar al parámetro formal
como del tipo deseado Pero es más, este enfoque no es
aplicable si D fuese un tipo creado dinámicamente en
tiempo de ejecución porque no dispondríamos de una
definición estática de D para colocar estáticamente el
segmento de código anterior dentro de NewMethod
Una solución basada en reflexión
Una mejor solución se basa en crear
dinámica-mente usando reflexión (lo que se verá en la sección
siguiente) un tipo proxy que emule al original pero
que sí especifique definir al tipo interface que expresa
la comunalidad Es decir, una vez que el
desarrolla-dor interesado detecte que hay un comportamiento
similar en los tipos B y C debe definir entonces un
tipo IA que exprese este comportamiento común
El nuevo código NewMethod que quiere aprovechar
esto común debe escribirse basado en que el
paráme-tro formal sea del tipo interfaceIA
El problema que hay que resolver es cómo lograr
que los objetos de tipo B o C,o de un nuevo tipo D
que pueda entrar en escena más adelante, puedan ser
pasados como parámetros a este método aún cuando
el tipo de estos no indique implementar IA
A fin de cuentas no debería ser el código de NewMethod
quien tiene que cargar con esa responsabilidad Si
que-remos pasarle un x a NewMethoddebería ser el código que
llama el que pueda indicar algo así como: interprétame a
éste xcomo de tipo IAaún cuando el tipo estático de xno
hubiese sido definido como que implementa a IA
Para lograr esto definimos un método Cast El
método Cast recibe como primer parámetro el
obje-to original y como segundo parámetro el tipo
interfa-ce como el que se desea que el primer parámetro sea
interpretado El método Cast creará dinámicamente
un tipo proxy que emula al tipo del objeto original
pero que indica implementar al tipo interface y
devol-verá como respuesta el tal objeto proxy
De este modo el código cliente interesado en usar
la funcionalidad NewMethodpara un objeto de tipo B
que tiene la funcionalidad expresada por IA debeseguir el siguiente patrón
B b = new B();
IA a = (IA)Caster.Cast(b, typeof(IA));
NewMethod(a);
La Figura 1 nos ilustra este escenario
Usando reflexión y las capacidades de generación decódigo que ofrece NET, el método Cast crea dinámi-camente un tipo IAProxyFor_B que implementa IA yque actúa como proxy de la funcionalidad común que eltipo B tiene con IA El tipo IAProxyFor_B es generadocon un patrón cuyo código IL equivaldría a un códigofuente C# como el que se muestra a continuación
class IAProxyFor_B : IA{
B realTarget;
public IAProxyFor_B(B x){
realTarget=x;
} public T1 f1(){
return realTarget.f1();
}
public Tn fn(){
return realTarget.fn();
} }
Un ejemplo real en las Windows Forms
Un escenario común en las GUIs es hacer unaselección de un elemento entre varios de una lista
Trang 30Habitualmente se usa para este fin un ComboBoxo un
ListBox Suponga que queremos un método
Configureque pueda trabajar tanto para un ComboBox
como para un ListBox Habría que escribir doscopias muy similares del tal método que sólo difie-ren en el tipo del parámetro (Fuente 1)
En un caso como este sería conveniente tener unainterfaz IListControlque “factorizara” el comporta-
miento común de ComboBox y ListBox que nos resa utilizar:
inte-interface IListControl{
object SelectedItem{
get; set;
} int SelectedIndex { get; set;
} IList Items{ get;}
string Text {get; set;}
bool Sorted { get; set; } void BeginUpdate();
void EndUpdate();
void Refresh();
event EventHandler SelectedValueChanged;
event EventHandler SelectedIndexChanged;
Si lo que se quiere es aplicar este método con un
ComboBox, bastaría con hacer:
ComboBox combo = new ComboBox();
Configurate((IListControl)Caster.Cast(combo,
typeof(IListControl)));
Para el ListBoxlo mismo:
ListBox list = new ListBox();
combina-ría un namespace Reflection y dentro de este a su
vez el namespace Emit Ilustraremos en esta seccióncómo usando estos recursos el método castTo pue-
de generar el tipo proxy del que hablamos en lassecciones anteriores
Para generar un tipo dinámicamente primerohabría que generar un ensamblado donde colocar altal tipo (Fuente 2)