domingo, 8 de diciembre de 2019

Buenas Prácticas

a) “Once and Only once”

El principio Once and Only Once puede considerarse como un subconjunto del principio No te repitas, y es uno de los principios más fundamentales del desarrollo de software. Once and Only Once básicamente establece que cualquier comportamiento dado dentro de una aplicación se define una sola vez. La duplicación del comportamiento es una de las fuentes más comunes de errores en los sistemas de software, ya que cada vez es más probable que los cambios en el comportamiento definidos en una ubicación no se propaguen a todas las ubicaciones donde se define este comportamiento. La eliminación de la duplicación causada por no seguir el principio Once and Only Once es una de las razones principales para la refactorización y también está en el centro de muchos patrones de diseño.

El principio No te repitas (DRY- Don’t Repeat Yourself) establece que la duplicación en la lógica debe eliminarse mediante abstracción y la duplicación en el proceso debe eliminarse mediante la automatización.
La duplicación es desperdicio

Agregar código adicional e innecesario a una base de código aumenta la cantidad de trabajo requerido para extender y mantener el software en el futuro. Ya sea que la duplicación provenga de la programación de copiar y pegar o de una comprensión deficiente de cómo aplicar la abstracción, disminuye la calidad del código. La duplicación en el proceso también es un desperdicio si se puede automatizar. Las pruebas manuales, los procesos de construcción e integración manuales, etc., deben eliminarse siempre que sea posible mediante el uso de la automatización.



b) “Tell, don’t ask”


Hay un gran principio en la programación orientada a objetos que dice: " Tell, Don't Ask".
Este principio dice que no debemos preguntar a los objetos sobre su estado, tomar decisiones y solo entonces decirles qué hacer. Más bien dice que deberíamos enviar comandos directamente y evitar así las preguntas.



Este código está mal implementado, en él se le pregunta a current_user si es administrador y, según la respuesta, decidimos a qué método llamar.

Otra sección mala es que la lógica que decide qué mensaje enviar esta fuera del objeto current_user. Entonces, si queremos mostrar ese mensaje en dos partes distintas, tendremos que repetir la declaración if..else en cada lugar. O si necesitamos cambiar esa lógica en algún momento, también tendremos que hacerlo en todos los demás lugares. Eso rompe la regla No te repitas (DRY – Don’t Repeat Yourself).

Si aplicamos el principio "Tell, Don't Ask", ese código se vería así:


La lógica que verifica si el usuario es administrador debe estar en el método welcome_message.


c) “Program to an interface not to an implementation”

La codificación orientado a interfaces es una técnica para escribir clases basadas en una interfaz; interfaz que define cuál debería ser el comportamiento del objeto. Esto Implica primero la creación una interfaz, definir sus métodos y luego crear la clase real con la implementación. Al principio, parece que puede ser una codificación excesiva, pero hay dos razones principales por las cuales se debe aplicar: Test Driven Development y la flexibilidad que genera.



En el lado de las pruebas, es absolutamente necesario. TDD se basa en crear las pruebas que permitan lograr la funcionalidad, para luego desarrollar el código requerido que pase estas pruebas. Como todavía no hay una implementación del código, es necesario usar Interfaces para simular objetos que cumplan con los casos de prueba; cuando la implementación real está lista, solo es cuestión de sustituir los simulacros e inyectar el objeto real. Si el objeto cumple con la interfaz, sus pruebas se comportarán de la misma manera que los simulacros. También funciona al crear pruebas que dependen del código realizado por otra persona o equipo y aún no tiene el objeto real.

Para la parte de la flexibilidad y el mantenimiento, se puede ver de una forma más sencilla de la siguiente manera:

Piense en las ruedas de su vehículo; tienes las ruedas de aspecto regular que vienen con él cuando lo compraste. Pero después de ir al concesionario, te enamoras de un nuevo juego de ruedas de edición limitada que ofrecen a un precio increíble. Ahora imagine por un segundo que su automóvil y sus ruedas fueron diseñados para trabajar juntos de manera única. Lo único que se podría hacer es; modificar las ruedas para que funcionen con tu auto o ajustar tu auto para que funcione con las ruedas… Afortunadamente, en la realidad las cosas no son así, los fabricantes de automóviles han fabricado vehículos de una manera en la que simplemente usted compra sus ruedas nuevas, las instala y comienza a conducir. 

En este escenario, sus ruedas son una interfaz y las ruedas predeterminadas y las ruedas de edición limitada son solo diferentes tipos de ruedas, pero ambas simplemente "ruedan". No importa las propiedades reales, si su automóvil sabe cómo usar una rueda, su auto viajará.

En este siguiente ejemplo se tienen una interfaz "Hablante" y clases que obtienen el método para hablar pero cada uno en su idioma respectivo.



d) “Favor object composition over class inheritance”

La herencia es cuando diseñas tus Tipos por lo que son, mientras que la composición es cuando diseñas tus Tipos por lo que pueden hacer.

La composición sobre la herencia (o principio de reutilización compuesta) en la programación orientada a objetos (OOP) es el principio donde las clases deben lograr un comportamiento polimórfico y la reutilización del código basándose en su composición (al contener instancias de otras clases que implementan la funcionalidad deseada) en lugar de aplicar una jerarquía de propiedades y métodos usando la herencia de un clase base o principal.

Una implementación de la composición sobre la herencia generalmente comienza con la creación de varias interfaces que representan los comportamientos que el sistema debe exhibir, las clases implementan las interfaces identificadas según sea necesario y por lo tanto, los comportamientos del sistema se realizan sin herencia.


Favorecer la composición sobre la herencia es un principio de diseño que le da al diseño de código una mayor flexibilidad. Es más natural construir clases a partir de varios componentes que tratar de encontrar puntos en común entre ellas y crear un árbol genealógico. Por ejemplo, un pedal acelerador y un volante comparten muy pocos rasgos comunes, sin embargo, ambos son componentes vitales en un automóvil. Lo que pueden hacer y cómo se pueden utilizar para beneficiar al automóvil se define fácilmente, y esto lo utiliza la composición para desarrollar las relaciones entre las clases.

El diseño inicial se simplifica identificando los comportamientos de los objetos del sistema en interfaces separadas en lugar de crear una relación jerárquica para distribuir los comportamientos entre las clases a través de la herencia. Este enfoque acomoda más fácilmente los cambios que se puedan requerir en el futuro que de otro modo necesitarían una reestructuración completa de las clases en el modelo de herencia. Además, evita problemas a menudo asociados con cambios relativamente menores realizados en alguna parte de una clase que afecten a todas las demás, un error común en un modelo basado en la herencia que incluye varias generaciones de clases.


e) “Make it work, make it right, make it fast”.

EL PRIMER PASO: HAZLO FUNCIONAR

El primer paso es hacerlo funcionar. Para este paso debe hacer que el código cumpla lo que se supone que debe lograr de la forma en la que usted lo desee sin importar si la solución es fea y desordenada, siempre que funcione. No pierda el tiempo preocupándose si su enfoque es ideal, si su código elegante o sus patrones de diseño son perfectos. Si puede ver múltiples formas de hacer algo, y no está seguro de cuál es el mejor, elija uno y continúe. 

Puedes dejar comentarios sobre ideas de implementación o mejores formas de desarrollar el proceso en alguna libreta o hacer una nota en tu computadora si crees que son lo suficientemente importantes como para volver a visitarlas. De lo contrario, cuando hayas terminado, asegúrate de que funcione y que funcione de forma repetible. Debe tener algún tipo de pruebas automatizadas que demuestren que funciona.

EL SEGUNDO PASO: HAZLO CORRECTO

Una vez que tenga una solución que funcione y una forma económica de garantizar que siga funcionando mientras la modifica, siga los fundamentos de refactorización para mejorar el diseño de su código. Busque las deficiencias de código que pueda mejorar. Siga los principios del software y asegúrate de que sea lo suficientemente bueno para que cuando vuelvas a revisarlo.

Queremos eliminar cualquier dato incrustado directamente, queremos comenzar a pensar en los casos límite y definitivamente necesitamos tener pruebas alrededor del código. Para las pruebas, asegúrese de comentar el código durante el desarrollo y de eliminar código erróneo al ver una prueba fallida. Nunca confíe en una prueba durante esta etapa a menos que vea que falla primero por la razón correcta.
Nuestro código debe ser a prueba de balas al final de la etapa "hazlo correcto". No debemos dudar acerca de presentar este código a un usuario desde el punto de vista que su comportamiento pueda generar un error. Una solución ya en este segundo paso debe estar lista para la producción.

EL TERCER PASO: HAZLO RÁPIDO

Si ya no es lo suficientemente rápido (en términos de rendimiento), ahora es el momento de medir y ajustar el rendimiento de la aplicación. Las características de rendimiento del sistema deben describirse al igual que otros requisitos del sistema, y se debe hacer un esfuerzo para mejorar el rendimiento solo hasta que se cumplan estos requisitos medibles.



En el siguiente video se explica un resumen del contenido de esta sección.

 



27 comentarios:

  1. Hola compañeros, ¿que clase de consecuencia se le puede presentar a los programadores que no utilizan ningunas de estas practicas?

    ResponderBorrar
    Respuestas
    1. Los cuatro primeros principios buscan que se desarrolle un código limpio para así evitar que se presenten problemas mas adelante durante la etapa de desarrollo del software y también cuando se busca realizar un cambio en la aplicación, no aplicarlos desde el comienzo generaría retrasos y mas trabajo ya que habría que hacer un refactorización mayor porque no seria tan sencillo el mantenimiento. El ultimo principio busca dar un orden al desarrollo, seguirlo permite enfocarse en lo importante primero para orientar al programador.

      Borrar
  2. ¿Un código limpio de programación depende totalmente de las buenas prácticas. ?

    ResponderBorrar
    Respuestas
    1. Muchas veces hacemos uso inconsciente de estas practicas, y ellas a su vez, fueron pensadas con el objetivos de minimizar la cantidad de errores y redundancia permitiendo así una código, efectivamente, mucho mas limpio y menos congestionado.

      Borrar
  3. Hola compañero, viendo estas buenas practicas estas pueden ser diferentes o existir otras dependiendo del lenguaje de programación que se esta manejando? ya que existen muchos lenguajes con diferentes sintaxis y paradigmas

    ResponderBorrar
    Respuestas
    1. Generalmente estas practicas si tienen con una vision global, con el objetivo de ser aplicadas en cualquier tipo de lenguajes, sin embargo, cada lenguaje tiende a tener convenciones y patrones que propios de si, por ejemplo, python hace enfasis en usar 4 espacios en lugar de tabulacion (PEP 8) para su indentacion, sin embargo, para efectos practicos ambos son iguales la comunidad python ya ha acordado hacerlo de esta manera por lo que es recomendable adoptar estas practicas para evitar la discrepancia en la implementacion de codigo externo en el propio.

      Borrar
  4. Basándose en su información, es obvio que las buenas prácticas son un conjunto de reglas para mejorar la calidad del software, con el avance de la tecnología en la actualidad, el crecimiento y desarrollo de una empresa es cada día más exigente, mi pregunta sería, ¿cómo recomiendan ustedes hacer uso de las buenas prácticas, es decir, existe un orden en particular que recomienden para su óptimo funcionamiento?

    ResponderBorrar
    Respuestas
    1. Estos principios están hechos para que sean usados desde el principio del desarrollo del software, ya que su objetivo es evitar problemas mas adelante, no hay un orden como tal, si los aplicas desde la primera etapa de desarrollo lograras tener un código mejor estructurado y su mantenimiento sera mas fácil.

      Borrar
  5. Al momento de programar, además de tener en cuenta estas buenas prácticas generales, debemos investigar y aplicar las buenas practicas asociadas con el lenguaje de programación escogido. El uso de estas, no solo representa ventajas individuales, puesto que, al tratar con un equipo de desarrollo, las buenas prácticas permiten que la lectura y compresión del código sea más fluida, agilizando el tiempo de trabajo de todo el equipo.

    ResponderBorrar
  6. Las buenas practicas son lo que distingue a los profesionales de un amateur. Aunque muchos desarrolladores prefieren la velocidad como característica principal para desarrollar, lo primordial seria tener una buena documentación del lenguaje que estamos implementando y cumplir con las buenas practicas para mantener un código limpio. Para terminar voy a citar una frase que refleja lo importante de estos principios "El buen código debe ser como un buen chiste, no necesita comentarios para explicarlo".

    ResponderBorrar
  7. Las buenas Practicas se han convertido en una excelente guía a tomar en cuenta para desarrollar aplicaciones profesionales, ya que nos encontramos en un mundo muy cambiante donde surgen donde cada día surgen nuevos componentes. De acuerdo a la lista que exponen sobre las Buenas practicas mi pregunta es ¿ Pueden recomendar alguna regla o un criterio a tomar en cuenta en el momento de elegir cuales seria las Buenas Practicas que se adapten mejor en una determinada aplicación?

    ResponderBorrar
    Respuestas
    1. Las practicas mas generales se pueden aplicar a cualquier tipo de código ya que son consejos para mejorar el flujo de desarrollo y evitar redundancias, las practicas que hablan de herencia (C y D) se aplican evaluando si el programador las entiende lo suficiente para poder desarrollar su idea usándolas, si no, puede irse usando herencia normalmente pero entendiendo que en un futuro puede encontrar problemas relacionados si llega a necesitar agregar nuevos elementos al árbol jerárquico donde estos no encajen directamente en un segmento de la jerarquía de forma sencilla.

      Borrar
  8. Las buenas prácticas son cada vez más valoradas en el mundo del software, puesto que llevan a desarrollar un proyecto de manera eficaz y controlada, así de esta manera se tendría una estructura funcional, de esta misma forma la escritura de tests se está convirtiendo en un requisito indispensable para todo buen profesional, ya que podemos saber con el uso de estos cuales son los posibles cambios que se deben realizar para tener los resultados correctos y esperados.

    ResponderBorrar
  9. Las buenas prácticas nos permiten crear líneas de códigos más sencillas y entendibles que permiten que su creación y ejecución sea eficaz pero es necesario saber que no siempre estás reglas serán la solución a las dificultades de complejidad que vayamos teniendo a medida de la creación de un nuevo proyecto.

    ResponderBorrar
  10. ¿Existen buenas practicas particulares por lenguaje de programacion?

    ResponderBorrar
    Respuestas
    1. Si existen practicas especificas para lenguajes de programación, pero en esta sección se hablo de buenas practicas en general sin tomar en cuenta el tipo de lenguaje, ademas es muy común que gran variedad de practicas puedan ser usadas en diversos lenguajes.

      Borrar
  11. Con respecto al tercer paso: Hazlo rápido, de qué forma podríamos medir y ajustar el rendimiento de las aplicaciones desarrolladas?

    ResponderBorrar
    Respuestas
    1. El rendimiento lo puedes medir, estudiando el desempeño de tu aplicacion, y a juicio propio determinando cuales son los campos en los que deberia destacar, por lo general es la velocidad con la que realiza la tarea para que fue desarrollada. El ajuste del rendimiento lo puedes realizar aplicando mejores algoritmos a tu codigo, reduciendo el tamaño del mismo, y guiandote por patrones de diseño que permitan optimizarlo al maximo.

      Borrar
  12. El desarrollo de software ha tenido un gran auge ya que cada vez son más las empresas que necesitan de sistemas informáticos para su crecimiento y mejor desempeño de los empleados, sin embargo un software mal desarrollado lo que conlleva son problemas. Aunque el uso de las buenas prácticas es opcional u obligatorio, se hace prácticamente necesario implementarlas para mejorar la calidad del software.

    ResponderBorrar
  13. Uno de los beneficios de las buenas practicas mencionadas es que se pueden implementar en distintos lenguajes y el programador una vez familiarizado con alguna puede hacer implementaciones en sus futuros proyectos sin verse limitado por el lenguaje de programación. porque muchas veces es una desventajas aprender una, para luego ser desechada o que no se le de utilidad.

    ResponderBorrar
  14. Según lo explicado, las buenas prácticas deben aportarnos beneficios, pero puede existir la posibilidad de que en algún momento nos ocasionen problemas?. Por otro lado, las buenas prácticas de las que hablan aquí en su sección puede aplicarse todas a la vez?

    ResponderBorrar
    Respuestas
    1. El objetivo de las buenas practicas en general es evitar que hayan problemas mas adelante, así que no, no creo que causen problemas. Entre las practicas nombradas la mas especificas son las que hablan de herencia, y estas buscan expandir mas la flexibilidad a la hora de poder crear relaciones entre elementos dentro del programa, evitando los problemas que pueden traer la herencia como tal. Con respecto a la segunda pregunta si, todas estas practicas nombradas se pueden implementar a la vez.

      Borrar
  15. Son de gran interés las buenas prácticas aquí expuestas, pero la que más llamó mi atención fue la “Make it work, make it right, make it fast, ya que según lo que entendí, en el primer paso no importa que tan desordenada sea nuestra solución, lo primordial es que nuestro código funcione, esto sin darle importancia a la forma en la que decidamos resolver los problemas que se puedan presentar.

    ResponderBorrar
  16. El desarrollar un software nuevo no es proceso sencillo, dependiendo del tamaño del programa y los problemas que presente el mismo. Considero que hasta para los desarrolladores más expertos sin el conocimiento de estas prácticas pueden llegar a complicársele el trabajo. Por eso es fundamental el conocimiento de las buenas prácticas y así programar con mayor eficiente y tener un código libre de errores.

    ResponderBorrar
  17. Hacerlo funcionar, hacelo bien, hacelo rápido, es un buen camino a seguir, si necesitamos una forma de iniciar y desarrollar aplicaciones tanto simples como complejas de forma rápida y eficiente siguiendo las mejores prácticas.

    ResponderBorrar
  18. Basado en toda la información rexopilada,que buenas prácticas de programación recomendarían para mantener un código limpio?

    ResponderBorrar
    Respuestas
    1. Todas son esenciales para un codigo bien estruturado y optimizado, pero creo que once and only once es la mas predominante, y la que con mas frecuencia se recomienda utilizar

      Borrar