Entradas populares

busqueda

Últimas novedades Desarrolloweb.com

miércoles, 31 de agosto de 2011

TODOS LOS TEMAS

PRINCIPIOS DE DISEÑO


Principios de diseño


Los principios de diseño a estudiar son los siguientes:


-Abstracción y refinamiento.


-Modularidad.


-Variaciones protegidas.


-Acoplamiento.


-Cohesión.


-Refactorización


-Reutilización.


1º) ABSTRACCIÓN Y REFINAMIENTO: se trata de ocultar los detalles, es decir no centrarse en detalles concretos del diseño, sino hacer un esquema visual a alto nivel. De esta manera tenemos una visión general de todo, también se utiliza en los microdiseños. La tactica del refinamiento es justamente lo contrario, es decir, centrarse en los detalles del modelo abstracto dado anteriormente.


La técnica de abstración y refinamiento se complementa con la de refinamiento, es decir, primero se hace una abstracción del problema y una vez que tenemos un esquema abstracto usamos la técnica del refinamiento para centrarnos en detalles concretos.


2º) MODULARIDAD: se basa en el principio de "Divide y Vencerás", que consiste un dividir el problema en varios problemas más pequeños para que el coste de resolverlos sea menor. Consiste en dividir un sistema en varios subsistemas, cada uno de estos resuelve un problema pequeñito y luego se vuelven a unir. Esta técnica se puede aplicar a distintas escalas. Esto nos plantea una pregunta: ¿Cómo lo divido? Pues no hay una forma exacta para hacer la división sino que depende de cada problema en particular.


3º) VARIACIONES PROTEGIDAS: hay que tener claros dos conceptos: punto de variación y punto de evolución.


*Punto de variación: es un requisito del sistema que tiene caracteristicas variables y puede cambiar, por tanto tengo que soportarlo en mi aplicación.


*Punto de evolución: es cuando nosotros preveemos que se puede convertir en un punto de variación.



En el desarrollo del software todo lo que sea cambion es un problema, hay que prestar atención a estos puntos que cambián, la idea es proteger al sistema de los cambios en los puntos de variación y en los puntos de evolución.


Cuando detecte un punto de variación y/o punto de evolución tengo que diseñarlo de forma que los cambios que se produzcan en el sistema afectan a lo minimo posible.


David Parnas (1972) dijo: "...proponemos en lugar de eso (dividir en módulos) que uno comience con una lista de desiciones de diseño difíciles o con altas probabilidades de cambio. Cada módulo se diseña entonces para ocultar dichas desiciones a otros (módulos)..."


Para hacer estos se puede usar alguno de los siguientes métodos:


-Encapsulación: por ejemplo lo que hacen las clases en Java, ocultan los atributos y solo mustran los métodos.


-Interfaces: por ejemplo lo que es una interfaz en Java, una misma interfaz puede tener distintas implementaciones.


-Datos externos: tener datos de configuración fuera del sistema (ficheros de configuración...).


-Ocultación de la estructura: un sistema no tiene necesidad de conocer los otros subsistemas, para ello estan los interfaces internas.


¡CUIDADO! El coste de diseñar la protección de un punto de variación o de evolución es superior que resolver un diseño simple. No hay que usar la sobreingeniería.


4º)ACOPLAMIENTO: medida cualitativa del grado en el que un módulo está conectado a otros y el mundo exterior. El acoplamiento hay que mantenerlos bajo para que cada módulo sea lo más independiente posible. De esta forma si un módulo cambia, su cambio afecta lo menos posible al resto de sistema. Nunca se puede dar el acoplamiento 0.


El acoplamiento es un principio evolutivo, tenemos que ir controlandolo a medida que se diseña hay que estar evaluando el grado de acoplamiento para conseguir que sea lo más bajo posible


Hay que ser cautelar, es decir, no hay que intentar disminuir el acoplamiento a toda costa, sino que hay que evaluar cómo hacerlo.


5º)COHESIÓN: es la medida cualitativa del grado en el que un módulo se enfoca a una sola cosa. Un módulo hace cosas muy parecidas, la cohesión debe ser alta en cada módulo, se trata de conseguir módulos muy cohesivos y que esten poco acoplados. Para mejorar la cohesión lo mejor es dividir en subsistemas. Las clases con muchos métodos son poco cohesivas y habrá que dividir.


La cohesión al igual que el acoplamiento es evolutiva, hay que ir evaluando a la vez que se diseña para aumentar la cohesión.


"Un elemento es altamente cohesivo si todos sus elementos trabajar juntos para proporcionar algún comportamiento bien determinado"


A la cohesión y al acoplamiento se les denomina el Yin y el Yan del diseño software.


6º)REFACTORIZACIÓN: según Martin Fowler (1999) "Es el proceso de cambiar un sistema de software de tal forma que no se altere el comportamiento externo de su código (diseño) y aun así se mejora su estructura interna".


La funcionalidad sigue siendo la misma pero mejora la estructura interna del código, es decir, mejorando la cohesión y disminuyendo el acoplamiento, pero siempre hay que tener en cuenta que la funcionalidad no puede cambiar.


En lugar de aplicar la evalucaión de la cohesión y el acoplamiento al principio, lo hago cuando ya tengo un poco de código hecho. Existen cátalogos de refactorización (http://www.refactoring.com) que nos puede ayudar a llevar a cabo una refactorización.


7º)REUTILIZACIÓN: no hay que reinventar la rueda, consiste en utilizar código que se sabe que funciona bien, en vez de hacerlo nosotros de nuevo. Buscar que hay que resuelva mi problema y adaptarlo a mi caso.


-El diseño no nace, se hace


-¿Qué diferencia hay entre los diseñadores expertos y nosotros? Los diseñadores expertos han hecho las cosas muchas veces y las hacen bien porque tienen experiencia en hacerlas, en cambio nosotros no tenemos esa experiencia.


La reutilización puede ser a dos niveles: por un lado poder reutilizar código en forma de componente (por ejemplo usar una base de datos, servicios, bibliotecas, frameworks); por otro lado está la reutilización de conocimiento que me da ideas de cómo hacer las cosas como Idioms.


*Componentes, Servicion y Bibliotecas: tienen una funcionalidad empaquetada y diseñada para ser reutilizada. TAWs, manejo de periféricos, gráficos, gestión de documentos XML tienen funcionalidad lista para ser utilizada a través de una interfaz bien definida. Tienes una interfaz bajo/local en el diseño de la aplicación cliente. Una cuestión clave en el diseño de estos elementos reside en conseguir facilidad de uso para el máximo número de escenas sin complicar la interfaz ni reducir el rendimiento.


*Frameworks: conjunto de clases parcialmente funcional (no es una aplicación) para un dominio de aplicación, es algo cuya funcionalidad no está definida, un frameworks no tiene un ejecutable, le falta algo de la aplicación, por ejemplo. Junit es un frameworks. Los frameworks tienen una gran influencia en el diseño de la aplicación del cliente.


Está basado en el principio de Hollywood "Don't call us, we'll call you!" que significa "No nos llames, nosotros te llamaremos".


-Ventajas del framework: reutilización de diseño y código,hay que tener en cuenta la experiencia del diseñador del framework, se reducen los costes de producción porque ya está hecho.


-Inconvenientes: encontrar el frameworks apropiada para nuesto caso, usar más de un frameworks al mismo tiempo (temas de incompatibilidad entre los frameworks usados), son dificiles de construir y de aprender a usar.


*Idioms: una forma de utilizar un Lenguaje de Programación, patrón de bajo nivel, es especifico de un Lenguaje de Programación. Describen soluciones a problemas de implementación de un determinado Lenguaje de Programación por ejemplo la gestión de memorias en C++.


*Antipatrones: se aprede de los errores más que de los aciertos, nos dan recetas de cosas que no hay que hacer.


*Patrones de diseño: "Cada patrón describe un problema que ocurre una y otra vez en nuestro entorno. También describe el núcleo de la solución al problema, de forma que puede utilizar un millón de veces sin hacer dos veces lo mismo".


*Patrones arquitectónicos: definen la estructura general del software, indican las relaciones entre los subsistemas y los componentes del software y definen las reglas para especificar las relaciones entre los elementos de la arquitectura.




LAS CARACTERISTICAS DE LO LENGUAJES


Las caracteristicas de los lenguajes de programacion parabase de datos Usa GNU Automake, Autoconf, y Libtool para portabilidad
Uso de multihilos mediante hilos del kernel.
Usa tablas en disco b-tree para búsquedas rápidas con compresión de índice
Tablas hash en memoria temporales
El código
MySQL se prueba con Purify (un detector de memoria perdida comercial) así como con Valgrind, una herramienta GPL
Completo soporte para operadores y funciones en cláusulas select y where.
Completo soporte para cláusulas group by y order by, soporte de funciones de agrupación
Seguridad: ofrece un sistema de contraseñas y privilegios seguro mediante verificación basada en el host y el tráfico de contraseñas está cifrado al conectarse a un servidor.
Soporta gran cantidad de datos. MySQL Server tiene bases de datos de hasta 50 millones de registros.
Se permiten hasta 64 índices por tabla (32 antes de MySQL 4.1.2). Cada índice puede consistir desde 1 hasta 16 columnas o partes de columnas. El máximo ancho de límite son 1000 bytes (500 antes de MySQL 4.1.2).
Los
clientes se conectan al servidor MySQL usando sockets TCP/IP en cualquier plataforma. En sistemas Windows se pueden conectar usando named pipes y en sistemas Unix usando ficheros socket Unix.
En MySQL 5.0, los clientes y servidores Windows se pueden conectar usando memoria compartida.
MySQL contiene su propio paquete de pruebas de rendimiento proporcionado con el código fuente de la distribución de MySQL



Máquinas abstractas



En un primer sentido, no existe la máquina abstracta, ni máquinas abstractas que serían como Ideas platónicas, transcendentes y universales, eternas. Las máquinas abstractas actúan en los agenciamientos concretos: se definen por el cuarto aspecto de los agenciamientos, es decir, por los máximos de descodificación y de desterritorialización. Trazan esos máximos; también abren el agenciamiento territorial a otra cosa, a agenciamientos de otro tipo, a lo molecular, a lo cósmico, y constituyen devenires. Así pues, siempre son singulares e inmanentes. Contrariamente a lo que sucede en los estratos, y también en los agenciamientos considerados bajo los demás aspectos, las máquinas abstractas ignoran las formas y las sustancias. En ese sentido son abstractas, pero es también el sentido riguroso del concepto de máquina. Las máquinas abstractas exceden toda mecánica. Se oponen a lo abstracto en su sentido ordinario. Las máquinas abstractas se componen de materias no formadas y de funciones no formales. Cada máquina abstracta es un conjunto consolidado de materias-funciones (filum y diagrama). Esto se ve con toda claridad en un “plan” tecnológico: ese tipo de plan no está compuesto simplemente de sustancias formadas, aluminio, plástico, hilo eléctrico, etc., ni de formas organizadoras, programa, prototipos, etc., sino de un conjunto de materias no formadas que ya sólo presentan grados de intensidad (resistencia, conductibilidad, calentamiento, estiramiento, velocidad o retraso, inducción, transducción...), y de funciones diagramáticas que sólo presentan ecuaciones diferenciales o más generalmente “tensores”. Por supuesto, en el seno de las diemnsiones del agenciamiento, la máquina abstracta, o máquinas abstractas se efectúan en formas y sustancias, con estados de libertad variables.




Pero ha sido necesario simultáneamente que la máquina abstracta se componga y componga un plan de consistencia. Abstractas, singulares y creativas, aquí y ahora, reales aunque no concretas, actuales aunque no efectuadas, por eso las máquinas abstractas están fechadas y tienen nombre (máquina abstracta-Einstein, máquina abstracta-Webern, pero también Galileo, Bach o Beethoven, etc). No es que remitan a personas o a momentos efectuantes, al contrario, son los nombres y las fechas los que remiten a las singularidades de las máquinas, y a su efectuado.



considerado sobre todo dos grandes agenciamientos antropomorfos y aloplásticos, la máquina de guerra y el aparato de Estado. Se trata de dos agenciamientos que no sólo difieren en naturaleza, sino que son diferentemente cuantificables con relación a "la" máquina abstracta. Con el filum, con el diagrama, la relación no es la misma; no son las mismas líneas ni las mismas componentes. Este análisis de los dos agencciamientos, y de sus coeficientes, muestra que la máquina de guerra no tiene de por sí la guerra por objeto, pero lo adquiere necesariamente cuando se deja apropiar por el aparato del Estado. En ese punto preciso, la línea de fuga, y la línea vital abstracta que efectúa, se transforman en línea de muerte y de destrucción. La "máquina" de guerra (de ahí su nombre) está, pues, mucho más próxima de la máquina abstracta que de aparato del Estado, que le hace perder su potencia de metamorfosis. La escritura, la música, pueden ser máquinas de guerra. Un agenciamiento está tanto más próximo de la máquina abstracta viviente cuanto que abre y multiplica las conexiones, traza un plan de consistencia con sus cuantificadores de intensidades y de consolidación. Pero se aleja de ella a medida que sustituye las conexiones creadoras por conjunciones que crean bloqueo (axiomática), organizaciones que crean estrato (estratómetros), reterritorializaciones que crean agujero negro (segmentómetros), conversaciones en líneas de muerte (deleómetros). Se ejerce así toda una selección sobre los agenciamientos, según su capacidad para trazar un plan de consistencia de conexiones crecientes. El esquizoanálisis no sólo es un análisis cualitativo de las máquinas abstractas con relación a los agenciamientos, también es un análisis cuantitativo de los agenciamientos con relación a una máquina abstracta supuestamente pura.


LENGUAJE DE PROGRAMACIÓN DE PROPÓSITO GENERAL


Los lenguajes de propósito general, son lenguajes que pueden ser usados para varios propósitos, acceso a bases de datos, comunicación entre computadoras, comunicación entre dispositivos, captura de datos, cálculos matemáticos, diseño de imágenes o páginas, crear sistemas operativos, manejadores de bases de datos, compiladores, entre muchas otras cosas.


En general, puede ser usado para cualquier desarrollo. Para ciertas tareas más comunes, existen librerías para facilitar la programación que permiten la reutilización de código.


Se puede aplicar en la mayoría de las actividades que desarrolla el hombre.
















LENGUAJE SCRIPTING


(Scripting language, lenguaje de guión). Un lenguaje scripting es un tipo de lenguaje de programación que es generalmente interpretado.

Se los programas compilados, porque los programas son convertidos de forma permanente a un código especial antes de que puedan ejecutarse (proceso de
compilación). En cambio los scripts permanecen en su forma original (su código fuente en forma de texto) y son interpretados comando por comando cada vez que se ejecutan. De todas maneras, los scripts pueden ser compilados también, aunque no es usual.

Características de los lenguajes scripting

* Los scripts suelen escribirse más fácilmente, pero con un costo sobre su ejecución.
* Suelen implementarse con
intérpretes en lugar de compiladores.
* Tienen fuerte comunicación con componentes escritos en otros lenguajes.
* Los scripts suelen ser almacenados como texto sin formato.
* Los códigos suelen ser más pequeños que el equivalente en un lenguaje de programación compilado.

Tipos de lenguajes de scripting

* Lenguaje de control de tareas y
shells: cmd.exe (Windows NT, Windows CE, OS/2), COMMAND.COM (DOS, Windows 9x), csh, AppleScript, sh, JScript vía Windows Script Host, VBScript vía Windows Script Host, REXX, etc.

* GUI Scripting: son lenguajes de scripting diseñados para interactuar con los
elementos de las interfaces gráficas como botones, ventanas, menús, etc. Se utilizan para automatizar acciones repetitivas. También son llamados "lenguajes macro".

Ejemplos: AutoHotkey, AutoIt, Expect, Automator, etc.

* Lenguaje scripting de aplicaciones específicas: en grandes
aplicaciones a veces es necesario incluir un lenguaje de scripting que se adapte a ésta y dé más posibilidades a sus usuarios.

Ejemplos:
ActionScript en Flash, MATLAB, mIRC script, QuakeC, etc.

* De programación web: los lenguajes scripting para
webs suelen servir para crear páginas dinámicas. De todas maneras, muchos de ellos son tan potentes como para poder crear programas de propósito general. Pueden diferenciarse en dos categorías:

-
Del lado del servidor: PHP, ASP (Active Server Pages), JavaServer Pages, ColdFusion, IPTSCRAE, Lasso, MIVA Script, SMX, XSLT.

- Del lado del cliente:
JavaScript, JScript, VBScript, Tcl.

* Lenguajes de procesamiento de textos: muchos lenguajes de scripting comenzaron de esta manera. Permitían automatizar tareas al administrador cuando se trataba de configuraciones basadas en textos (usual en
Unix por ejemplo). En el caso de Perl, comenzó como un lenguaje de generación de reportes, pero terminó siendo un completo lenguaje para desarrollar aplicaciones.

Ejemplos:
AWK, Perl, sed, XSLT.

* Lenguajes dinámicos de propósito general: Algunos lenguajes, como Perl, comenzaron como lenguajes de scripting para se desarrollaron como completos lenguajes de programación de propósito general. Otros lenguajes similares han sido descritos como "lenguajes scripting" por situaciones similares, aunque luego se hayan usado más para programar aplicaciones.

Ejemplos: APL, Boo, Dylan, Ferite, Groovy, Io, Lisp, Lua, MUMPS (M), newLISP, Nuva, Perl, PHP, Python, Ruby, Scheme, Smalltalk, SuperCard, Tcl, Revolution.




TECNOLOGÍAS WEB


Las tecnologías web implican un conjunto de herramientas que nos facilitarán lograr mejores resultados a la hora del desarrollo de un sitio web.


Navegadores web



Servidores web



Otras tecnologías



Tipología web






NAVEGADOR WEB


Un navegador o navegador web (del inglés, web browser) es una aplicación que opera a través de Internet, interpretando la información de archivos y sitios web para que podamos leerla, (ya se encuentre ésta alojada en un servidor dentro de la World Wide Web o en un servidor local).


El navegador interpreta el código, HTML generalmente, en el que está escrita la página web y lo presenta en pantalla permitiendo al usuario interactuar con su contenido y navegar hacia otros lugares de la red mediante enlaces o hipervínculos.


La funcionalidad básica de un navegador web es permitir la visualización de documentos de texto, posiblemente con recursos multimedia incrustados. Los documentos pueden estar ubicados en la computadora en donde está el usuario, pero también pueden estar en cualquier otro dispositivo que esté conectado a la computadora del usuario o a través de Internet, y que tenga los recursos necesarios para la transmisión de los documentos (un software servidor web).


Tales documentos, comúnmente denominados páginas web, poseen hipervínculos que enlazan una porción de texto o una imagen a otro documento, normalmente relacionado con el texto o la imagen.


El seguimiento de enlaces de una página a otra, ubicada en cualquier computadora conectada a la Internet, se llama navegación, de donde se origina el nombre navegador (aplicado tanto para el programa como para la persona que lo utiliza, a la cual también se le llama cibernauta). Por otro lado, hojeador es una traducción literal del original en inglés, browser, aunque su uso es minoritario.


Funcionamiento de los navegadores:


La comunicación entre el servidor web y el navegador se realiza mediante el protocolo HTTP, aunque la mayoría de los hojeadores soportan otros protocolos como FTP, Gopher, y HTTPS (una versión cifrada de HTTP basada en Secure Socket Layer o Capa de Conexión Segura (SSL)).


La función principal del navegador es descargar documentos HTML y mostrarlos en pantalla. En la actualidad, no solamente descargan este tipo de documentos sino que muestran con el documento sus imágenes, sonidos e incluso vídeos streaming en diferentes formatos y protocolos. Además, permiten almacenar la información en el disco o crear marcadores (bookmarks) de las páginas más visitadas.


Algunos de los navegadores web más populares se incluyen en lo que se denomina una Suite. Estas Suite disponen de varios programas integrados para leer noticias de Usenet y correo electrónico mediante los protocolos NNTP, IMAP y POP.


Los primeros navegadores web sólo soportaban una versión muy simple de HTML. El rápido desarrollo de los navegadores web propietarios condujo al desarrollo de dialectos no estándares de HTML y a problemas de interoperabilidad en la web. Los más modernos (como Google Chrome, Amaya, Mozilla, Netscape, Opera e Internet Explorer 9.0) soportan los estándares HTML y XHTML (comenzando con HTML 4.01, los cuales deberían visualizarse de la misma manera en todos ellos).


Los estándares web son publicados por el World Wide Web Consortium.



OPEN SOURCE (Código abierto)


Código abierto es el término con el que se conoce al software distribuido y desarrollado libremente. El código abierto tiene un punto de vista más orientado a los beneficios prácticos de compartir el código que a las cuestiones morales y/o filosóficas las cuales destacan en el llamado software libre.


MOVIMIENTO DEL "CÓDIGO ABIERTO"


La idea del código abierto se centra en la premisa de que al compartir el código, el programa resultante tiende a ser de calidad superior al software propietario, es una visión técnica. Por otro lado, el software libre tiene tendencias filosóficas e incluso morales: el software propietario, al no poder compartirse, es "antiético" dado que prohibir compartir entre seres humanos va en contra del sentido común.


Al igual que el software libre, el código abierto u open source tiene una serie de requisitos[2] necesarios para que un programa pueda considerarse dentro de este movimiento, éstos son:



  • Libre redistribución: el software debe poder ser regalado o vendido libremente.

  • Código fuente: el código fuente debe estar incluido u obtenerse libremente.

  • Trabajos derivados: la redistribución de modificaciones debe estar permitida.

  • Integridad del código fuente del autor: las licencias pueden requerir que las modificaciones sean redistribuidas sólo como parches.

  • Sin discriminación de personas o grupos: nadie puede dejarse fuera.

  • Sin discriminación de áreas de iniciativa: los usuarios comerciales no pueden ser excluidos.

  • Distribución de la licencia: deben aplicarse los mismos derechos a todo el que reciba el programa

  • La licencia no debe ser específica de un producto: el programa no puede licenciarse solo como parte de una distribución mayor.

  • La licencia no debe restringir otro software: la licencia no puede obligar a que algún otro software que sea distribuido con el software abierto deba también ser de código abierto.

  • La licencia debe ser tecnológicamente neutral: no debe requerirse la aceptación de la licencia por medio de un acceso por clic de ratón o de otra forma específica del medio de soporte del software.

 
http://caresblogspotcom.blogspot.com/