Cómo convertirse en un excelente pensador orientado a objetos.

En términos generales, una acción (o función) en una clase debe ser algo que ver con el objeto en el que se encuentra.

Echa un vistazo a un GIST rápido que acabo de crear para esta respuesta. El carro de compras básico me deja saber si es útil.

Vamos a intentar una analogía simplificada.

  • Controlador = Recepcionista de oficina
  • Acción = Programador
  • Modelo = Asistente personal
  • Ver = Representante de ventas

El controlador responde al teléfono, y dirige la llamada a la acción apropiada o responde bien si el cliente en el teléfono está hablando en broma.

El modelo tiene el control del archivador, es su trabajo obtener un archivo del gabinete, escribir algo en él, tirarlo en la papelera o colocarlo nuevamente en el gabinete. (CRUD Crear, Leer, Actualizar o Eliminar)

La acción tiene un trabajo específico y maneja precisamente ese trabajo, ya que trabajan estrechamente con el modelo. Preparando todos los datos. ¿Existe este producto? Genial, necesitamos un nuevo carrito si aún no tenemos uno en la sesión y lo agregamos a los productos del carrito, guárdelo en la sesión y luego podemos ver qué hace el usuario a continuación.

La vista de un cliente que llama por teléfono es respondida. Agarran el archivo que la acción ha preparado y hacen una hermosa presentación al cliente utilizando la información proporcionada por la acción. (¡Ojalá el cliente compre más productos o finalice una venta!)

El controlador y la acción nunca deberían tener que ir directamente al gabinete (en riesgo de molestar al asistente).

El modelo y la acción nunca deben descolgar el teléfono para hablar directamente con un cliente (supongamos que no está en la descripción del trabajo de un asistente).

La vista nunca debería tener que hacer nada, excepto presentar los datos que la acción ha preparado.

Este es un largo viaje para ser un pensador orientado a objetos. Viene con experiencia. Debes empezar a pensar en términos de objetos. Siempre que vea un objeto (que es todo el tiempo) y esté libre, intente pensar en todas las propiedades que posee ese objeto y el comportamiento asociado con él. Esta técnica te ayudará mucho y crecerás como un pensador orientado a objetos.

No importa lo que esté haciendo, piense de manera OOP si está programando, leyendo, bañándose, cocinando, etc. Podrá relacionar todas y cada una de sus actividades y cada objeto que sostendrá. Interactuando con el paradigma orientado a objetos.

Si lo desea, también puede leer este libro: Compre objetos para principiantes en C # 2008: del concepto al código (Expert’s Voice en .NET) Reserve en línea a precios bajos en la India. Sin duda te ayudará a construir una base en OOPs.

Se necesita mucha práctica y hacer malos diseños para aprender a hacer buenos diseños. No tengas miedo de experimentar. El diseño orientado a objetos se basa principalmente en cómo se utilizan los objetos, no en lo que son los objetos. Asegúrese de tener una visión clara de cómo se usará el objeto y exponga solo los métodos y las propiedades que se necesitan para ese uso. Oculta tanta información sobre cómo funcionan las cosas dentro de los objetos. Si el código que utiliza los objetos tiene que saber cómo funcionan internamente los objetos, entonces ha fallado.

Esto es un poco confuso, pero es importante entender por qué la “Ocultación de la información” es realmente importante. El número de suposiciones hechas por el código sobre cómo funciona el sistema debe minimizarse. La pregunta que me pregunto constantemente es si tengo 2 códigos y quiero hacer un cambio importante en la forma en que uno de ellos hace su trabajo, entonces, ¿qué significa eso para el otro código o para el resto del sistema? ? Si encuentra que hacer cambios en un objeto o agregar otro sabor del mismo tipo de objeto parece hacer cambios en otros objetos, entonces tiene un mal diseño.

Leyendo tu pregunta y su detalle, creo que estás haciendo dos preguntas:

  1. ¿Cómo me convierto en un excelente pensador orientado a objetos?
  2. ¿Cómo modelo conceptos en un problema en código orientado a objetos.

¿Cómo me convierto en un excelente pensador orientado a objetos?

Deja de ser un pensador procesal. Un pensador de procedimientos considera una solución a un problema como una serie de instrucciones (un procedimiento) que pueden afectar, consultar e interactuar con datos y otros procedimientos. Los problemas complejos más grandes se abordan realmente mediante el uso de la descomposición funcional para convertirlos en piezas de código de procedimiento cada vez más pequeñas (modulares).

Un pensador orientado a objetos, en cambio, representa los conceptos de un problema como entidades independientes y autocontenidas, como objetos. Los que internamente representan el concepto y que saben cómo hacer las cosas por sí mismos .

A diferencia del código de procedimiento, que puede pedir información a otra persona para que pueda tomar una decisión, se le pide a un objeto que haga algo por sí mismo .

Una forma de convertirse en un pensador de objetos es ” ser la pelota “. Imagínate a ti mismo como el concepto, y pregunta qué sé , qué hago y con quién interactúo .

Por ejemplo, como una pelota , podría saber mi tamaño y mi peso , podría saber cómo (hacer) rebotar, rodar o desinflar y, dependiendo del problema, podría interactuar con otros objetos, como un niño .

Esto puede ayudar con lo que debería ser una pregunta fácil, pero que impresiona a muchos. Si un niño rebota la pelota, ¿qué objeto tiene el método de rebote ? ¿El niño o la pelota? Esperemos que ahora puedas contestar correctamente… la pelota .

Una regla que representa donde colocar el método es …

“Una acción en un objeto del mundo real, se convierte en un método en el objeto sobre el que se actúa, en código orientado a objetos”.

Cómo modelar conceptos en un problema en código orientado a objetos

Hay un pequeño número de formas de representar y modelar conceptos de dominio de problemas en código. Cualquier dominio de problema consiste en personas, lugares y cosas, que generalmente se unen mediante acciones grabadas.

Cada uno de estos conceptos se puede representar en un modelo y código usando unos pocos patrones. No puedo describirlo todo aquí, pero tal vez un punto de partida sea saber que las Acciones grabadas son el pegamento que une las otras piezas de un dominio. Son las cosas que necesita registrar por razones comerciales o legales, como facturas, pedidos, cancelaciones, reservas, solicitudes o incluso rebotes. Siempre han sido clave, incluso antes de los sistemas informáticos. La actividad comercial siempre se ha basado en formularios, entradas de libro de día y entradas de libro mayor correspondientes a las Acciones registradas en el dominio de su computadora. De hecho, podría decirse que la escritura humana se inventó para registrar transacciones agrícolas hace 8-12,000 años. Estas son las mismas cosas para las que es mejor que tenga formularios en papel para que su negocio pueda continuar si falla la alimentación.

Así, a modo de ejemplo, hacer que la acción de rebote de la pelota mencionada anteriormente en una Acción grabada, simplemente represente el rebote de pelota como un objeto separado, creado por el método de rebote existente que tenemos en la pelota.

Agregue un objeto que represente la interacción humana como una ventana, y pídale que llame a ese método de rebote en la bola, y tendrá un sistema en funcionamiento.

Esto es solo el comienzo, pero espero que sirva para reflexionar.

Ya eres un excelente pensador orientado a objetos.

Todo ser humano es. Porque pensar en “objetos” y cómo se relacionan entre sí encaja perfectamente en nuestra percepción de la realidad. Es por eso que los lenguajes orientados a objetos fueron diseñados en primer lugar, para que se sienta como en casa.

Por ejemplo, tome herencia (una característica que venía con lenguajes orientados a objetos). Nada más ha hecho más daño al desarrollo de software que la herencia. Pero sigue siendo parte de los lenguajes orientados a objetos modernos. ¿Por qué? Porque es natural que los seres humanos piensen en términos de rasgos heredados . Técnicamente, es una pesadilla. Pero es fácil de entender, incluso para personas sin conocimientos técnicos (clientes, gerentes, diseñadores). Esto hace que la comunicación y la cooperación en general sean mucho más baratas. Entonces, en la mayoría de los casos, la orientación a objetos es económicamente superior a otros paradigmas. Simplemente porque todo el mundo es un pensador natural orientado a objetos .

Tuve problemas para pensar “orientado a objetos”. Tenía muchos años de programación imperativa, principalmente en C, y luego, durante muchos años como gerente sénior, no hice ninguna programación, y hace unos cinco años volví a ella.

Al principio, encontré que la programación “orientada a objetos” en C # no era intuitiva. Ni siquiera entiendo muy bien de qué se trata el problema “orientado a objetos”. Personalmente, no creo que haya mejorado el desarrollo de software, pero ese es un tema diferente.

No tuve problemas con JavaScript (aunque algunas cosas al respecto son muy extrañas e inconsistentes), pero encontré que C # era un poco incómodo porque mi pensamiento no fluía de forma natural a las clases y la herencia. Así que me apegué a los patrones de diseño establecidos y pronto comencé a pensar más “orientado a objetos”.

Me ha gustado C #, encontrando que la tipificación fuerte ya no es restrictiva sino útil, y el entorno de Visual Studio es el mejor entorno de desarrollo que he usado (lo sé, la gente de Vi está furiosa), y Linq es elegante y poderoso.

En resumen, pensar “orientado a objetos” es una cuestión de práctica y familiaridad, y podría llevar un poco más de tiempo a los que estamos acostumbrados a algo diferente.

Creo que sufres de un exceso de programación de “lápiz y papel”.

Deja de pensar en el programa y comienza a pensar en lo que representa.

En un primer diseño, el 100% de sus clases representará lo que está implementando. Un cliente, un artículo, lo que sea. Luego, coloque los métodos necesarios en cada uno: el cliente tendrá “Comprar (artículo)” para administrar la venta. El artículo tendrá un método “vendido ()” para administrar el inventario, y así sucesivamente.

Luego, va a la fase de implementación y descubrirá que necesita cambiar algunas cosas, ya que esta fue solo la primera iteración del diseño. Es posible que deba crear una nueva clase (Venta) donde pase el cliente en el constructor, y luego aplique el método de Compra a la venta, y así sucesivamente.

Eso es un refactorio. Es una buena cosa

Además, verás que tienes que cambiar algunas cosas por razones de tecnología o seguridad. Y esas cosas no se suman en absoluto con la lógica de clase. Eso también sucede; Pero eso se hace generalmente al final.

Cuando eres un desarrollador muy, muy bueno y experimentado, puedes hacer esto en un solo paso, o incluso, sobre la marcha.

Afortunadamente para usted, hay un truco fácil para eso: simule que ya ha escrito todas las clases y métodos, y simplemente comience a escribir el código que los usa; lo ideal es que comience a escribir pruebas unitarias, pero para los programas simples solo comience a escribir el “main “método.

Mientras haces eso, apaga las clases y los métodos que aparecen en tu código. Al menos en C #, puede “lanzar la nueva NotImplementedException ()” para evitar que el compilador se queje de que, bueno, aún no tiene una implementación.

Una vez que haya terminado, tendrá la interfaz pública y las clases listas, y podrá comenzar a escribir el código, simplemente complete los espacios en blanco.

TL; DR: Comience a pensar en cómo los va a usar, luego repita, en lugar de intentar crear un programa completo desde el principio.

Hay un conjunto de patrones de diseño reutilizables que pueden utilizar los programas orientados a objetos.

Una vez que esté familiarizado con los patrones, se pueden resolver muchos problemas comunes de programación al usarlos.

Patrones de diseño

Este libro puede ser un buen lugar para comenzar.

Un lugar más sencillo para comenzar es “evitar la herencia, usar la composición”