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.
Hola compañeros, ¿que clase de consecuencia se le puede presentar a los programadores que no utilizan ningunas de estas practicas?
ResponderBorrarLos 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¿Un código limpio de programación depende totalmente de las buenas prácticas. ?
ResponderBorrarMuchas 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.
BorrarHola 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
ResponderBorrarGeneralmente 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.
BorrarBasá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?
ResponderBorrarEstos 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.
BorrarAl 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.
ResponderBorrarLas 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".
ResponderBorrarLas 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?
ResponderBorrarLas 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.
BorrarLas 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.
ResponderBorrarLas 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¿Existen buenas practicas particulares por lenguaje de programacion?
ResponderBorrarSi 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.
BorrarCon respecto al tercer paso: Hazlo rápido, de qué forma podríamos medir y ajustar el rendimiento de las aplicaciones desarrolladas?
ResponderBorrarEl 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.
BorrarEl 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.
ResponderBorrarUno 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.
ResponderBorrarSegú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?
ResponderBorrarEl 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.
BorrarSon 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.
ResponderBorrarEl 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.
ResponderBorrarHacerlo 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.
ResponderBorrarBasado en toda la información rexopilada,que buenas prácticas de programación recomendarían para mantener un código limpio?
ResponderBorrarTodas 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