SlideShare una empresa de Scribd logo
1 de 26
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

La actualidad más candente

Introduccion al paradigma de la programacion orientado a objetos original
Introduccion al paradigma de la programacion orientado a objetos originalIntroduccion al paradigma de la programacion orientado a objetos original
Introduccion al paradigma de la programacion orientado a objetos originalJose Angel Rodriguez
 
Fundamentos programacion algoritmos java
Fundamentos programacion algoritmos javaFundamentos programacion algoritmos java
Fundamentos programacion algoritmos javaFreddy Morales Aragón
 
Unidad 1 Programación Orientada a Objetos (Programación III)
Unidad 1 Programación Orientada a Objetos (Programación III)Unidad 1 Programación Orientada a Objetos (Programación III)
Unidad 1 Programación Orientada a Objetos (Programación III)Servicio Tecnico de Computadoras
 
Poo 3 herencia
Poo 3 herenciaPoo 3 herencia
Poo 3 herenciajlmanmons
 
Analisis de algoritmos complejidad en tiempo y espacio
Analisis de algoritmos complejidad en tiempo y espacioAnalisis de algoritmos complejidad en tiempo y espacio
Analisis de algoritmos complejidad en tiempo y espacioAdamari Cortes
 
Diapositivas sobre patrones de diseño
Diapositivas sobre patrones de diseñoDiapositivas sobre patrones de diseño
Diapositivas sobre patrones de diseñodeyanireth
 
Capítulo 18 (Técnicas de control de la concurrencia)
Capítulo 18 (Técnicas de control de la concurrencia)Capítulo 18 (Técnicas de control de la concurrencia)
Capítulo 18 (Técnicas de control de la concurrencia)Liz Ocampo
 
Algoritmo de dijkstra
Algoritmo de dijkstraAlgoritmo de dijkstra
Algoritmo de dijkstraKeily Solano
 
Variable, constant, operators and control statement
Variable, constant, operators and control statementVariable, constant, operators and control statement
Variable, constant, operators and control statementEyelean xilef
 

La actualidad más candente (20)

Introduccion al paradigma de la programacion orientado a objetos original
Introduccion al paradigma de la programacion orientado a objetos originalIntroduccion al paradigma de la programacion orientado a objetos original
Introduccion al paradigma de la programacion orientado a objetos original
 
Fundamentos programacion algoritmos java
Fundamentos programacion algoritmos javaFundamentos programacion algoritmos java
Fundamentos programacion algoritmos java
 
Unidad 1 Programación Orientada a Objetos (Programación III)
Unidad 1 Programación Orientada a Objetos (Programación III)Unidad 1 Programación Orientada a Objetos (Programación III)
Unidad 1 Programación Orientada a Objetos (Programación III)
 
Poo 3 herencia
Poo 3 herenciaPoo 3 herencia
Poo 3 herencia
 
Analisis de algoritmos complejidad en tiempo y espacio
Analisis de algoritmos complejidad en tiempo y espacioAnalisis de algoritmos complejidad en tiempo y espacio
Analisis de algoritmos complejidad en tiempo y espacio
 
Diapositivas sobre patrones de diseño
Diapositivas sobre patrones de diseñoDiapositivas sobre patrones de diseño
Diapositivas sobre patrones de diseño
 
Pilares de la POO
Pilares de la POOPilares de la POO
Pilares de la POO
 
Merge Sort
Merge SortMerge Sort
Merge Sort
 
6 Curso de POO en Java - clases y objetos
6  Curso de POO en Java - clases y objetos6  Curso de POO en Java - clases y objetos
6 Curso de POO en Java - clases y objetos
 
Capítulo 18 (Técnicas de control de la concurrencia)
Capítulo 18 (Técnicas de control de la concurrencia)Capítulo 18 (Técnicas de control de la concurrencia)
Capítulo 18 (Técnicas de control de la concurrencia)
 
Presentacion Python
Presentacion  Python Presentacion  Python
Presentacion Python
 
Algoritmo de dijkstra
Algoritmo de dijkstraAlgoritmo de dijkstra
Algoritmo de dijkstra
 
Recursividad
RecursividadRecursividad
Recursividad
 
Variable, constant, operators and control statement
Variable, constant, operators and control statementVariable, constant, operators and control statement
Variable, constant, operators and control statement
 
Lenguajes de una maquina de turing
Lenguajes de una maquina de turingLenguajes de una maquina de turing
Lenguajes de una maquina de turing
 
Estructuras de datos lineales
Estructuras de datos linealesEstructuras de datos lineales
Estructuras de datos lineales
 
Noción de archivo real y virtual
Noción de archivo real y virtual Noción de archivo real y virtual
Noción de archivo real y virtual
 
Cifrado por Sustitución y por Transposición
Cifrado por Sustitución y por TransposiciónCifrado por Sustitución y por Transposición
Cifrado por Sustitución y por Transposición
 
OOP Python workshop
OOP Python workshopOOP Python workshop
OOP Python workshop
 
Python Programming Essentials - M8 - String Methods
Python Programming Essentials - M8 - String MethodsPython Programming Essentials - M8 - String Methods
Python Programming Essentials - M8 - String Methods
 

Similar a 6 Principios de Programación Orientada a Objetos

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

Taller SOLID Refactor
Taller SOLID RefactorTaller SOLID Refactor
Taller SOLID Refactor
 
Variables en Visual Basic 6.0
Variables en Visual Basic 6.0Variables en Visual Basic 6.0
Variables en Visual Basic 6.0
 
Arquitectura software.taxonomias.modularidad.001
Arquitectura software.taxonomias.modularidad.001Arquitectura software.taxonomias.modularidad.001
Arquitectura software.taxonomias.modularidad.001
 
Cuida tu código: Clean Code
Cuida tu código: Clean CodeCuida tu código: Clean Code
Cuida tu código: Clean Code
 
Informatica
InformaticaInformatica
Informatica
 
Tap04 poo
Tap04 pooTap04 poo
Tap04 poo
 
Diseño Agile
Diseño AgileDiseño Agile
Diseño Agile
 
Prueba de Caja Blanca
Prueba de Caja BlancaPrueba de Caja Blanca
Prueba de Caja Blanca
 
Apuntes #XPweek
Apuntes #XPweekApuntes #XPweek
Apuntes #XPweek
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Fundamentos de Programacion
Fundamentos de ProgramacionFundamentos de Programacion
Fundamentos de Programacion
 
Buenasprcticas
BuenasprcticasBuenasprcticas
Buenasprcticas
 
Clean Code (Presentacion interna en Virtual Software)
Clean Code (Presentacion interna en Virtual Software)Clean Code (Presentacion interna en Virtual Software)
Clean Code (Presentacion interna en Virtual Software)
 
REPRESENTACION ALGORITMOS
REPRESENTACION ALGORITMOSREPRESENTACION ALGORITMOS
REPRESENTACION ALGORITMOS
 
Portafolio de evidencias
Portafolio de evidenciasPortafolio de evidencias
Portafolio de evidencias
 
Seminario SOLID-TDD
Seminario SOLID-TDDSeminario SOLID-TDD
Seminario SOLID-TDD
 
Tema 1 2_poo
Tema 1 2_pooTema 1 2_poo
Tema 1 2_poo
 
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
Retos en la Adopción del Refactoring - Junta General del MexALN 28/06/2012
 
Programación en C#.pptx
Programación en C#.pptxProgramación en C#.pptx
Programación en C#.pptx
 
Interfaces en C#
Interfaces en C#Interfaces en C#
Interfaces en C#
 

Más de Jose Emilio Labra Gayo

Introducción a la investigación/doctorado
Introducción a la investigación/doctoradoIntroducción a la investigación/doctorado
Introducción a la investigación/doctoradoJose Emilio Labra Gayo
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapesJose Emilio Labra Gayo
 
Legislative data portals and linked data quality
Legislative data portals and linked data qualityLegislative data portals and linked data quality
Legislative data portals and linked data qualityJose Emilio Labra Gayo
 
Validating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesValidating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesJose Emilio Labra Gayo
 
Legislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesLegislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesJose Emilio Labra Gayo
 
Como publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosComo publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosJose Emilio Labra Gayo
 
Arquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorArquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorJose Emilio Labra Gayo
 

Más de Jose Emilio Labra Gayo (20)

Publicaciones de investigación
Publicaciones de investigaciónPublicaciones de investigación
Publicaciones de investigación
 
Introducción a la investigación/doctorado
Introducción a la investigación/doctoradoIntroducción a la investigación/doctorado
Introducción a la investigación/doctorado
 
Challenges and applications of RDF shapes
Challenges and applications of RDF shapesChallenges and applications of RDF shapes
Challenges and applications of RDF shapes
 
Legislative data portals and linked data quality
Legislative data portals and linked data qualityLegislative data portals and linked data quality
Legislative data portals and linked data quality
 
Validating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectivesValidating RDF data: Challenges and perspectives
Validating RDF data: Challenges and perspectives
 
Wikidata
WikidataWikidata
Wikidata
 
Legislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologiesLegislative document content extraction based on Semantic Web technologies
Legislative document content extraction based on Semantic Web technologies
 
ShEx by Example
ShEx by ExampleShEx by Example
ShEx by Example
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
Introducción a la Web Semántica
Introducción a la Web SemánticaIntroducción a la Web Semántica
Introducción a la Web Semántica
 
RDF Data Model
RDF Data ModelRDF Data Model
RDF Data Model
 
2017 Tendencias en informática
2017 Tendencias en informática2017 Tendencias en informática
2017 Tendencias en informática
 
RDF, linked data and semantic web
RDF, linked data and semantic webRDF, linked data and semantic web
RDF, linked data and semantic web
 
Introduction to SPARQL
Introduction to SPARQLIntroduction to SPARQL
Introduction to SPARQL
 
19 javascript servidor
19 javascript servidor19 javascript servidor
19 javascript servidor
 
Como publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazadosComo publicar datos: hacia los datos abiertos enlazados
Como publicar datos: hacia los datos abiertos enlazados
 
16 Alternativas XML
16 Alternativas XML16 Alternativas XML
16 Alternativas XML
 
XSLT
XSLTXSLT
XSLT
 
XPath
XPathXPath
XPath
 
Arquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el ServidorArquitectura de la Web y Computación en el Servidor
Arquitectura de la Web y Computación en el Servidor
 

Último

Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfKEVINYOICIAQUINOSORI
 
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICAINTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICAJOSLUISCALLATAENRIQU
 
desarrollodeproyectoss inge. industrial
desarrollodeproyectoss  inge. industrialdesarrollodeproyectoss  inge. industrial
desarrollodeproyectoss inge. industrialGibranDiaz7
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxbingoscarlet
 
Controladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y VentajasControladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y Ventajasjuanprv
 
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOPERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOFritz Rebaza Latoche
 
CARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptx
CARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptxCARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptx
CARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptxvalenciaespinozadavi1
 
MODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdf
MODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdfMODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdf
MODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdfvladimirpaucarmontes
 
CALCULO DE ENGRANAJES RECTOS SB-2024.pptx
CALCULO DE ENGRANAJES RECTOS SB-2024.pptxCALCULO DE ENGRANAJES RECTOS SB-2024.pptx
CALCULO DE ENGRANAJES RECTOS SB-2024.pptxCarlosGabriel96
 
Tinciones simples en el laboratorio de microbiología
Tinciones simples en el laboratorio de microbiologíaTinciones simples en el laboratorio de microbiología
Tinciones simples en el laboratorio de microbiologíaAlexanderimanolLencr
 
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILClase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILProblemSolved
 
hitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docxhitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docxMarcelaArancibiaRojo
 
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptCRISTOFERSERGIOCANAL
 
osciloscopios Mediciones Electricas ingenieria.pdf
osciloscopios Mediciones Electricas ingenieria.pdfosciloscopios Mediciones Electricas ingenieria.pdf
osciloscopios Mediciones Electricas ingenieria.pdfIvanRetambay
 
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESOCAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESOLUISDAVIDVIZARRETARA
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdffredyflores58
 
Mapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMONICADELROCIOMUNZON1
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdfCristhianZetaNima
 
PPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfPPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfalexquispenieto2
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesMIGUELANGEL2658
 

Último (20)

Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdf
 
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICAINTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
INTEGRALES TRIPLES CLASE TEORICA Y PRÁCTICA
 
desarrollodeproyectoss inge. industrial
desarrollodeproyectoss  inge. industrialdesarrollodeproyectoss  inge. industrial
desarrollodeproyectoss inge. industrial
 
CLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptxCLASe número 4 fotogrametria Y PARALAJE.pptx
CLASe número 4 fotogrametria Y PARALAJE.pptx
 
Controladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y VentajasControladores Lógicos Programables Usos y Ventajas
Controladores Lógicos Programables Usos y Ventajas
 
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADOPERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
PERFORACIÓN Y VOLADURA EN MINERÍA APLICADO
 
CARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptx
CARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptxCARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptx
CARGAS VIVAS Y CARGAS MUERTASEXPOCI.pptx
 
MODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdf
MODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdfMODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdf
MODIFICADO - CAPITULO II DISEÑO SISMORRESISTENTE DE VIGAS Y COLUMNAS.pdf
 
CALCULO DE ENGRANAJES RECTOS SB-2024.pptx
CALCULO DE ENGRANAJES RECTOS SB-2024.pptxCALCULO DE ENGRANAJES RECTOS SB-2024.pptx
CALCULO DE ENGRANAJES RECTOS SB-2024.pptx
 
Tinciones simples en el laboratorio de microbiología
Tinciones simples en el laboratorio de microbiologíaTinciones simples en el laboratorio de microbiología
Tinciones simples en el laboratorio de microbiología
 
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVILClase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
Clase 7 MECÁNICA DE FLUIDOS 2 INGENIERIA CIVIL
 
hitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docxhitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docx
 
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
 
osciloscopios Mediciones Electricas ingenieria.pdf
osciloscopios Mediciones Electricas ingenieria.pdfosciloscopios Mediciones Electricas ingenieria.pdf
osciloscopios Mediciones Electricas ingenieria.pdf
 
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESOCAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
CAPITULO 4 ANODIZADO DE ALUMINIO ,OBTENCION Y PROCESO
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
 
Mapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptxMapas y cartas topográficas y de suelos.pptx
Mapas y cartas topográficas y de suelos.pptx
 
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
04. Sistema de fuerzas equivalentes II - UCV 2024 II.pdf
 
PPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdfPPT ELABORARACION DE ADOBES 2023 (1).pdf
PPT ELABORARACION DE ADOBES 2023 (1).pdf
 
clasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias localesclasificasion de vias arteriales , vias locales
clasificasion de vias arteriales , vias locales
 

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