Reificando el comportamiento - Utilizar una interfaz o una clase abstracta #507
-
Hola! Leyendo el apunte sobre cosificacion del comportamiento me resultó super claro el ejemplo expuesto pero me entro una duda con respecto a esta parte en particular: |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 2 replies
-
Hola @LautaroMelchiori ! Es cuestionable porque no hay ninguna razón para pensar que todas las operaciones diferibles sobre la cuenta vayan a tener tarjeta y monto como parámetros. Podes tener una operación "transferenciaProgramada" que tenga un monto y a otra cuenta. Y entonces qué haces? Definis 3 atributos en la clase padre ("tarjeta", "monto" y ahora "cuenta"?) Vas a tener atributos que no todas las subclases usan. Y fundamentalmente siempre recuerden la máxima de oro: las clases nacen para reutilizar comportamiento. Y las clases abstractas nacen para reutilizar comportamiento entre las clases hijas. Gastarte el mecanismo de herencia (que es un arma de un solo tiro) solo para reutilizar un par de definiciones de atributos es, per se, cuestionable, más allá de este ejemplo concreto. |
Beta Was this translation helpful? Give feedback.
-
Hola! Tal vez al ver el diagrama se vuelve más evidente por qué este no es el mejor enfoque. Con la clase abstracta obligas a que todas las futuras solicitudes tengan como atributo la tarjeta y el monto, aunque no los necesite. Esto es un ejemplo de code smell "divergent change", mencionado en la guía de refactoring (https://docs.google.com/document/d/1cAje0qwy3Cus_ob0r-tatbcT01sDFeLt3MmSVmLeSxk/edit?usp=sharing). Este code smell pasa cuando en 1 clase tenemos atributos o métodos para solucionar distintas responsabilidades, que no están relacionadas entre sí. O sea, hacemos que nuestra clase sea poco cohesiva. Lo que sí podríamos hacer, es una clase abstracta para las solicitudes que requieran como atributos una tarjeta y un monto. Esta clase implementaría la interfaz solicitud, de modo que las futuras solicitudes de transacciones, puedan heredar de esta. |
Beta Was this translation helpful? Give feedback.
Hola @LautaroMelchiori !
Es cuestionable porque no hay ninguna razón para pensar que todas las operaciones diferibles sobre la cuenta vayan a tener tarjeta y monto como parámetros. Podes tener una operación "transferenciaProgramada" que tenga un monto y a otra cuenta. Y entonces qué haces? Definis 3 atributos en la clase padre ("tarjeta", "monto" y ahora "cuenta"?) Vas a tener atributos que no todas las subclases usan. Y fundamentalmente siempre recuerden la máxima de oro: las clases nacen para reutilizar comportamiento. Y las clases abstractas nacen para reutilizar comportamiento entre las clases hijas. Gastarte el mecanismo de herencia (que es un arma de un solo tiro) solo para reutiliz…