1
Frameworks y Componentes(... reutilizar, reutilizar, reutilizar!!! ...)
Universidad de los AndesDemin Gutierrez
Abril 2010
Frameworks
Diseo Arquitectnico
Diseo Arquitectnico
Arquitectura del Software
Bibliotecas /Componentes
Patrones de Diseo
Clases / Funciones
Frameworks(Marcos)
EstilosArquitectnicos
4
Qu es un Framework?
A quienes les gusta la TV?
Telenovelas?Series de TV?
Qu tiene que ver esto con el uso de frameworks o componentes?
5
Qu es un Framework?
El trmino framework se podra traducir al espaol como
armazn o andamio, que viene a ser una estructura
genrica que se utiliza para colocar diversos elementos
segn sean necesarios
6
Qu es un Framework?
Telenovelas?Series de TV?
En el cine, la TV y la literatura existe un concepto similar, la idea es que es posible
tomar una plantilla particular de una historia y reusarla (repetirla) una y otra vez en diferentes contextos, con diferentes personajes, en distintas pocas, etc.
Eso se puede ver como un framework para escribir historias.
7
Qu es un Framework?
La Bsqueda de la Generalidad y la Reusabilidad!
Un framework (armazon), es una abstraccin en la que cierto cdigo comn provee una funcionalidad genrica
que puede ser sobrescrita o especializada de forma selectiva por medio de cdigo con funcionalidad especfica provisto por los clientes del framework
(desarrolladores de software / programadores)
Un framework es una solucin incompleta (no funcional) pero concreta (a diferencia de los estilos
arquitectnicos o los patrones de diseo) a un problema recurrente bien conocido
8
Cmo ayuda un framework al desarrollo de software?
Un framework facilita el desarrollo de software permitiendo a los diseadores y
programadores dedicar su tiempo a lograr los requerimientos de software en lugar de lidiar
con los detalles de bajo nivel necesarios para obtener un sistema funcional
De esta forma se puede reducir el tiempo total de desarrollo de la aplicacin
9
Cmo ayuda un framework al desarrollo de software?
Por ejemplo, un equipo que esta desarrollando un sistema WEB bancario al
usar un framework de desarrollo WEB puede enfocarse en el desarrollo de las
operaciones de retiro y transferencias de dinero en lugar de tener que enfocarse en la mecnica del manejo de las peticiones HTTP o el manejo de las sesiones de los
usuarios y el estado de la aplicacin
10
Un framework es una forma de reutilizar una arquitectura de
software
Qu relacin tiene un framework con los estilos arquitectnicos?
Qu relacin tienen un framework con otros aspectos del diseo y
Arquitectura de Software?
Frameworks y Arquitectura de Software?
Frameworks y Arquitectura de Software?
Bibliotecas /Componentes
Patrones de Diseo
Clases / Funciones
Frameworks(Marcos)
EstilosArquitectnicos
Visin estructural y/o dinmica de cmo debera ser un sistema, no
utilizable o ejecutable directamente (out of the box)
Visin estructural y/o dinmica de cmo se pueden resolver ciertos
problemas comunes de diseo, no utilizable o ejecutable directamente
(out of the box)
Implementacin y funcionalidad concreta, utilizable directamente desde el cdigo de la
aplicacin implementada
Aplicacin
Menor nivel de abstraccin
definen
implementan
ImplementanSe disean usando (entre otras cosas)
UtilizanDefinen laArquitectura
12
Segn Pree, los frameworks estn conformados por zonas congeladas (frozen spots) and zonas calientes
(hot spots)
Las partes congeladas definen la arquitectura general de un sistema de software, es decir, sus componentes bsicos y las relaciones entre estos.
Esas partes permanecen inalteradas (congeladas) en cualquier instanciacin del framework
Las partes calientes representan los puntos en los que los programadores pueden aadir su propio cdigo para aadir la funcionalidad especifica de su propio
proyecto
Pree, W (1994), "Meta Patterns-A Means For Capturing the Essentials of Reusable Object-Oriented Design", Proceedings of the 8th European Conference on Object-Oriented
Programming (Springer-Verlag): 150162
Frameworks, y la teora de las zonas fr as y las zonas calientes?
13
Qu es un Framework?
Los frameworks en si mismos no son usualmente ejecutables (a diferencia de un
programa o una aplicacin).La idea es que el framework es utilizado en
una aplicacin particular, que rellena los hot spots necesarios para satisfacer unos
requerimientos particulares dentro de un contexto de funcionamiento particular.
El proceso anterior se llama instanciacin del framework.
14
Frameworks, y la teora de las zonas fr as y las zonas calientes?
Instanciacin 1 Instanciacin 2
frozen spots
Framework
hot spots(hooks)
funcionalidadaadida (Cliente)
comportamientopor defecto
Inve
rsi
n de
Con
trol
(Io
C)
15
Frameworks caja blanca y caja negra?
Un framework caja blanca (white box) requiere que los usuarios tengan conocimiento de la estructura y cdigo
interno del framework, generalmente vienen con el cdigo fuente y normalmente su comportamiento se
extiende por medio del uso de subclases y herencia
Un framework caja negra (black box) no requiere un entendimiento o conocimiento profundo del
funcionamiento interno (estructura / cdigo) del framework. Generalmente el framework se extiende
componiendo y delegando comportamiento entre objetos (Muchos de los cuales son las extensiones del
usuario)
En el medio estn todos los matices posibles...(Caja Blanca y Caja Negra al mismo tiempo -> Caja Gris)
Ms fcil de usar
Ms difcil de program
ar (En general)
El ideal, el sueo de todo desarrollador es hacer un framework completamente caja negra!
16
EJEMPLO:Implementemos un
Solitario!
Frameworks: Caja Blanca, Caja Negray Ejemplos.. .
17
Un solitario es un juegoen el que hay:
Frameworks y Arquitectura de Software?
Cartas: Unidades bsicas que se
mueven de un lado a otro, bien sea de
forma separada o en grupos
Bases: Lugares donde poner cartas, aplican reglas sobre
que cartas se pueden poner /
quitar
Pilas: Grupos de cartas, generalmente sobre una base (o en movimiento, a modo
de un grupo de cartas). Aplican
reglas sobre que cartas se pueden
quitar o aadir de/a una pila
18
El objetivo del juego es acomodar las cartas de cierta forma o
eliminar todas las cartas de las mesa, siguiendo una serie de
reglas predefinidas que dicen que cartas se pueden mover de una pila
a otra...
Frameworks y Arquitectura de Software?
19
Prcticamente, se pueden definir un conjunto infinito de posibles reglas y
juegos distintos usando el mismo principio
Frameworks y Arquitectura de Software?
Slo acepta una A de cualquier color
NOOK
20
Frameworks y Arquitectura de Software?
Una pila que slo acepta cartas con valor
descendiente y color alterno
NO
NO
SI
21
Frameworks y Arquitectura de Software?
Una pila de la que slo se puede sacar la carta del tope o
grupos de cartas que lleguen alternando su
color con valor descendente al tope
NO
SI
SI
22
Si vamos a programar un juego de solitario hay dos opciones:
1) Programar un slo juego en especifico, con reglas especificas
2) Programar una serie de clases (framework) que permitan luego configurar las reglas
fcilmente para as poder crear cualquier solitario que se requiera
Para la opcin 2, a continuacin una posible implementacin:
Frameworks y Arquitectura de Software?
23
Frameworks y Arquitectura de Software?
MainFrame representan la IU del
solitarioEs la clase encargada de cargar las cartas
del disco
Utilitarios y clases base de Swing
Utilitarios en general
Objetos del Solitario, Cartas, Pilas, Dibujables, etc
Panel en el que se dibujan las cartas (o que contiene
el solitario)
El cdigo de este ejemplo va adjunto a lastransparencias, son los proyectosCardGames01 y CardGames02
24
Frameworks y Arquitectura de Software?
GamePanel se encarga de dibujar las pilas de cartas (que a
su vez dibujan las cartas individuales) as como de manejar los
eventos del ratn
Los eventos del ratn se manejan de forma genrica por parte de GamePanel, es decir, las reglas de que cartas se pueden quitar de una pila o poner en otra no estn implementadas en
esta clase
Las reglas de las pilas estn implementadas en
cada una de las pilas. Por ejemplo borrowCards es invocado para ver si es
posible quitar un grupo de cartas de una pila,
acceptCards es invocado para ver si es posible
poner un grupo de cartas en una pila particular. Toda la lgica y la verificacin se implementa en estos ds mtodos de las distintas
pilas
Ver diagramas de secuenciade las siguientes lminaspara entender el proceso completo de tomar de una pila y poner en otra
25
Frameworks y Arquitectura de Software?
Lo que sucede cuando el usuario aprieta el ratn (sobre una pila)
Si el puntero no est sobre una pila
srcStack es nulo
Si no se permite (por reglas) mover las
cartas selecionadas, tmpStack es nulo
26
Frameworks y Arquitectura de Software?
Lo que sucede cuando el usuario libera el ratn (sobre una pila)
Si el ratn no se libera sobre una pila tgtStack
ser nulo
Si acceptCards retorna falso, quiere decir que la pila por sus reglas no acept las cartas, y
que deben ser devueltas a la pila de
origen
27
Frameworks y Arquitectura de Software?
Es decir, desde el punto de vista de GamePanel (ver diagramas anteriores) toda la lgica de si es posible
sacar una o ms cartas de una pila o poner una o ms cartas en una pila est implementada en la clase Stack,
especficamente en los mtodos borrowCards y acceptCards (respectivamente)
Como podramos tener pilas que tengan distintos comportamientos? Por ejemplo, una pila que acepte
slo cartas del mismo color y otra que acepte cartas de colores intercalados?
28
Frameworks y Arquitectura de Software?
Que tal si se especializa Stack en distintos tipos de pilas, donde cada una de ellas sobrescribe (overrides) el mtodo
acceptCards() y define reglas particulares para cada tipo de pila que se necesite
Desventajas? Inconvenientes?
Acepta cartas slo del mismo color
Acepta cartas de colores intercalados
Acepta cartas slo de valores descendentes
Acepta cartas slo de valores ascendentes
29
Frameworks y Arquitectura de Software?
El problema es que esta estrategia puede terminar en una situacin poco deseable, en la que se produzca una
explosin de clases especializadas con funcionalidad redundante, tal como ocurre en el diagrama anterior...
... y eso que no se ha considerado la necesidad de especializar el comportamiento de borrowCards
Acepta cartas slo de valores descendentes y del
mismo color
Acepta cartas slo de valores descendentes y del mismo color (Opps, no
esta esto repetido???)
Acepta cartas slo de valores ascendentes y
decolores intercalados, etc, etc, etc...
30
Frameworks y Arquitectura de Software?
Es importante notar, que esta estrategia es de tipo caja blanca, es decir, usa herencia. Los Hot Spots son los
mtodos acceptCards y borrowCards, que son necesarios sobrescribir para modificar el comportamiento de la pila (o del
framework)
Alguna solucin al problema de la explosin de clases especializadas?
31
Frameworks y Arquitectura de Software?
En este caso, una pila est compuesta de una serie de Estrategias de prestamo (BorrowRule) y de aceptacin
(AcceptRule) de cartas que se pueden combinar independientemente unas de otras
Define la interfaz de una pequea clase
que establece un comportamiento de
prestamo de cartas
Define la interfaz de una pequea clase
que establece un comportamiento de
aceptacin de cartas
La clase pila est compuesta por una serie de reglas de prestamo y aceptacin de cartas
32
Frameworks y Arquitectura de Software?
Cada una de las clases de este color
definen una regla para poder prestar una carta o un grupo de
cartas de la pila
Las clases verdes definen una regla de aceptacin, por ejemplo DescendantAcceptRule que slo acepta cartas con valores consecutivos descendientes, que se pueden encadenar con otras reglas,
como SameColorAcceptRule, para obtener una pila que solo acepta cartas descendientes consecutivas en valor del mismo color
El mtodo addAcceptRule recibe una instancia de
una regla y la aade a la lista de reglas a verificar al momento de solicitarle a la pila que acepte una carta
o un grupo de cartas.El mtodo acceptCards
funciona de la forma tradicional, slo que ejecuta la cadena de
reglas aadidas y si todas pasan, entonces acepta la carta o el grupo de cartas
33
Frameworks y Arquitectura de Software?
En general, esta es una estrategia completamente caja negra, porque no es necesario conocer como funciona una
clase particular del framework (Stack en este caso) para poder heredar y sobrescribir mtodos, simplemente basta con
implementar una serie de interfaces y componer la pila de estas reglas que son las que hacen el trabajo
34
Frameworks y Arquitectura de Software?
En este ejemplo (y en los que vimos de patrones de diseo) se ve la importancia de programar en funcin de interfaces
bien definidas, que pueden ser implementadas posteriormente a gusto de los programadores y segn las
necesidades que se tengan
35
TODO:Los ejemplos del Juego de Cartas Caja Negra an no estn disponibles (para el
jueves los tengo)
Diagramas de secuencia del Juego de Cartas Caja Negra
Frameworks y Arquitectura de Software?
36
Cmo funciona? Qu brinda un framework?(Recuerda el ejemplo de la TV?)
Comportamiento por defecto: El framework brinda cierto comportamiento por defecto, de modo que el
cliente puede decidir personalizar o aadir funcionalidad en ciertos puntos o puede simplemente
conformarse con el comportamiento por defecto provisto por el framework
Inversin de Control (Inversion of Control / IoC): El desarrollador ya no mantiene el flujo de control, es decir, el ste no es manejado por el invocador o por
el cdigo cliente, sino que es manejado por el framework en si mismo
(El ejemplo de MVC / Struts y PHP que veremos ms adelante)
37
Cmo funciona? Qu brinda un framework?(Recuerda el ejemplo de la TV?)
Cdigo no-modificable del framework: El cdigo del framework en general no debera de poderse
modificar, los usuarios deben de poder extender el framework pero no deberan de poder modificar su
cdigo interno (a menos que deseen de forma explcita arreglar algn problema o colaborar en el
desarrollo del framework)
Extensibilidad: Debe ser posible extender el framework, bien sea sobrescribiendo cierto cdigo o aadiendo algn tipo de extensin (hook / gancho) o
plug-in. Es decir, debe ser posible cambiar el comportamiento por defecto pre-definido en el
framework. En general, los puntos de extensin deben estar muy claros
38
To framework or not to framework? (use)
Si tienen que desarrollar una aplicacin WEB...
(O un compilador, o una aplicacin de escritorio, o un
editor grfico o ...)...tienen dos opciones
39
To framework or not to framework? (use)
Opcin 1:Desarrollar desde cero (from scratch) y para esto
es necesario:
Definir la arquitectura del software(arquitectura general, estilos arquitectnicos, etctera)
Codificar, validar y probar la arquitectura
Codificar la funcionalidad propia del software (aunque esto algunas veces se hace mezclado con el paso anterior)
Encontrar errores y problemas en la arquitectura, refinar la arquitectura, rehacer parte de la funcionalidad, hacer refactors
en el cdigo, etctera
40
To framework or not to framework? (use)
Opcin 2:Tomar una aplicacin WEB que ya est desarrollada
(un framework?) y adaptarla a las necesidades actuales de la aplicacin requerida
Comprender la aplicacin (framework) existente
Usar la arquitectura ya definida / refinada y codificar la funcionalidad...
Claro, la opcin 2 en realidad no implica un framework en si mismo, pero es una primera buena
aproximacin...Que tal si aadimos una opcin 3?
41
To framework or not to framework? (use)
Opcin 3:Tomar una framework
(para desarrollar aplicaciones WEB)
Comprender / aprender a usar el framework
Usar la arquitectura ya definida / refinada en el framework y codificar la funcionalidad...
Aprender a vivir con las limitaciones del framework y resistir la tentacin de desarrollar un
framework propio!!!(a menos que... ver un par de lminas mas adelante)
42
To framework or not to framework? (use)
Sin Framework
Con Framework
Tiempo Ganado al usar el Frameworkvs
Curva de Aprendizaje!
43
Generalmente, si hay un buen framework que cumple con
las expectativas no hay excusa para no utilizarlo...
To framework or not to framework? (use)
44
To framework or not to framework? (development)
Vale la pena desarrollar un framework?... depende ...
Crear un framework es en parte ms arte que ciencia... (lamentablemente)
Generalmente no es buena idea crear un framework, es preferible buscar uno ya existente que resuelva el
problema que se trata de abordar
Desarrollar un framework puede ser un proceso muy costoso (o lento), de modo que es necesario asegurarse que se tendr el adecuado retorno de
inversin
45
To framework or not to framework? (development)
YAGNI: You Ain't Gonna Need It
46
Nadie dice que no puede desarrollar un framework, de hecho, las opciones 1 y 2 (especialmente la 2) del ejemplo anterior
probablemente terminen en el desarrollo de un framework (a largo plazo)
Simplemente se trata de hacer un clculo adecuado de la relacin costo beneficio,
recuerde que en muchos casos el objetivo principal es RESOLVER el problema del
cliente NO DESARROLLAR un framework
To framework or not to framework? (development)
47
Cmo se aprende a desarrol lar frameworks?
Cmo se desarrollan las habilidades para desarrollar frameworks?
1.- Disee / desarrolle software (fundamental)
2.- Practique la programacin (MUY IMPORTANTE)
3.- Trabaje con los problemas de diseo, cometa errores, reconozca los errores cometidos, encuentre soluciones, etctera
4.- Use patrones de diseo
5.- Use patrones de diseo (No es error de copy / paste)6.- USE FRAMEWORKS YA EXISTENTES
7.- Vea el cdigo de frameworks ya existentes (extienda frameworks)
8.- Atrvase y desarrolle pequeos frameworks que hagan pequeas cosas
Componentes
Diseo Arquitectnico
Diseo Arquitectnico
Arquitectura del Software
Bibliotecas /Componentes
Patrones de Diseo
Clases / Funciones
Frameworks(Marcos)
EstilosArquitectnicos
TODO: Lectura :-(
(Sommerville 14)(Diseo con
Reutilizacin)
51
Componentes?
Sera fantstico poder desarrollar software de la misma forma en que se desarrolla el hardware: basndose (en la mayora de los casos) en un conjunto especfico y finito de componentes
52
Componentes?
Sin embargo...
Recuerda usted las siguientes
transparencias?
Desarrol lo Basado en Reuti l izacin(Componentes)
Fuente; Sommerville / Ingeniera del Software (Excepto lo rojo)
Bosquejar losRequerimientos
delSistema
BuscarComponentesReutilizables
(COTS)(Ej. Aplicaciones
Listas o CasiListas)
DiseoArquitectnico
BuscarComponentesReutilizables
(COTS)(Ej. Libreras,Frameworks u
otros)
ModificarRequerimientos
Acorde a losComponentesEncontrados
ModificarComponentesEncontrados
+
Disear elSistema
Utilizando losComponentesReutilizados
ModificarComponentesEncontrados
+
COTS: Commercial Off the Shelf
Almacn/Catlogo de Componentes Reutilizables
Desarrol lo Basado en Reuti l izacin(Componentes)
El sistema se construye uniendo componentes existentes
El costo del sistema se puede reducir notablemente debido a la reutilizacin
***Se est limitado a los componentes existentes, es necesario negociar los requerimientos en base a estos, o modificar los componentes (lo que no siempre es fcil)
para lograr satisfacerlos (o ambas cosas)***
Se necesita todo un armazn o un lenguaje para poder unir los componentes
55
Componentes?
Los componentes de software reutilizables son artefactos auto-contenidos, claramente
identificables que describen y/o ejecutan funciones especficas y tienen interfaces claras, una
documentacin apropiada y un estado de reuso definido
Sametinger, 1997
Un mdulo de bajo acoplamiento y alta cohesin que denota una abstraccin simple
Booch, 1987
56
Componentes?
Cualquier tipo de recurso [elemento] de software que pueda ser reutilizado (por ejemplo, mdulos o
cdigo, diseos, especificaciones de requerimientos, conocimiento de un dominio, experiencia de
desarrollo o documentacin, etctera)
Hooper and Chester, 1991
Los componentes de software son definidos como mdulos de software reutilizables,
auto-contenidos, pre-probados, pre-fabricados que ejecutan funciones especficas y enpaquetan
datos y procedimierntos
57
Componentes?
En general, un componente debe tener las siguientes caractersticas:
Debe ser autocontenido:Un componente no debe requierir la reutilizacin de otros componentes para cumplir su funcin, debe
tener todo lo necesario para poder funcionar.
Sin embargo, es posible que un componente pueda depender de otros componentes para poder
funcionar.
58
Componentes?
En general, un componente debe tener las siguientes caractersticas:
Deben ser identificables:Deben estar contenidos en un archivo (.jar, .zip,
.dll, .so, .exe, etctera) que facilite su indizacin y recuperacin.
Por qu indizacin y recuperacin?
59
Componentes?
En general, un componente debe tener las siguientes caractersticas:
Describen o ejecutan (cumplen) una funcin:Ejecutan una funcin especfica o describen la
funcionalidad de un programa
(Describen? Ver Interfaces / API)
60
Componentes?
En general, un componente debe tener las siguientes caractersticas:
Deben tener interfaces claras y deben ocultar los detalles de su diseo interno:
...el ttulo lo dice todo...
61
Componentes?
En general, un componente debe tener las siguientes caractersticas:
Deben ser mantenidos para facilitar una reutilizacin sistemtica:
Es necesario saber quin es el propietario del componente, quin lo mantiene (Lo mantienen?),
quin brinda soporte (Hay soporte? De qu tipo?), cul es la calidad del componente, etctera.
No vale la pena utilizar un componente con defectos o que no tenga mucha actividad o que no se le haga
mantenimiento de forma adecuada (mantener componentes es costoso, al igual que los
frameworks)
62
Componentes?
Deben una documentacin adecuada que facilite:La recuperacin del componente desde el
repositorio, la evaluacin del componente, su adaptacin al nuevo ambiente y su integracin con otros componentes del sistema en que se reutiliza
En general, un componente debe tener las siguientes caractersticas:
63
La importancia de las interfaces
64
Bien...
Pero en este punto,Cul es la diferencia entre
un framework y un componente?
Cmo elegir un framework o un componente?
65
Cmo saber si vale al pena utilizar un framework o
componente especfico?(Algunos tips para evaluar
frameworks y componentes)
Cmo elegir un framework o un componente?
66
Primero:
Tenga bien claro el contexto y el para qu necesita el
framework...
...y luego considere lo siguiente...
Cmo elegir un framework o un componente?
67
Qu es un Patrn de Diseo?
Asegrese que el framework/componente est siendo mantenido activamente, revise los registros de bugs y los tiempos entre las correcciones. Revise los tiempos entre
releases, el tiempo desde que se liber la ltima versin, la actividad del repositorio de cdigo, etctera*
Verifique que el framework/componente est siendo utilizado por otros desarrolladores, busque que opinan otros equipos
de desarrollo, que problemas han enfrentado, etctera
Qu otros frameworks/componentes similares existen? Cmo se comparan entre si frameworks/componentes
similares? Qu opciones hay?
*Si el ltimo release fue hace ms de un ao ao y medio probablemente no hay mucha actividad (aplican sus excepciones)
68
Qu es un Patrn de Diseo?
Determine la calidad del soporte, Hay soporte oficial (de los desarrolladores)? De qu tipo? Pago o gratuito? Precios?
Hay una comunidad slida alrededor del framework? Es posible obtener soporte de la comunidad? Hay foros? Wiki? Qu tanta actividad hay en los foros? Cul es el trato y la
calidad de la comunidad y de los desarrolladores del framework? *
*Esto vara de proyecto en proyecto, mientras ms grande sea el framework/componente mayor la comunidad y mayor la frecuencia de los posts. Lo importante es asegurarse de que el proyecto no
esta muerto
69
Qu es un Patrn de Diseo?
Cul es la dificultad de aprendizaje del framework? Cul es la curva de aprendizaje? El costo de aprende a usar el
framework vale los beneficios?
Cunta documentacin existe? Cul es la calidad de la documentacin? Manuales? Ejemplos de uso? Tutoriales?
Cul es la calidad del framework? Cmo est organizado el equipo que lo desarrolla? Cul es el proceso de desarrollo? Los releases se planifican? Los planes se cumplen? Se
desarrollan pruebas? Hay suites de pruebas? Certificaciones? etctera
70
Qu es un Patrn de Diseo?
El framework/componente es open source / free software (son dos cosas diferentes) o es propietario? Cules son las ventajas / desventajas de cualesquiera de las tres opciones
en el contexto de uso del framework? (Esto tambin va asociado al punto de la documentacin)*
Es adecuado el framework/componente para el contexto/aplicacin en el que se necesita utilizar?
(Quiz esto es lo primero que se debera considerar)
*Esto es importante porque puede ser la diferencia entre poder parchar y extender internamente el framework en caso de ser
necesario (o no, si no es al menos cdigo abierto)
Cunto cuesta? Cul es la forma de pago? El cliente puede correr con los costos? El equipo de desarrollo puede correr con los costos (libre para desarrollo / pago para uso)?
71
...y seguramente hay muchas otras variables adicionales a
tomar en cuenta segn el caso, de modo que mantenga
los ojos bien abiertos...
Cmo elegir un framework o un componente?
72
Gracias
Gracias!
Slide 1Slide 2Slide 3Slide 4Slide 5Slide 6Slide 7Slide 8Slide 9Slide 10Slide 11Slide 12Slide 13Slide 14Slide 15Slide 16Slide 17Slide 18Slide 19Slide 20Slide 21Slide 22Slide 23Slide 24Slide 25Slide 26Slide 27Slide 28Slide 29Slide 30Slide 31Slide 32Slide 33Slide 34Slide 35Slide 36Slide 37Slide 38Slide 39Slide 40Slide 41Slide 42Slide 43Slide 44Slide 45Slide 46Slide 47Slide 48Slide 49Slide 50Slide 51Slide 52Slide 53Slide 54Slide 55Slide 56Slide 57Slide 58Slide 59Slide 60Slide 61Slide 62Slide 63Slide 64Slide 65Slide 66Slide 67Slide 68Slide 69Slide 70Slide 71Slide 72