Programación Orientada a Objetos (POO) de Politécnica

Diapositivas de Politécnica sobre Programación Orientada a Objetos (POO). El Pdf explora el diseño orientado a objetos, los principios SOLID y conceptos como cohesión y acoplamiento, con ejemplos en Java. Es un material de Informática para Universidad.

Ver más

58 páginas

Programación Orientada
a Objetos
-POO-
3. Diseño Orientado a Objetos
Jesús Bernal Bermúdez
12/12/2024
Diseño Orientado a Objetos
POO :: DOO
2
Cohesión. Grado de unión de un sistema. Siempre se buscará que
las clases tengan alta cohesión.
Acoplamiento. Grado de dependencia de los sistemas. Siempre se
buscará que las clases tengan bajo acoplamiento.
Ampliación sostenible. Cada vez que mejoremos el sistema, debe
afectar lo mínimo posible a las clases existentes.
Cohesión. Grado de unión de un sistema. Siempre se buscará que
las clases tengan alta cohesión.
Acoplamiento. Grado de dependencia de los sistemas. Siempre se
buscará que las clases tengan bajo acoplamiento.
Ampliación sostenible. Cada vez que mejoremos el sistema, debe
afectar lo mínimo posible a las clases existentes.
Software de calidad
Single Responsibility Principle (SRP)
Open/Closed Principle (OCP)
Liskov Substitution Principle (LSP)
Interface Segregation Principle (ISP)
Dependency Inversion Principle (DIP)
Single Responsibility Principle (SRP)
Open/Closed Principle (OCP)
Liskov Substitution Principle (LSP)
Interface Segregation Principle (ISP)
Dependency Inversion Principle (DIP)
Principios S.O.L.I.D.

Visualiza gratis el PDF completo

Regístrate para acceder al documento completo y transformarlo con la IA.

Vista previa

Diseño Orientado a Objetos

Software de calidad

  • Cohesión. Grado de unión de un sistema. Siempre se buscará que las clases tengan alta cohesión.
  • Acoplamiento. Grado de dependencia de los sistemas. Siempre se buscará que las clases tengan bajo acoplamiento.
  • Ampliación sostenible. Cada vez que mejoremos el sistema, debe afectar lo mínimo posible a las clases existentes.

Principios S.O.L.I.D.

  • Single Responsibility Principle (SRP)
  • Open/Closed Principle (OCP)
  • Liskov Substitution Principle (LSP)
  • Interface Segregation Principle (ISP)
  • Dependency Inversion Principle (DIP)

Principios SOLID

Principio de Única Responsabilidad

  • Cada clase debe tener una única responsabilidad.
  • Una clase debería tener una, y solo una, razón para cambiar. Si solo tiene una responsabilidad, tendrá una buena cohesión.

Principio de Abierto/Cerrado

  • Una clase debe estar abierta para su extensión pero cerrada para su modificación.
  • Se busca lograr que puedas extender el comportamiento de una clase sin modificar su código fuente.

C 1Extensión VS Composición/Agregación

POO :: DOO 4 doo ADAPO inheritance composition aggregation User «key »-id : Integer «unique»-mobile : Integer -name : String -address : String -eMail : String -eMail : String -educationalLevel : String -educationalLevel : String 1 1 IVE AdvancedUser -eMail : String -educationalLevel : String «key »-id : Integer «unique»-mobile : Integer -name : String -address : String «key »-id : Integer «unique»-mobile : Integer -name : String -address : String NATIONI IMPENDI AdvancedUser AdvancedUser 0 .. 1 1 User UserPOO :: DOO

Principios SOLID de Liskov

Principio de Sustitución de Liskov

  • Los objetos de una clase base deberían poder ser reemplazados por objetos de sus clases derivadas sin afectar la corrección del programa.
  • Este principio garantiza que las clases derivadas puedan sustituirse por sus clases base sin interrupciones en el programa.
  • Cuando se rescribe un método:
    • Precondiciones: iguales o mas extensas.
    • Poscondiciones: iguales o mas restrictivas.

Principios SOLID de Interfaces

Principio de Segregación de Interfaces

  • Un cliente no debería verse obligado a depender de interfaces que no utiliza.
  • Este principio sugiere que una clase no debe ser forzada a implementar interfaces que no usa. En su lugar, debería implementar interfaces específicas relacionadas con su comportamiento.

Principio de Inversión de Dependencia

  • Este principio promueve la idea de que los módulos de alto nivel no deben depender de módulos de bajo nivel, sino ambos deben depender de abstracciones.
  • Las abstracciones no deben depender de detalles, sino los detalles deben depender de abstracciones.
  • Los servicios no debería depender de la implementación de los repositorios.
  • Una clase Padre, no debería depender de una clase Hija.Aplicación CLI

DI vs DIP vs IoC

Inversion of Control

  • Un objeto que necesita de otro objeto (por dependencia) NO lo busca NI lo crea, se lo dan.

Dependency Injection (DI)

  • Patrón para la creación de objetos.
  • Una clase externa (normalmente un framework), se encarga de crear el objeto e inyectármelo a través del constructor o un método set *.

Dependency Inversión (DIP)

  • Principios SOLID

An 1POO :: DOO

Singleton

Propósito: Creación. Ámbito: objeto

Client +method( ) Singleton.getInstance(); single ton Singleton 1 -instance : Singleton 2 -Singleton() +getInstance() : Singleton 3 LIVER Se garantiza que una clase sólo tenga una instancia y se proporciona un acceso global a ella .D P Atributo privado estático de la propia clase. · Creación temprana (eager). 2 Constructor privado. 3 Método estático y público para devolver el atributo. · Creación perezosa (lazy) MPENDI nn TDPOO :: DOO

Patrón Único Singleton

logger Logger -logs : String +Logger() +addLog( log : String ) +getLogs() : String +clear() Logger AD*PO solution Logger -logger : Logger -logs : String -Logger() +getLogger() : Logger +addLog( log : String ) +getLogs() : String +clear() Logger & Singleton IMPENDI nn T DSingleton APP-SHOP POO :: DOO

app_shop

POLA DependencyInjector -dependencyInjector - -Dependency Injector() +getDependencyInjector() DependencyInjector NATIONI ENDI n TDCommand (Order)

Propósito: Creación. Ámbito: objeto

command Invoker Order O -orders : Map 1 +execute() +name() : String +icon() +add( order : Order ) +invoker( String key ) +keys() 4 1 1 Order1 Order2 Order3 -receptor : Receptor1 -receptor : Receptor1 -receptor : Receptor2 +Order1(receptor : Receptor1) +execute () +Order2(receptor : Receptor1) +execute () +Order3( receptor ) +execute() Receptor1 this.receptor.action1(); +action1() +action2() 4 Receptor2 +action3() Se desacopla el objeto que invoca a la operación asociada, mediante un objeto. D P El invocador maneja un mapa de comandos, desconoce su tipo 2 Interface para desacoplar al invocador. · Se establece los métodos de un comando 3 Una clase por cada comando 4 Los receptores pueden estar compartidos entre comandos NATIONI IMPENDI TD nn 2 3POO :: Programación OO

App

console C CommandLineInterface D User user · help() · setUser() 1 1 I Command 1 1 1 1 void execute(String[] params) «default» String help() 7 1 commands 1 E Delimiters CListUsers C CreateUser C Login Help TECHNICA services ATIONI C View CUserService POLA String name() List params() List allowedRoles() String helpMessage() ELSIDAProgramación Orientada a Objetos

Programación Funcional

POO

Programación imperativa: ¿Cómo ?. Abstracción, encapsulamiento, modularidad, jerarquía. Clases relacionadas mediante herencia, composición, agregación y asociación. Objetos con estado: los atributos. Unidad: Clases & Objetos.

PF

UNIVER D*PO Programación declarativa: ¿ Qué ?. Basado en Funciones: funciones Lambda. Sin estado, sin orden y sin efectos colaterales. Valores inmutables: paso de parámetros por valor. Unidad: Función. NAI IMPENDI nn T DPOO :: DOO

Java Función Lambda

  • item
  • (String name) params
  • (name, age)
  • () H- ........
  • Flecha (arrow)
  • Class :: method (i->)
  • object :: method (i->) body
  • expression (return)
  • {exp; return exp;} NATIONI IMPENDI nn TD

Paradigmas de programación Java

Imperativo

public Integer function (String param) return Integer.valueOf(param); } { public void consumer(String p1, String p2) { System.out.println(p1 + p2); } public Boolean predicate(String value) value = value.trim(); return value.length() < 4; } { TECHNICA NATIONI IMPENDI M nn TD public String suplier() return " ... "; }

Lambda

param -> Integer.valueOf(param) Integer :: valueOf (p1, p2) -> System.out.println(p1 + p2) (String p1, String p2) -> System.out.println(p1 + p2) value -> { value = value.trim(); return value.length() < 4; }; () ->" ... "

Java Función Lambda

Consumer accept(T) · System.out :: println (item->) Function apply(T):R · item -> item +1 R Predicate test(T):Boolean · item -> item > 0 Supplier get(): T · ()->" ... " ... nn TPOO :: DOO

Java Collection & Stream

  • Gestión bucle
  • Método de transformación Collection [a, b, c ... ]
  • Paralelismo
  • ¿ Reutilización del código? Stream in .parallel() POL VERS Función de transformacion Stream out TECHNICA NATIONI IMPENDI nn TDProgramación Funcional

Consumidor

Imperativo

public static final List INTEGER_LIST = List.of(3, -2, 0, 4); public void consumer() { for (int i = 0; i < INTEGER_LIST.size(); i++) { //for i System.out.println(INTEGER_LIST.get(i)); } for (int item : INTEGER_LIST) { //for each System.out.println(item); } C ONI

Funcional

INTEGER_LIST.stream().forEach(System.out :: println); //functional } DProgramación Funcional

Predicado

Imperativo

public static final List INTEGER_LIST = List.of(3, -2, 0, 4); public void predicate() {// only positive values for (int item : INTEGER_LIST) { //for each if (item >= 0) { System.out.println(item); } } NATIONI T DPOO :: DOO

Funcional

INTEGER_LIST.stream() //functional .filter(item -> item >= 0) .forEach(System.out :: println); }

Programación Funcional

Función Imperativo

public static final List STRING_LIST = List.of("3", "-2", "0", "4"); public void function() {// convierte a Integer, elimina 0 y *2 List result2 = new ArrayList<>(); for (String item : STRING_LIST) { //for each int intItem = Integer.parseInt(item); if (intItem != 0) { result2.add(intItem * 2); } } NATIONI 1PENDI TD nn }

Función Funcional

List result = STRING_LIST.stream() //functional .map(Integer :: parseInt) .filter(item -> item != 0) .map(item -> item * 2) .toList();

Programación Funcional Suministrador

Imperativo

public static final List STRING_LIST = List.of("3", "-2", "0", "4"); public void suplier() { List result = new ArrayList<>(); for (int i = 0; i < 10; i++) { //for i result.add(i * 2); } System.out.println(result); NATIONI 1PENDI } TDPOO :: DOO

Funcional

List result2 = IntStream .range(0, 10) .map(value -> value * 2) .boxed() .toList(); System.out.println(result2);

Programación Funcional Función

Imperativo

public static final List INTEGER_LIST = List.of(3, -2, 0, 4); public void average() { int sum = 0; for (int number : INTEGER_LIST) { sum += number; } double average = (double) sum / INTEGER_LIST.size(); NATIONI T D

Funcional

average = INTEGER_LIST.stream() .mapToDouble(Integer :: intValue) .average() .orElse Throw(); // Manejo de caso vacío }Java

Stream. Crear y coleccionar

list.stream(); IntStream.range(); Stream.of("1", "2" ... ); Stream.generate(); Stream.iterate(); DAD*POL .toList() toArray(Integer :: new) [a, b, c] TECHNICA NATIONI IMPENDI UNIVER nn TDPOO :: DOO

Java Stream. Filtrado

.filter(Predicate) .skip(long) .limit(long) QAD*POLA LIVER .distinct() NATIONI TECHNICA IMPENDI nn TD

¿Non has encontrado lo que buscabas?

Explora otros temas en la Algor library o crea directamente tus materiales con la IA.