Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Esta es una publicación traducida por IA.

제이온

[Objetos] Capítulo 1. Objetos, diseño

Seleccionar idioma

  • Español
  • English
  • 汉语
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

Texto resumido por la IA durumis

  • En el desarrollo de software, la práctica es más importante que la teoría, y se puede ver la importancia del diseño orientado a objetos a través de un simple programa.
  • Tomando como ejemplo una aplicación de venta de entradas, se explica cómo escribir código flexible a los cambios reduciendo las dependencias y el acoplamiento entre objetos, y se compara la diferencia entre la programación procedural y la orientada a objetos.
  • El diseño orientado a objetos crea código modificable, y los objetos son entidades autónomas que se responsabilizan de sus propios datos, por lo que las dependencias entre los objetos que colaboran deben gestionarse adecuadamente.

Introducción

Robert L. Glass argumentó que la práctica precede a la teoría. Especialmente en el desarrollo de software, la práctica está adelante de la teoría, y los desarrolladores aprenden más cuando ensucian sus manos creando código concreto. Por lo tanto, vamos a dejar de lado la teoría y los conceptos por un tiempo y echar un vistazo a un programa simple.


Implementar una aplicación de venta de entradas

  • Se planea organizar un pequeño evento para promover el teatro.
    • Contenido del evento: enviar invitaciones para ver el espectáculo de forma gratuita a los asistentes elegidos por sorteo
  • Los asistentes que hayan ganado el sorteo deben ser separados de los que no.
    • Asistentes que hayan ganado el sorteo: canjear la invitación por una entrada
    • Asistentes que no hayan ganado el sorteo: comprar la entrada por dinero



¿Qué está mal?

Robert Martin describe tres funciones que debe tener un módulo de software (un elemento arbitrario que compone un programa, independientemente de su tamaño, como una clase, un paquete o una biblioteca).


  • Funciona correctamente durante la ejecución.
  • Existe para ser cambiado.
    • Debería ser posible cambiar con poco trabajo.
  • Se comunica con las personas que leen el código.
    • Los desarrolladores deben ser capaces de leerlo y entenderlo fácilmente.


La aplicación de venta de entradas anterior satisface la primera restricción, que es ejecutar correctamente, pero no satisface los objetivos de facilidad de cambio y comunicación.


Código que no cumple las expectativas

Veamos por qué no se satisface el objetivo de comunicación.


  • Lo que hace el método enter() de la clase Theater
    • El teatro abre el bolso del asistente para ver si hay una invitación.
    • Si hay una invitación en el bolso, se le dice al vendedor que mueva la entrada que está en la taquilla al bolso del asistente.
    • Si no hay una invitación en el bolso, se le dice al asistente que saque dinero en efectivo del bolso por el precio de la entrada, compre la entrada y la ponga en el bolso.
  • Desde el punto de vista del asistente, un tercero, el teatro, debe buscar en su bolso, tomar dinero y poner una entrada.
  • Desde el punto de vista del vendedor, un tercero, el teatro, debe manipular las entradas y el efectivo de la taquilla sin permiso.
  • Un código comprensible es un código que no se desvía mucho de nuestras expectativas. El teatro anterior no cumple nuestras expectativas.
    • El asistente debe sacar el dinero de su bolso y pagárselo al vendedor para recibir la entrada.
    • El vendedor debe sacar la entrada de la taquilla y dársela al asistente, y cobrar el dinero al asistente y guardarlo en la taquilla.
  • Además, para comprender el método enter(), se debe recordar toda una serie de detalles.
    • Audience tiene un objeto Bag.
    • Bag contiene efectivo y entradas.
    • TicketSellet vende entradas en TicketOffice, y TicketOffice contiene dinero en efectivo y entradas.


Código vulnerable a cambios

El método enter() asume dos condiciones.

  • El asistente siempre lleva un bolso para guardar dinero en efectivo y una invitación.
  • El vendedor solo vende entradas en la taquilla.


¿Qué pasa con las siguientes situaciones?

  • El asistente puede no tener un bolso.
  • El asistente puede usar una tarjeta de crédito en lugar de dinero en efectivo.
  • El vendedor puede vender entradas fuera de la taquilla.


Por ejemplo, para satisfacer el primer requisito, debemos eliminar el objeto Bag de Audience y modificar el método enter() de la clase Theater. Esto se debe a que la clase Theater depende demasiado de la información detallada de que el asistente lleva un bolso y el vendedor solo vende entradas en la taquilla. Si uno de estos detalles cambia, debemos modificar tanto la clase como las clases que dependen de ella (por ejemplo, Theater).


Este es un problema relacionado con las dependencias entre objetos. Las dependencias implican un impacto en los cambios. Sin embargo, el objetivo del diseño orientado a objetos es construir una comunidad de objetos que colaboren entre sí, por lo que no debemos eliminar las dependencias sin más, sino que debemos mantener solo lasdependencias mínimas necesariaspara implementar las funciones de la aplicación y eliminar las dependencias innecesarias.


Se dice que un caso en el que las dependencias entre objetos son excesivas tiene unalto acoplamiento. Cuanto más alto sea el acoplamiento entre dos objetos, mayor será la probabilidad de que se cambien juntos. Por lo tanto, el objetivo del diseño es reducir el acoplamiento entre objetos para crear un diseño que sea fácil de cambiar.


Mejorar el diseño

Theater no necesita saber que el asistente tiene un bolso y que el vendedor vende entradas en la taquilla. Theater solo quiere que el asistente entre en el teatro. Por lo tanto, debemos hacer que el asistente sea una entidad autónoma que procese su propio efectivo e invitación, y que el vendedor maneje sus propias entradas y tarifa de venta.


Aumentar la autonomía

Se dice que un objeto que realiza solo las tareas estrechamente relacionadas y delega las tareas no relacionadas a otros objetos tiene un alto grado de cohesión. Al crear objetos autónomos que procesen sus propios datos, podemos reducir el acoplamiento y aumentar la cohesión.


Orientación a procedimientos y orientación a objetos

  • Orientación a procedimientos
    • El método enter() de Theater es un proceso, y Audience, TicketSeller, Bag y TicketOffice son datos.
    • La forma de colocar procesos y datos en módulos separados se denomina programación orientada a procedimientos.
    • Hay mucho código que va en contra de nuestra intuición. (por ejemplo, el asistente administra su propio dinero e invitación).
    • Es difícil limitar el impacto de los cambios de datos.
    • La responsabilidad se gestiona de forma centralizada. (Theater lo gestiona todo)
  • Orientación a objetos
    • La forma de colocar datos y procesos en el mismo módulo se denomina programación orientada a objetos.
    • Podemos escribir código que coincida con nuestra intuición.
    • Podemos limitar eficazmente el impacto de los cambios de datos a través de la encapsulación.
    • Cada objeto es responsable de sí mismo.


Se puede mejorar aún más.

  • La clase Bag de la clase Audience sigue siendo una entidad pasiva arrastrada por la clase Audience, por lo que debemos hacer que la clase Bag sea una entidad autónoma.
  • TicketOffice de la clase TicketSeller también está controlado por TicketSeller a voluntad. Debemos hacer que TicketOffice sea una entidad autónoma.
    • Sin embargo, después del cambio, TicketOffice se ha unido a Audience.
    • Este tipo de diseño debe considerar cuidadosamente las compensaciones. En este caso, podemos llegar a un acuerdo para hacer que TicketOffice sea una entidad algo pasiva para reducir el acoplamiento con Audience.



¡Sí, es una mentira!

  • Aunque sea una entidad pasiva en la realidad, en el mundo de la orientación a objetos, todo se convierte en una entidad activa y autónoma.
  • Es una buena idea usar la personificación para pensar en los objetos pasivos como si fueran seres que ríen, hablan y se enfadan.


Diseño orientado a objetos

¿Por qué es necesario el diseño?

  • El diseño es la forma de organizar el código.
  • Un buen diseño es aquel que cumple plenamente con los requisitos de hoy y es capaz de adaptarse suavemente a los cambios de mañana.


Diseño orientado a objetos

  • Un código cambiable es un código fácil de entender.
  • El paradigma de la orientación a objetos nos ayuda a escribir código de la misma manera que vemos el mundo.
  • Los objetos son entidades autónomas que son responsables de sus propios datos.
  • Un buen diseño orientado a objetos es aquel que gestiona adecuadamente las dependencias entre objetos colaborativos.


Fuentes

  • Objetos
제이온
제이온
제이온
제이온
[Objetos] Capítulo 2. Programación orientada a objetos Este documento explica la metodología de la programación orientada a objetos para implementar un sistema de reserva de entradas para películas, que abarca conceptos como colaboración, objetos, clases, herencia, polimorfismo, abstracción y composición. Pre

28 de abril de 2024

[Effective Java] Item 6. Evita la creación innecesaria de objetos Esta es una guía sobre cómo reducir la creación innecesaria de objetos en Java. Para objetos inmutables como String y Boolean, es mejor usar literales y para expresiones regulares, es mejor almacenar en caché las instancias de Pattern. Además, el autoboxi

28 de abril de 2024

[Effective Java] Item 5. Utilice la inyección de dependencia en lugar de especificar recursos Si una clase depende de recursos externos, es mejor no usar singletons ni clases de utilidad estáticas. La inyección de dependencia puede mejorar la flexibilidad, la reutilización y la facilidad de prueba de la clase, y el uso del patrón de método de fábr

28 de abril de 2024

[No especializado en informática, sobrevivir como desarrollador] 14. Resumen de las preguntas comunes de la entrevista técnica para desarrolladores principiantes Esta es una guía de preparación para entrevistas técnicas para desarrolladores principiantes. Se explican conceptos que aparecen con frecuencia en las entrevistas, como el área de memoria principal, las estructuras de datos, RDBMS y NoSQL, orientación a p
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 de abril de 2024

¿Qué te parece mi idea? El significado de una idea va más allá de un simple pensamiento creativo, depende de cómo puede impactar en la vida cotidiana de otras personas y transmitirles un significado. Desde una perspectiva filosófica de Heidegger, podemos reflexionar sobre el ver
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

7 de mayo de 2024

Love Transfer 2 y la cultura organizacional: el poder de la observación - 2 En lugar de depender de consultores externos para mejorar la cultura organizacional, se debe analizar la cultura organizacional y buscar cambios a través de la observación "interna" de las interacciones de los empleados, la disposición del espacio, los sí
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

9 de mayo de 2024

Modelado de datos lógico del proyecto Kanbanboard 2 Explica paso a paso cómo realizar el modelado de datos lógico basado en el ERD de modelado de datos conceptual, y presenta las dificultades y soluciones que surgen durante el proceso de normalización. En particular, se trata en detalle la cuestión de si s
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

9 de abril de 2024

[Concurrencia] Operación atómica: Memory Fence y Memory Ordering Esta publicación de blog explica cómo tener en cuenta el orden de la memoria en las operaciones atómicas y la importancia de las opciones de ordenación. Se explica en detalle las diversas opciones de ordenación, como Relaxed, Acquire, Release, AcqRel y Se
곽경직
곽경직
곽경직
곽경직
곽경직

12 de abril de 2024

¿Cómo pueden las empresas tecnológicas prepararse para el "metaverso"? La historia heroica del jugador 'Let Me Solo Her' en el juego 'Elden Ring' forma un fandom centrado en el usuario, no en el personaje del juego, lo que sugiere que el metaverso que las empresas tecnológicas persiguen debe considerar la formación de relaci
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son
Byungchae Ryan Son

8 de mayo de 2024