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

Bitácora de base de datos
Bitácora de base de datosBitácora de base de datos
Bitácora de base de datosLalo Osorio
 
Nucleo del sistema operativo
Nucleo del sistema operativoNucleo del sistema operativo
Nucleo del sistema operativoEmily_Fdez
 
modelos del proceso del software
 modelos del proceso del software  modelos del proceso del software
modelos del proceso del software Brihany Rossell
 
52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigoBrivé Soluciones
 
cuadro comparativo jerarquico vs democratico
cuadro comparativo jerarquico vs democraticocuadro comparativo jerarquico vs democratico
cuadro comparativo jerarquico vs democraticoitzelcamas
 
Registros de control y estados de la CPU
Registros de control y estados de la CPURegistros de control y estados de la CPU
Registros de control y estados de la CPUIvan Porras
 
POO: Herencia, Abstraccion y Polimorfismo
POO: Herencia, Abstraccion y PolimorfismoPOO: Herencia, Abstraccion y Polimorfismo
POO: Herencia, Abstraccion y PolimorfismoActimel
 
Archivos batch
Archivos batchArchivos batch
Archivos batchDenisse C
 
Conceptos de POO (Programacion Orientada a Objetos)
Conceptos de POO (Programacion Orientada a Objetos)Conceptos de POO (Programacion Orientada a Objetos)
Conceptos de POO (Programacion Orientada a Objetos)Josue Lara Reyes
 
Estructuras condicionales
Estructuras condicionalesEstructuras condicionales
Estructuras condicionalesAndreina Trejo
 
Mapa mental uml
Mapa mental umlMapa mental uml
Mapa mental umlrigo berto
 

La actualidad más candente (20)

Bitácora de base de datos
Bitácora de base de datosBitácora de base de datos
Bitácora de base de datos
 
Arquitectura multicapa
Arquitectura multicapaArquitectura multicapa
Arquitectura multicapa
 
Nucleo del sistema operativo
Nucleo del sistema operativoNucleo del sistema operativo
Nucleo del sistema operativo
 
Analizador Léxico en C++
Analizador Léxico en C++Analizador Léxico en C++
Analizador Léxico en C++
 
Introduccion a python 3
Introduccion a python 3Introduccion a python 3
Introduccion a python 3
 
modelos del proceso del software
 modelos del proceso del software  modelos del proceso del software
modelos del proceso del software
 
52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo52 ejercicios resueltos en pseudocodigo
52 ejercicios resueltos en pseudocodigo
 
cuadro comparativo jerarquico vs democratico
cuadro comparativo jerarquico vs democraticocuadro comparativo jerarquico vs democratico
cuadro comparativo jerarquico vs democratico
 
Registros de control y estados de la CPU
Registros de control y estados de la CPURegistros de control y estados de la CPU
Registros de control y estados de la CPU
 
POO: Herencia, Abstraccion y Polimorfismo
POO: Herencia, Abstraccion y PolimorfismoPOO: Herencia, Abstraccion y Polimorfismo
POO: Herencia, Abstraccion y Polimorfismo
 
Sistemas operativos distribuidos
Sistemas operativos distribuidosSistemas operativos distribuidos
Sistemas operativos distribuidos
 
Estructura Básica de PHP
Estructura Básica de PHPEstructura Básica de PHP
Estructura Básica de PHP
 
Archivos batch
Archivos batchArchivos batch
Archivos batch
 
Conceptos de POO (Programacion Orientada a Objetos)
Conceptos de POO (Programacion Orientada a Objetos)Conceptos de POO (Programacion Orientada a Objetos)
Conceptos de POO (Programacion Orientada a Objetos)
 
Conceptos poo (presentación1)
Conceptos poo (presentación1)Conceptos poo (presentación1)
Conceptos poo (presentación1)
 
Estructuras condicionales
Estructuras condicionalesEstructuras condicionales
Estructuras condicionales
 
Topicos Avanzados de Programacion Unidad 1 Eventos
Topicos Avanzados de Programacion Unidad 1 EventosTopicos Avanzados de Programacion Unidad 1 Eventos
Topicos Avanzados de Programacion Unidad 1 Eventos
 
Mapa mental uml
Mapa mental umlMapa mental uml
Mapa mental uml
 
Código intermedio
Código intermedioCódigo intermedio
Código intermedio
 
Taller de Base de Datos - Unidad 7 Conectividad
Taller de Base de Datos - Unidad 7 ConectividadTaller de Base de Datos - Unidad 7 Conectividad
Taller de Base de Datos - Unidad 7 Conectividad
 

Similar a Principios POO

Similar a Principios POO (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

Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxEduardoSnchezHernnde5
 
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfTAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfAntonioGonzalezIzqui
 
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfCENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfpaola110264
 
3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptx3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptxJhordanGonzalo
 
Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.ALEJANDROLEONGALICIA
 
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIACOMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIARafaelPaco2
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaSHERELYNSAMANTHAPALO1
 
Topografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasTopografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasSegundo Silva Maguiña
 
Exposicion. del documentos de YPFB corporación
Exposicion. del documentos de YPFB corporaciónExposicion. del documentos de YPFB corporación
Exposicion. del documentos de YPFB corporaciónjas021085
 
PRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potenciaPRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potenciazacariasd49
 
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIACLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIAMayraOchoa35
 
Fe_C_Tratamientos termicos_uap _3_.ppt
Fe_C_Tratamientos termicos_uap   _3_.pptFe_C_Tratamientos termicos_uap   _3_.ppt
Fe_C_Tratamientos termicos_uap _3_.pptVitobailon
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023ANDECE
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaANDECE
 
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaProyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaXjoseantonio01jossed
 
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdfManual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdfSandXmovex
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)ssuser6958b11
 
Cadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operacionesCadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operacionesal21510263
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALKATHIAMILAGRITOSSANC
 
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfCONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfErikNivor
 

Último (20)

Flujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptxFlujo multifásico en tuberias de ex.pptx
Flujo multifásico en tuberias de ex.pptx
 
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfTAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
 
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdfCENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
CENTROIDES Y MOMENTOS DE INERCIA DE AREAS PLANAS.pdf
 
3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptx3039_ftg_01Entregable 003_Matematica.pptx
3039_ftg_01Entregable 003_Matematica.pptx
 
Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.Flujo potencial, conceptos básicos y ejemplos resueltos.
Flujo potencial, conceptos básicos y ejemplos resueltos.
 
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIACOMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
COMPONENTES DE LA VIA FERREA UAJMS - BOLIVIA
 
CICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresaCICLO DE DEMING que se encarga en como mejorar una empresa
CICLO DE DEMING que se encarga en como mejorar una empresa
 
Topografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la IngenieríasTopografía 1 Nivelación y Carretera en la Ingenierías
Topografía 1 Nivelación y Carretera en la Ingenierías
 
Exposicion. del documentos de YPFB corporación
Exposicion. del documentos de YPFB corporaciónExposicion. del documentos de YPFB corporación
Exposicion. del documentos de YPFB corporación
 
PRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potenciaPRESENTACION DE CLASE. Factor de potencia
PRESENTACION DE CLASE. Factor de potencia
 
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIACLASE 2 MUROS CARAVISTA EN CONCRETO  Y UNIDAD DE ALBAÑILERIA
CLASE 2 MUROS CARAVISTA EN CONCRETO Y UNIDAD DE ALBAÑILERIA
 
Fe_C_Tratamientos termicos_uap _3_.ppt
Fe_C_Tratamientos termicos_uap   _3_.pptFe_C_Tratamientos termicos_uap   _3_.ppt
Fe_C_Tratamientos termicos_uap _3_.ppt
 
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
Centro Integral del Transporte de Metro de Madrid (CIT). Premio COAM 2023
 
Edificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes GranadaEdificio residencial Tarsia de AEDAS Homes Granada
Edificio residencial Tarsia de AEDAS Homes Granada
 
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctricaProyecto de iluminación "guia" para proyectos de ingeniería eléctrica
Proyecto de iluminación "guia" para proyectos de ingeniería eléctrica
 
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdfManual de Usuario Estacion total Sokkia SERIE SET10K.pdf
Manual de Usuario Estacion total Sokkia SERIE SET10K.pdf
 
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
VIRUS FITOPATÓGENOS (GENERALIDADES EN PLANTAS)
 
Cadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operacionesCadenas de Markov investigación de operaciones
Cadenas de Markov investigación de operaciones
 
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONALCHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
CHARLA DE INDUCCIÓN SEGURIDAD Y SALUD OCUPACIONAL
 
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdfCONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
CONSTRUCCIONES II - SEMANA 01 - REGLAMENTO NACIONAL DE EDIFICACIONES.pdf
 

Principios POO

  • 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