Profesor: Andrs Guzmn F. Nuestros Principios como Desarrolladores Peor que usar un mal estndar o un estndar incorrecto es no seguir ninguno, de la misma forma, no tener ningn criterio para enfrentar los desarrollos. Para aumentar la productividad, tanto individualmente como en equipo, debemos siempre seguir estndares y fijar criterios. La sencillez es la mejor arquitectura Los objetos como concepto -fuera de la informtica- existen desde antes de la programacin (obviamente). Qu es lo que intenta hacer entonces la Programacin Orientada a los Objetos (POO)? Lisa y llanamente intentar simplificar la complejidad (simplificar las abstracciones) y tratar de representar de forma simple lo que vemos y manejamos todos los das los objetos que nos rodean. Entonces, la Programacin Orientada a Objetos no es ms que eso, detectar los objetos existentes en nuestro contexto y construirlos, dndoles un comportamiento y que estos sepan solos cmo reaccionar ante la interaccin con otros objetos (ms adelante a esa actividad le llamaremos diseo). Nada ms y nada menos... y hemos logrado empezar a hablar del tema sin mostrar -hasta el momento - una sola lnea de cdigo Nuestros Principios RTFM: Lee el Maldito Manual RTFM es una sigla que significa lee el maldito manual, algo muy usado en los foros como respuesta hacia los novatos que lo ltimo que hacen es leerlos (lamentablemente *todo* se encuentra ah) http://es.wikipedia.org/wiki/RTFM Nuestros Principios DRY: No Te Repitas No te repitas significa algo muy simple: si cuando desarrollas ves que al programar copias un cdigo para pegarlo en otro lado, es muy probable que ests haciendo algo mal, ya que ese cdigo debera estar aislado y ser usado de a travs de parmetros. Generalmente no existe razn para tener que duplicar el cdigo, si estamos muy apurados, seguro, lo pagaremos muy caro dentro de poco http://es.wikipedia.org/wiki/DRY Nuestros Principios KISS: Mantenlo Simple Hay una frase que dice la mejor arquitectura es la sencillez. La sencillez es escalable, si resolvemos pequeos problemas y luego los unimos, ser ms fcil que hacer un sistema complejo de entrada. http://es.wikipedia.org/wiki/Principio_KISS Nuestros Principios ZEND: Estndar de Codificacin PHP El lenguaje PHP y su comunidad, por aos, no ha tenido ningn referente nico para seguir un estndar, por consiguiente los desarrolladores usan o inventan el que ms le quede cmodo. En la actualizada la empresa Zend Technologies, creadora de PHP y Zend Framework, ha tomado cada vez ms protagonismo (principalmente por su framework), por lo que debera ser de ahora en ms nuestra referencia a seguir. Evita crear un estndar propio, usa el definido por Zend. http://framework.zend.com/manual/en/coding-standard.html Simplicidad "Un sistema complejo que funciona resulta invariablemente de la evolucin de un sistema simple que funcionaba. Un sistema complejo diseado desde cero nunca funciona y no puede ser arreglado para que funcione. Tienes que comenzar de nuevo con un sistema simple que funcione." John Gall Caractersticas de la POO Abstraccin Encapsulamiento Principio de ocultacin Polimorfismo Herencia
Caractersticas de la POO Abstraccin Denota las caractersticas esenciales de un objeto, donde se capturan sus comportamientos. Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas. Se refiere al nfasis en el "qu hace?" ms que en el "cmo lo hace?"
Caractersticas de la POO Encapsulamiento Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Cada objeto es nico y diferenciable de los dems. Esto permite aumentar la cohesin de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultacin, principalmente porque se suelen emplear conjuntamente.
Caractersticas de la POO Principio de ocultacin Cada objeto est aislado del exterior. Cada tipo de objeto expone una interfaz a otros objetos que especifica cmo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas.
Caractersticas de la POO Polimorfismo Comportamientos diferentes, asociados a objetos distintos Muchas formas posibles en la jerarqua de objetos Lo vemos en la herencia e interfaces Sobre escritura de mtodos.
Caractersticas de la POO Herencia Las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de otros objetos. Estos pueden compartir (y extender) su comportamiento sin tener que volver a implementarlo.. Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple Tipos de entidades OO Clases y Objetos Interfaces Tipos de entidades Clases y Objetos
La POO es un paradigma que tiene sus orgenes desde antes de 1990 (a partir de este ao se empieza a popularizar). Por lo tanto no es ninguna excusa (menos como Desarrollador PHP) seguir a la fecha desconociendo cmo trabajar con POO. La programacin orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y mdulos ms fciles de escribir, mantener y reutilizar.
Tipos de entidades Clases y Objetos
Una CLASE es un proyecto, o prototipo, que define las variables y los mtodos comunes a un cierto tipo de objetos. Son las plantillas de las que luego se pueden crear mltiples objetos del mismo tipo Cada objeto tendr sus propios valores y compartirn las mismas funciones. Los objetos son entidades que combinan estado (los datos), comportamiento e identidad nica que lo diferencia del resto. De esta forma, un objeto contiene toda la informacin que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase Primero deberemos crear una clase antes de poder crear objetos o ejemplares de esa clase. Tipos de entidades Declarar una Clase Como mnimo, la declaracin de una clase debe contener la palabra clave class y el nombre de la clase que est definiendo. El nombre de la clase no puede llamarse igual que una palabra reservada del lenguaje. La implementacin de una clase comprende dos componentes: la declaracin y el cuerpo de la clase. Por convencin, deben empezar por una letra mayscula y debe ser llamada igual que el nombre de su archivo.
Complejidad "La complejidad es destructiva. Absorbe la sangre de los desarrolladores, hace que los productos sean difciles de planificar, construir y probar, introduce problemas de seguridad y provoca la frustracin de usuarios finales y administradores" -- Ray Ozzie Tipos de entidades Declarar una Clase Muchas veces, todo lo que se necesitar ser una declaracin mnima. Sin embargo, la declaracin de una clase puede decir ms cosas sobre la clase. En PHP, todas las clases pueden tener una superclase. Una clase puede heredar mtodos y miembros de otra clase utilizando la palabra reservada extends en su declaracin Ms especficamente, dentro de la declaracin de la clase se puede. declarar cual es la superclase de la clase. listar los interfaces implementados por la clase declarar si la clase es abstracta o final Tipos de entidades Modificadores de las Clase Se puede utilizar uno de estos dos modificadores en una declaracin de clase para declarar que esa clase es abstracta o final. Los modificadores van delante de la palabra clave class y son opcionales. El modificador abstract declara que la clase es una clase abstracta. Una clase abstracta podra contener mtodos abstractos (mtodos sin implementacin). Una clase abstracta est diseada para ser una superclase y no puede ejemplarizarse. Utilizando el modificador final se puede declarar que una clase es final, que no puede tener subclases. Existen (al menos) dos razones por las que se podra querer hacer esto: razones de seguridad y razones de diseo.
Tipos de entidades Sumario de la Declaracin de una Clase En suma, una declaracin de clase se parecera a esto:
Modificadores declaran si la clase es abstracta o final. NombredeClase selecciona el nombre de la clase que est declarando comenzando con mayscula NombredeSuperClase es el nombre de la superclase de NombredeClase NombredeInterface es una lista delimitada por comas de los interfaces implementados por NombredeClase De todos estos tems, slo la palabra clave class y el nombre de la clase son necesarios. Los otros son opcionales Tipos de entidades Cuerpo de una Clase La pgina anterior describe todos los componentes de la declaracin de una clase. Esta pgina describe la estructura general y la organizacin del cuerpo de la clase. El cuerpo de la clase compone la implementacin de la propia clase y contiene dos secciones diferentes: la declaracin de variables y la de mtodos Una variable miembro de la clase representa un estado de la clase Sus mtodos implementa el comportamiento de la clase. Deficiencias "Hay dos maneras de disear software: una es hacerlo tan simple que sea obvia su falta de deficiencias, y la otra es hacerlo tan complejo que no haya deficiencias obvias" -- C.A.R. Hoare Tipos de entidades Cuerpo de una Clase Dentro del cuerpo de la clase se definen todas las variables miembro y los mtodos soportados por la clase. Tpicamente, primero se declaran las variables miembro de la clase y luego se proporcionan las declaraciones e implementaciones de los mtodos, aunque este orden no es necesario. Tpicamente, y como un estndar en Zend los nombres de los mtodos y miembros/variables comienzan con minscula. En las Clases el tag ?>de cierre no va (Estndar Zend) Tipos de entidades Cuerpo de una Clase Como estndar en PHP5 y Zend los nombres de clase siempre comienzan con mayscula, mientras que los nombre de variables y mtodos comienzan en minscula. Cuando son nombres compuesto se debe separar con una letra Mayscula en la primera letra de la palabra compuesta El estilo de escritura de palabra compuesta se le conoce con el nombre CamelCase De esta forma el nombre de una clase podra ser MiClaseDeUpperCamelCase y de un mtodo o variable miMetodoDeLowerCamelCase() El nombre del archivo php de la clase se tiene que llamar de la misma manera que el nombre de la misma clase que la contiene. Siempre debe haber una clase por archivo. Tipos de entidades Cuerpo de una Clase Los atributos son siempre protegidos o privados y se acceden/modifican mediante los mtodos getter/setter. Ej getNombre(). Uno de los principios bsico de Programacin orientada a objetos "Principio de ocultacin Adems de las variables miembro y los mtodos que se declaran explcitamente dentro del cuerpo de la clase, una clase puede heredar algo de su superclase. Tipos de entidades Declarar Variables de una Clase Como mnimo, una declaracin de variable miembro tiene dos componentes: el modificador de acceso y el nombre de la variable Por convencin empieza con una letra minscula J unto con el nombre, se pueden especificar la visibilidad de la variable, tipos de acceso son public, private o protected En general los atributos private y protected siempre inician con "_" (underscore) Adems especificar si la variable es una variable de clase o una variable de ejemplar, y si la variable es una constante. Una declaracin de variable miembro define los siguientes aspectos de la variable especificadordeAcceso define si otras clases tienen acceso a la variable static indica que la variable es una variable miembro de la clase en oposicin a una variable miembro del ejemplar const indica que la variable es una constante Tipos de entidades Declarar Variables de una Clase Piramide "Mucho software hoy da es en cierta medida como una pirmide egipcia con millones de piedras apiladas una encima de otra, sin integridad estructural, construido por fuerza bruta y miles de esclavos." Por Alan Kay (cientfico de la computacin) Tipos de entidades Implementar Mtodos La implementacin de un mtodo consiste en dos partes, la declaracin y el cuerpo del mtodo. Los nicos elementos necesarios para una declaracin de mtodo son el nombre y el tipo de modificador de acceso o visibilidad Respecto a la visibilidad del mtodo, los tipos de acceso son public, private o protected J unto con el nombre del mtodo y el modificador, la declaracin lleva informacin como el nmero y el tipo de los argumentos Los mtodos utilizan el operador return para devolver un valor. Todo mtodo que no sea declarado como void debe contener una sentencia return Por convencin empieza con una letra minscula En general los mtodos private y protected siempre inician con "_" (underscore)
Tipos de entidades Mtodos Abstractos y Finales Una clase abstracta puede contener mtodos abstractos, esto es, mtodos que no tienen implementacin De esta forma, una clase abstracta puede definir un interface de programacin completo, incluso porporciona a sus subclases la declaracin de todos los mtodos necesarios para implementar el interface de programacin Tipos de entidades El Cuerpo de un Mtodo J unto a los elementos normales del lenguaje, se puede utilizar this en el cuerpo del mtodo para referirse a los miembros del objeto actual. Tambin se puede utilizar parent para referirse a los miembros y mtodos de la superclase que el objeto actual haya ocultado mediante la sobre escritura. Un cuerpo de mtodo tambin puede contener declaraciones de variables que son locales de ese mtodo Tambin se puede utilizar this para llamar a uno de los mtodos del objeto actual. Tipos de entidades Constructor Los constructores se utilizan para inicializar el objeto. Cuando se crea un objeto (se instancia una clase) es posible definir un proceso de inicializacin que prepare el objeto para ser usado. Esta inicializacin se lleva a cabo invocando un mtodo especial denominado constructor. El constructor en PHP5 se escribe como : __construct Esta invocacin es implcita y se realiza automticamente cuando se utiliza el operador new. Los constructores slo pueden ser llamados con el operador new Puede recibir cualquier nmero de argumentos de cualquier tipo, como cualquier otro mtodo. No devuelve ningn valor (void). El constructor no es un miembro ms de una clase. Slo es invocado cuando se crea el objeto (con el operador new). No puede invocarse explicitamente en ningn otro momento. Si no se define explcitamente uno, PHP5 crea uno por defecto, sin argumentos. Tipos de entidades Constructor Cuando se instancia un objeto, se tienen que realizar varios pasos en su inicializacin, por ejemplo dar valores a sus atributos, abrir una conexin a la base de datos etc. Tipos de entidades Destructor Tambin tenemos a los destructores: __destruct Los destructores son funciones que se encargan de realizar las tareas que se necesita ejecutar cuando un objeto deja de existir. Cuando un objeto ya no est referenciado por ninguna variable, deja de tener sentido que est almacenado en la memoria, por tanto, el objeto se debe destruir para liberar su espacio. En el momento de su destruccin se llama a la funcin destructor, que puede realizar las tareas que el programador estime oportuno realizar. La creacin del destructor es opcional. Slo debemos crearlo si deseamos hacer alguna cosa cuando un objeto se elimine de la memoria. Depurar Cdigo "Depurar cdigo es dos veces ms difcil que escribir cdigo, por lo tanto si escribes el cdigo tan inteligentemente como te sea posible, por definicin no sers lo suficientemente inteligente como para depurarlo" Tipos de entidades Sobrescritura Una clase puede sobrescribir un mtodo de sus superclases. El mtodo que sobrescribe debe tener el mismo, nombre, tipo de retorno y lista de parmetros que el mtodo al que ha sobrescrito La sobrescritura de mtodos es algo bastante comn en mecanismos de herencia, puesto que los mtodos que fueron creados para una clase "padre" no tienen por qu ser los mismos que los definidos en las clases que heredan. Polimorfismo puro, comportamientos diferentes, asociados a objetos distintos. Regla "Medir el progreso de programacin en lneas de cdigo es como medir el progreso de construccin de un avin en peso" Bill Gates Modificadores De acceso Uno de los benficos de las clases es que pueden proteger sus variables y mtodos miembros frente al acceso de otros objetos. En PHP5 se pueden utilizar los especificadores de acceso para proteger tanto las variables como los mtodos de la clase cuando se declaran. Soporta tres niveles de acceso para las variables y mtodos miembros: private, protected y public. Public: Todo el mundo puede acceder al elemento. Si es un un dato miembro todos pueden ver el elemento, usarlo y modificarlo. Private: Solo se puede acceder desde los mtodos de la clase, es decir, solo puede invocarse el mtodo desde otro mtodo de la clase. Protected: Slo se puede acceder la misma clase y sus hijas, las que la heredan. Modificadores De acceso La primera columna indica si la propia clase tiene acceso al miembro definido por el especificador de acceso. La segunda columna indica si las subclases de la clase tienen acceso a los miembros. La cuarta columna indica si todas las clases tienen acceso a los miembros. Modificadores Los mtodos "getter / setter" o "accesores" Ahora bien, si queremos que el "estudiante" no pueda modificar nuestros datos, podemos pasar a colocar todos los atributos como "private":
Listo, ahora cuando el "estudiante" quiera ver o modificar un atributo, el sistema le enviar un error. El problema ahora es que nosotros queremos que: 1. La edad se pueda saber y cambiar en todo momento. 2. Se pueda saber el nombre del usuario, pero no modificarlo 3. No nos interesa que se sepa el nombre real del mismo 4. Pero queremos que pueda colocar una nueva clave si el usuario se la olvida, pero no saber la que existe actualmente Cmo se hace entonces?
VEAMOS UN EJ EMPLO Modificadores Los mtodos "getter / setter" o "accesores" Por un tema de principios de la POO los atributos de los objetos deben ser siempre "privados" (concepto "encapsulacin": no son accesibles desde fuera del objeto, solo el objeto tiene la potestad de usarlos directamente) y se debern crear mtodos pblicos que sustituya una u otra operacin, o ambas, cada vez que la situacin lo amerite: un mtodo " setter" para " cargar un valor" (asignar un valor a una variable) un mtodo " getter" para " retornar el valor" (solo devolver la informacin del atributo para quin la solicite). Veamos cmo se resuelve, paso a paso.
Modificadores Los mtodos "getter / setter" o "accesores" La edad se puede acceder y modificar en todo momento, por consiguiente se deben agregar los dos mtodos, un "get" y un "set" para ese atributo Poder saber el nombre del usuario pero no modificarlo, para eso hay que agregar solo un mtodo get para ese atributo No nos interesa que se sepa el nombre real del usuario. Lo dejamos como est y queda inaccesible desde fuera del objeto. Queremos que pueda colocar una nueva clave si el usuario se la olvida, pero no saber la que existe actualmente. Para eso, hacemos lo contrario que con el atributo nombre, agregamos un mtodo "set" pero no el "get"
Modificadores Los mtodos "getter / setter" o "accesores" Pronto, usando simples mtodos podemos reforzar el diseo de nuestro objeto, restringiendo segn nuestra necesidad el acceso a sus atributos.
Modificadores Final, Static, Abstract Final: En un atributo: no modificable->Contante. En un mtodo no se puede sobrescribir en un heredero. En una clase no se puede heredar Static: Pertenece a la clase no a la instancia. Se puede acceder a el sin necesidad de crear un objeto concreto Abstract: Permite declarar una clase abstracta. Si la clase contiene al menos un metodo abstracto, ella se debe declarar como abstracta
VEAMOS UN EJ EMPLO DE MIEMBRO ESTATICO Modificadores Final, Static, Abstract CLASE USUARIO Deficiencias II "Hay dos formas de disear software: la primera es hacerlo tan simple que obviamente no hay deficiencias y la segunda es hacerlo tan complicado que no hay deficiencias obvias. La primera forma es mucho ms difcil.". C.A.R. Hoare Estndar PHP Class stdClass stdClass es una clase que como su propio significado dice, nos permite crear objetos estndar De tal modo que podamos tratar una variable como un objeto y asignarle valores, borrarlos (unset). No tiene atributos ni mtodos propios, tampoco hereda alguna clase ni implementa interfaces. Se puede definir una clase que extiende stdClass, pero no tiene ningn beneficio, ya que stdClass no hace nada. VEAMOS UN EJ EMPLO Estndar PHP Class Ejemplo