Empecé a programar en 2016, hace ya 5 años. Desde entonces, aprendí mucho, y a un ritmo acelerado desde que estoy en Etermax. De alguna forma, este articulo apunta al Lautaro de 19 años qué desconocía el basto mundo de la programación y sobre qué podía estudiar.
Si no reconoces alguno de estos términos, me parece que está bueno que al menos los conozcas. Incluso si se puede dar el paso de investigar más y aprenderlo mejor. Personalmente, siempre trabajo respetando estos conceptos.
Clean Code
Patrones de diseño
- ¿Hay problemas de performance a la hora de crear/instanciar muchos objetos? Usar un Pool Object.
- ¿Tenemos que implementar distintos tipos de comportamientos, que incluso podrían agregarse en el futuro? Usar Strategy.
- ¿Quiero tener muchos elementos que tengan los mismos datos pero sin que me explote la RAM? Usar un Flyweight
SOLID
- S. Single Responsability Principle. Un objeto debería tener solo una responsabilidad. Yo solo tendría que tocar o buscar una clase por una sola razón.
- O. Open/Closed Principle. Las clases deberían estar abiertas para su extensión pero cerradas para su modificación.
- L. Liskov Substitution Principle. Cada subclase o derivada de una clase debería poder ser sustituida por la clase padre sin problemas.
- I. Interface Segregation Principle. Un cliente nunca debería ser forzado a implementar una interface que no va a usar, o depender de métodos que no usan. En otras palabras, segregar interfaces. Muchas interfaces cliente específicas son mejores que una interfaz de propósito general
- D. Dependency Inversion Principle. Depender de abstracciones, no depender de implementaciones. Aplicar la inyección de dependencias.
Ya haré otra entrada profundizando en los principios de SOLID, pero por lo pronto sirve para investigarlo.
Test Driven Design (TDD)
- Código por tests. Al programar solo en base a lo que el test requiera, uno podría decir que cada función, variable y línea sirve un propósito y pasó por una visión de refactor.
- Gran cobertura. Imaginemos cada funcionalidad de nuestro proyecto como si tuviese un caso de prueba y un checklist para ver si se cumplió correctamente. Imaginemos hacer un cambio a gran escala y tener una manera de corroborar rápidamente que no hay problemas. La cobertura con test de TDD nos ayuda muchísimo en esto.
- Documentación. No es algo extraño encontrarme necesitando entender una porción de código o necesitando copiar una funcionalidad como base y que un test ya hecho me salve el día. Si un test está bien escrito y redactado es simple de entender: "Si pasa X teniendo en cuenta Y obtengo el resultado Z".
Domain Driven Design (DDD)
- Entidades. Representan un objeto único en el proyecto. Ejemplo, la clase "User".
- Value Objects. Representan un valor complejo. Ejemplo, un struct "Money", que sería la moneda del negocio por ejemplo.
- Bounded Context. Tener bien definido y delimitados los contextos. No debería ser lo mismo ni estar entremezclados código entre la selección de ropa de una página web con su sistema de compras.
- Servicios. Representan clases que se encargan de comportamiento más complejo que las entidades sería raro que manejasen.
- Repositorios. Un lugar en donde guardar y obtener entidades.
- Patterns, Principles, And Practices Of Domain-driven Design de Scott Millett y Nick Tune. En cuanto a conceptos y contenido está perfecto, pero es muy denso y está muy mal redactado a veces.
- Domain Driven Design Quickly de Eric Evans con otros autores. Este libro lo recomiendo fuertemente antes que el otro, porque lo explica más sencillo y sin ser tan complicado. Incluso como libro auxiliar ayuda mucho.