SlideShare una empresa de Scribd logo
Principios Programación
Orientada a Objetos
Jose Emilio Labra Gayo
Dept. Informática
Universidad de Oviedo
DRY
Don't Repeat Yourself
Cada intención debe declararse en un único sitio
Evitar repetir algo más de una vez
Evitar código copiar/pegar
Cada vez que se copia/pega se duplican las posibilidades
de error
Utilizar mecanismos de abstracción para capturer
elementos similares
KISS
Keep It Simple Stupid
Menos es más
Afrontar el cambio
El código debe prepararse para afrontar cambios
en los requisitos
Existen multiples motivos para cambiar
Es imposible prever los cambios futuros
...pero sí pueden valorarse los cambios más probable
Análisis de riesgos
Wabi-Sabi
Aceptar la imperfección
Software no finalizado
Suficientemente Bueno (good enough)
Alta cohesividad
Cohesividad = Coherencia de un módulo
Cada modulo debe resolver una funcionalidad
Debe ser posible probar cada modulo por separado
Acoplamiento bajo
Acoplamiento = grado de interacción entre módulos
Acoplamiento bajo  Mejora la modificabilidad
Despliegue independiente de cada módulo
Estabilidad frente a cambios de otros módulos
STUPID
(S)ingleton
(T)ight coupling
(U)ntestability
(P)remature Optimization
(I)ndescriptive Naming
(D)uplication
From STUPID to SOLID: http://williamdurand.fr/2013/07/30/from-stupid-to-solid-code/
Principios SOLID
SRP (Single Responsability Principle)
OCP (Open-Closed Principle)
LSP (Liskov Substitution Principle)
ISP (Interface Seggregation Principle)
DIP (Dependency Injection Principle)
(S)ingle Responsability
Un módulo debe tener una única responsabilidad
Responsabilidad = Motivo para cambiar
No debe haber más de un motivo para cambiar un
módulo
En caso contrario, las responsabilidades se mezclan
Aumenta el acoplamiento
vs
(S)ingle responsability
Ejemplo Sistema gestión de informes
class GestorInformes {
def descargarDatos(uri: URI)
???
def prepararInforme(fichero: String): Informe =
???
def guardarInforme(db: DataBase): Unit =
???
// ...
}
Posibles cambios: forma de preparar el informe, formato de almacenamiento,...
Algunos clientes utilizan los métodos de preparación de informes
Otros clientes utilizan los métodos de almacenamiento de informes
Si se realizan cambios en la forma de almacenar los informes, los clientes
interesados solamente en preparar los informes se verían afectados
(S)ingle responsability
Solución:
Separar en clases con una única responsabilidad
NOTA
No siempre está claro cómo separar responsabilidades
(O)pen/Closed
Abierto para extensión
El modulo debe adaptarse a nuevos cambios de comportamiento
Cerrado para modificar
Los cambios de comportamiento pueden realizarse sin cambiar el
código
Cambios sin recompilar, modificar código fuente original, binarios, etc.
"Open chest surgery is not needed
when putting on a coat."
(O)pen/Closed
Ejemplo: Filtrar productor por color
def filtraPorColor(
productos: List[Producto],
color: Color): List[Producto] = {
for ( p <- productos
; if p.color == color
) yield p
}
Problema, si hay que filtrar por altura, por anchura, etc.
¿Abierto para extension? NO, no es posible filtrar por altura
¿Cerrado para modificación? NO, si se quiere filtrar por altura, hay que tocar el código
(O)pen/Closed
Ejemplo:
Puede resolverse añadiendo una función de filtro
def filtra(productos: List[Producto],
criterio: Producto => Boolean): List[Producto] = {
for (p <- productos ;
if (criterio(p))) yield p
}
Filtro por color:
val filtrados = filtrador.filtra(ps, _.color == rojo)
val filtrados2 = filtrador.filtra(ps, _.altura == 12)
Filtro por altura:
(L)iskov Substitution
Los subtipos deben cumplir el contrato de los supertipos
Si se puede probar la propiedad q(x) para todos los x que
pertenecen a A y hay una clase B que hereda de A, entonces
todos los y de B deben cumplir q(y)
Errores habituales:
Heredar y modificar el comportamiento
Funcionalidad de los supertipos que los subtipos no siguen
(L)iskov Substitution
Ejemplo: Clase Pato con los métodos habituales:
haceCuak, tieneFormaPato
Si añadimos el método respira...
¿Todas las instancias cumplen?
Pato
haceCuak
tieneFormaPato
respira)
PatitoDeGomaPatoDeParque
haceCuak
tieneFormaPato
respira)
X
(L)iskov Substitution
Otro
ejemplo:
class Rectangulo(
var alto: Int,
var ancho:Int) {
def getAltura() = alto
def getAncho() = ancho
def setAltura(a: Int) { alto = a }
def setAncho(a: Int) { ancho = a }
def area() = alto * ancho
}
class Cuadrado(a:Int) extends Rectangulo(a,a) {
override def area() = ancho * ancho
}
Los cuadrados no cumplen el contrato de los rectángulos
(I)nterface Seggregation
Los clientes no deben depender de métodos que no
utilizan
Es mejor tener muchas interfaces pequeñas
Evitar módulos con mucha funcionalidad
En caso contrario  aparecen dependencias no deseadas
Si un módulo depende de funcionalidad que no usa, y estas
funcionalidades cambian, puede verse afectado
ClientA
ClientB
InterfaceA
methodA1
methodA2
InterfaceB
methodB1
methodB2
Service
mehtodA1
methodA2
methodB1
methodB2
...
<<uses>>
<<uses>>
(D)ependency Inversion
Módulos de alto nivel no deben depender de
módulos de bajo nivel
Ambos deben depender de abstracciones
Las abstracciones no deben depender de detalles
Los detalles sí pueden depender de abstracciones
Caballero
juego()
aventura
Aventura
comienza()
MatarDragon
comienza()
CalizSagrado
comienza()
X
(D)ependency Inversion
Ejemplo
class Aventura {
def comienza() {
???
}
}
class MatarDragon extends Aventura
class Caballero {
var aventura: Aventura = new MatarDragon()
def juego() {
aventura.comienza()
// ...
}
}
class CalizSagrado extends Aventura
class Caballero(var aventura: Aventura) {
def juego() {
aventura.comienza()
// ...
}
}
(D)ependency Inversion
Disminuye el acoplamiento
Facilita las pruebas unitarias
Pueden sustituirse módulos de bajo nivel por dobles de
prueba
Inyección de dependencias
Frameworks: Spring, Guice, etc.
Ley de Demeter
Ley de Demeter - Principio de menor conocimiento
Cada módulo sólo se comunica con vecinos
Objetivo: disminuir acoplamiento
Disminuir número de métodos invocados
Solución de compromiso
No siempre es positivo
Puede aumentar el número de métodos en los módulos
Síntomas de mal diseño:
Usar más de un punto...
a.b.method(...)


Fuent APIs
Mejorar legibilidad y usabilidad de interfaces
Ventajas
Librerías que se acercan a Domain Specific Languages
Facilidades de auto-completado de los IDEs
Fluent APIs
Truco: Métodos de actualización devuelven el
mismo objeto
Pueden encadenarse varios métodos
Ejemplo:
Product p = new Product().
setName("Pepe").
setPrice(23);No contradice la Ley de Demeter porque actúa sobre el mismo objeto
class Product {
...
public Product setPrice(double price) {
this.price = price;
return this;
};
Otras recomendaciones
Patrones de diseño
Configuración externa de un módulo
Crear implementaciones por defecto
Principios GRASP
General Responsibility Assignment Software Patterns

Más contenido relacionado

PDF
Automação ind 2_2014
PDF
Exprsaõ logicas e tabela verdade exercicios
DOCX
Reporte red lan
DOCX
Comandos ensp huawei
PDF
Comandos de configuracion de dispositivos cisco
PDF
UML - Diagramas de Actividades, componentes y clases
PPTX
Python científico (introducción a numpy y matplotlib))
DOC
Rutinas de retardo
Automação ind 2_2014
Exprsaõ logicas e tabela verdade exercicios
Reporte red lan
Comandos ensp huawei
Comandos de configuracion de dispositivos cisco
UML - Diagramas de Actividades, componentes y clases
Python científico (introducción a numpy y matplotlib))
Rutinas de retardo

La actualidad más candente (20)

DOCX
Normas ieee para referencias
PDF
Reporte de prácticas capítulo 1 cisco
PPTX
Unidad 2 ensamblador
PDF
Analisis de fourier para señales
PPTX
Protocolo arp
PDF
Tema 1: Procesadores segmentados.Tema 1: Procesadores segmentados.
DOC
Manual de-prueba-ethernet-con-netperset-y-tfgen
PDF
329200431 omron-cefire-cc
PPTX
Proyectos electrónica digital
PDF
Sentencias de control
PPT
Monitoreo de una red
PDF
Graficar lineas en java, en un j panel
DOCX
Trabajo mezclador de pintura2
PPTX
Cisco module 1
PDF
PPSX
Programación modular estructurada.ppt
PPT
Ejercicios
PPTX
Conversión de un AFN a un AFD.
PDF
Pasos para la construcción de una máquina de turing
PDF
Solido 4 -autocad 3-lamina a4
Normas ieee para referencias
Reporte de prácticas capítulo 1 cisco
Unidad 2 ensamblador
Analisis de fourier para señales
Protocolo arp
Tema 1: Procesadores segmentados.Tema 1: Procesadores segmentados.
Manual de-prueba-ethernet-con-netperset-y-tfgen
329200431 omron-cefire-cc
Proyectos electrónica digital
Sentencias de control
Monitoreo de una red
Graficar lineas en java, en un j panel
Trabajo mezclador de pintura2
Cisco module 1
Programación modular estructurada.ppt
Ejercicios
Conversión de un AFN a un AFD.
Pasos para la construcción de una máquina de turing
Solido 4 -autocad 3-lamina a4
Publicidad

Similar a 6 Principios de Programación Orientada a Objetos (20)

ODP
Taller SOLID Refactor
DOCX
Variables en Visual Basic 6.0
PPTX
Arquitectura software.taxonomias.modularidad.001
PPTX
Cuida tu código: Clean Code
PPT
Diseño Agile
PDF
Prueba de Caja Blanca
PDF
Apuntes #XPweek
PPT
8.- Manejo de errores y excepciones en Phyton
PPTX
Portafolio de evidencias
PPT
Fundamentos de Programacion
PDF
Buenasprcticas
PPTX
Clean Code (Presentacion interna en Virtual Software)
PDF
REPRESENTACION ALGORITMOS
PPTX
Portafolio de evidencias
PDF
Seminario SOLID-TDD
PPT
Tema 1 2_poo
PDF
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
PPTX
Programación en C#.pptx
Taller SOLID Refactor
Variables en Visual Basic 6.0
Arquitectura software.taxonomias.modularidad.001
Cuida tu código: Clean Code
Diseño Agile
Prueba de Caja Blanca
Apuntes #XPweek
8.- Manejo de errores y excepciones en Phyton
Portafolio de evidencias
Fundamentos de Programacion
Buenasprcticas
Clean Code (Presentacion interna en Virtual Software)
REPRESENTACION ALGORITMOS
Portafolio de evidencias
Seminario SOLID-TDD
Tema 1 2_poo
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Programación en C#.pptx
Publicidad

Más de Jose Emilio Labra Gayo (20)

PPTX
Publicaciones de investigación
PPTX
Introducción a la investigación/doctorado
PPTX
Challenges and applications of RDF shapes
PPTX
Legislative data portals and linked data quality
PPTX
Validating RDF data: Challenges and perspectives
PPTX
Legislative document content extraction based on Semantic Web technologies
PPTX
ShEx by Example
PPTX
Introduction to SPARQL
PPTX
Introducción a la Web Semántica
PPTX
RDF Data Model
PPTX
2017 Tendencias en informática
PPTX
RDF, linked data and semantic web
PPTX
Introduction to SPARQL
PPTX
19 javascript servidor
PPTX
Como publicar datos: hacia los datos abiertos enlazados
PPTX
16 Alternativas XML
PPTX
Arquitectura de la Web y Computación en el Servidor
Publicaciones de investigación
Introducción a la investigación/doctorado
Challenges and applications of RDF shapes
Legislative data portals and linked data quality
Validating RDF data: Challenges and perspectives
Legislative document content extraction based on Semantic Web technologies
ShEx by Example
Introduction to SPARQL
Introducción a la Web Semántica
RDF Data Model
2017 Tendencias en informática
RDF, linked data and semantic web
Introduction to SPARQL
19 javascript servidor
Como publicar datos: hacia los datos abiertos enlazados
16 Alternativas XML
Arquitectura de la Web y Computación en el Servidor

Último (20)

PDF
Sugerencias Didacticas 2023_Diseño de Estructuras Metalicas_digital.pdf
PDF
SUBDIVISIÓN URBANA PUEDE ENFRENTAR SERVIDUMBRE DE PASO.pdf
PPTX
CAPACITACIÓN DE USO ADECUADO DE EPP.pptx
PDF
FIJA NUEVO TEXTO DE LA ORDENANZA GENERAL DE LA LEY GENERAL DE URBANISMO Y CON...
PPTX
clase MICROCONTROLADORES ago-dic 2019.pptx
PDF
5 Presentación de PowerPointGENERACIÓN DESECHOS UIS 18-02-2023 (1).pdf
PPTX
Notificacion e investigación de incidentes y accidentes de trabajo.pptx
PPT
357161027-seguridad-industrial-diapositivas-ppt.ppt
PDF
Durabilidad del concreto en zonas costeras
DOCX
Cumplimiento normativo y realidad laboral
PPTX
Seminario de telecomunicaciones para ingeniería
PPT
tema DISEÑO ORGANIZACIONAL UNIDAD 1 A.ppt
PDF
Estrategias de apoyo de tecnología 2do periodo pdf
PDF
Copia de Presentación Propuesta de Marketing Corporativo Blanco y Negro.pdf
PDF
1132-2018 espectrofotometro uv visible.pdf
PDF
Sustitucion_del_maiz_por_harina_integral_de_zapall.pdf
PPTX
1 CONTAMINACION AMBIENTAL EN EL PLANETA.pptx
PPTX
Contexto Normativo NSR10, presentacion 2025
DOC
informacion acerca de la crianza tecnificada de cerdos
PPT
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL
Sugerencias Didacticas 2023_Diseño de Estructuras Metalicas_digital.pdf
SUBDIVISIÓN URBANA PUEDE ENFRENTAR SERVIDUMBRE DE PASO.pdf
CAPACITACIÓN DE USO ADECUADO DE EPP.pptx
FIJA NUEVO TEXTO DE LA ORDENANZA GENERAL DE LA LEY GENERAL DE URBANISMO Y CON...
clase MICROCONTROLADORES ago-dic 2019.pptx
5 Presentación de PowerPointGENERACIÓN DESECHOS UIS 18-02-2023 (1).pdf
Notificacion e investigación de incidentes y accidentes de trabajo.pptx
357161027-seguridad-industrial-diapositivas-ppt.ppt
Durabilidad del concreto en zonas costeras
Cumplimiento normativo y realidad laboral
Seminario de telecomunicaciones para ingeniería
tema DISEÑO ORGANIZACIONAL UNIDAD 1 A.ppt
Estrategias de apoyo de tecnología 2do periodo pdf
Copia de Presentación Propuesta de Marketing Corporativo Blanco y Negro.pdf
1132-2018 espectrofotometro uv visible.pdf
Sustitucion_del_maiz_por_harina_integral_de_zapall.pdf
1 CONTAMINACION AMBIENTAL EN EL PLANETA.pptx
Contexto Normativo NSR10, presentacion 2025
informacion acerca de la crianza tecnificada de cerdos
PRIMEROS AUXILIOS EN EL SECTOR EMPRESARIAL

6 Principios de Programación Orientada a Objetos

  • 1. Principios Programación Orientada a Objetos Jose Emilio Labra Gayo Dept. Informática Universidad de Oviedo
  • 2. DRY Don't Repeat Yourself Cada intención debe declararse en un único sitio Evitar repetir algo más de una vez Evitar código copiar/pegar Cada vez que se copia/pega se duplican las posibilidades de error Utilizar mecanismos de abstracción para capturer elementos similares
  • 3. KISS Keep It Simple Stupid Menos es más
  • 4. Afrontar el cambio El código debe prepararse para afrontar cambios en los requisitos Existen multiples motivos para cambiar Es imposible prever los cambios futuros ...pero sí pueden valorarse los cambios más probable Análisis de riesgos
  • 5. Wabi-Sabi Aceptar la imperfección Software no finalizado Suficientemente Bueno (good enough)
  • 6. Alta cohesividad Cohesividad = Coherencia de un módulo Cada modulo debe resolver una funcionalidad Debe ser posible probar cada modulo por separado
  • 7. Acoplamiento bajo Acoplamiento = grado de interacción entre módulos Acoplamiento bajo  Mejora la modificabilidad Despliegue independiente de cada módulo Estabilidad frente a cambios de otros módulos
  • 8. STUPID (S)ingleton (T)ight coupling (U)ntestability (P)remature Optimization (I)ndescriptive Naming (D)uplication From STUPID to SOLID: http://williamdurand.fr/2013/07/30/from-stupid-to-solid-code/
  • 9. Principios SOLID SRP (Single Responsability Principle) OCP (Open-Closed Principle) LSP (Liskov Substitution Principle) ISP (Interface Seggregation Principle) DIP (Dependency Injection Principle)
  • 10. (S)ingle Responsability Un módulo debe tener una única responsabilidad Responsabilidad = Motivo para cambiar No debe haber más de un motivo para cambiar un módulo En caso contrario, las responsabilidades se mezclan Aumenta el acoplamiento vs
  • 11. (S)ingle responsability Ejemplo Sistema gestión de informes class GestorInformes { def descargarDatos(uri: URI) ??? def prepararInforme(fichero: String): Informe = ??? def guardarInforme(db: DataBase): Unit = ??? // ... } Posibles cambios: forma de preparar el informe, formato de almacenamiento,... Algunos clientes utilizan los métodos de preparación de informes Otros clientes utilizan los métodos de almacenamiento de informes Si se realizan cambios en la forma de almacenar los informes, los clientes interesados solamente en preparar los informes se verían afectados
  • 12. (S)ingle responsability Solución: Separar en clases con una única responsabilidad NOTA No siempre está claro cómo separar responsabilidades
  • 13. (O)pen/Closed Abierto para extensión El modulo debe adaptarse a nuevos cambios de comportamiento Cerrado para modificar Los cambios de comportamiento pueden realizarse sin cambiar el código Cambios sin recompilar, modificar código fuente original, binarios, etc. "Open chest surgery is not needed when putting on a coat."
  • 14. (O)pen/Closed Ejemplo: Filtrar productor por color def filtraPorColor( productos: List[Producto], color: Color): List[Producto] = { for ( p <- productos ; if p.color == color ) yield p } Problema, si hay que filtrar por altura, por anchura, etc. ¿Abierto para extension? NO, no es posible filtrar por altura ¿Cerrado para modificación? NO, si se quiere filtrar por altura, hay que tocar el código
  • 15. (O)pen/Closed Ejemplo: Puede resolverse añadiendo una función de filtro def filtra(productos: List[Producto], criterio: Producto => Boolean): List[Producto] = { for (p <- productos ; if (criterio(p))) yield p } Filtro por color: val filtrados = filtrador.filtra(ps, _.color == rojo) val filtrados2 = filtrador.filtra(ps, _.altura == 12) Filtro por altura:
  • 16. (L)iskov Substitution Los subtipos deben cumplir el contrato de los supertipos Si se puede probar la propiedad q(x) para todos los x que pertenecen a A y hay una clase B que hereda de A, entonces todos los y de B deben cumplir q(y) Errores habituales: Heredar y modificar el comportamiento Funcionalidad de los supertipos que los subtipos no siguen
  • 17. (L)iskov Substitution Ejemplo: Clase Pato con los métodos habituales: haceCuak, tieneFormaPato Si añadimos el método respira... ¿Todas las instancias cumplen? Pato haceCuak tieneFormaPato respira) PatitoDeGomaPatoDeParque haceCuak tieneFormaPato respira) X
  • 18. (L)iskov Substitution Otro ejemplo: class Rectangulo( var alto: Int, var ancho:Int) { def getAltura() = alto def getAncho() = ancho def setAltura(a: Int) { alto = a } def setAncho(a: Int) { ancho = a } def area() = alto * ancho } class Cuadrado(a:Int) extends Rectangulo(a,a) { override def area() = ancho * ancho } Los cuadrados no cumplen el contrato de los rectángulos
  • 19. (I)nterface Seggregation Los clientes no deben depender de métodos que no utilizan Es mejor tener muchas interfaces pequeñas Evitar módulos con mucha funcionalidad En caso contrario  aparecen dependencias no deseadas Si un módulo depende de funcionalidad que no usa, y estas funcionalidades cambian, puede verse afectado ClientA ClientB InterfaceA methodA1 methodA2 InterfaceB methodB1 methodB2 Service mehtodA1 methodA2 methodB1 methodB2 ... <<uses>> <<uses>>
  • 20. (D)ependency Inversion Módulos de alto nivel no deben depender de módulos de bajo nivel Ambos deben depender de abstracciones Las abstracciones no deben depender de detalles Los detalles sí pueden depender de abstracciones Caballero juego() aventura Aventura comienza() MatarDragon comienza() CalizSagrado comienza() X
  • 21. (D)ependency Inversion Ejemplo class Aventura { def comienza() { ??? } } class MatarDragon extends Aventura class Caballero { var aventura: Aventura = new MatarDragon() def juego() { aventura.comienza() // ... } } class CalizSagrado extends Aventura class Caballero(var aventura: Aventura) { def juego() { aventura.comienza() // ... } }
  • 22. (D)ependency Inversion Disminuye el acoplamiento Facilita las pruebas unitarias Pueden sustituirse módulos de bajo nivel por dobles de prueba Inyección de dependencias Frameworks: Spring, Guice, etc.
  • 23. Ley de Demeter Ley de Demeter - Principio de menor conocimiento Cada módulo sólo se comunica con vecinos Objetivo: disminuir acoplamiento Disminuir número de métodos invocados Solución de compromiso No siempre es positivo Puede aumentar el número de métodos en los módulos Síntomas de mal diseño: Usar más de un punto... a.b.method(...)  
  • 24. Fuent APIs Mejorar legibilidad y usabilidad de interfaces Ventajas Librerías que se acercan a Domain Specific Languages Facilidades de auto-completado de los IDEs
  • 25. Fluent APIs Truco: Métodos de actualización devuelven el mismo objeto Pueden encadenarse varios métodos Ejemplo: Product p = new Product(). setName("Pepe"). setPrice(23);No contradice la Ley de Demeter porque actúa sobre el mismo objeto class Product { ... public Product setPrice(double price) { this.price = price; return this; };
  • 26. Otras recomendaciones Patrones de diseño Configuración externa de un módulo Crear implementaciones por defecto Principios GRASP General Responsibility Assignment Software Patterns