Niveles de abstracción

«Abstracción» es la acción de simplificar algo hasta lo mas esencial.

Me gusta explicarlo como una especie de google maps pero en lugar de utilizar el zoom dentro y fuera de un mapa del mundo estas explorando un modelo. Al igual que con google maps tenemos varias vistas con diferentes niveles de detalle. Llamamos a estos niveles de abstracción. En el contexto del diseño de un sistema es una herramienta útil. Así que usando google maps como una metáfora que quiero compartir una manera personal para ver los niveles de abstracción en un sistema.

Nivel de abstracción Propósito
10000 pies Vista de todas las acciones que se pueden realizar en el sistema
8000 pies Vista de como un usuario ejecuta las acciones sobre el sistema (Interface de Usuario)
6000 pies Vista de los pasos necesarios para la ejecución de la acción solicitada
4000 pies Vista de los objetos que llevan a la acción solicitada
Suelo Detalles de la implementación de los objetos

Para esta discusión voy a dejar la vista de 8000 pies fuera.

10000 pies

Este nivel puede ser representado de varias maneras. Mi favorito es utilizando un diagrama de caso de uso.

La otra manera que me resulta muy útil es utilizando «features» de BDD.

 Feature: Create Loan
 In order to pay for a necessary item
 As a customer with no cash at hand
 I want to get a loan

Lo bueno de esto es que también expresa el objetivo del usuario.

6000 pies

En este punto de vista nos asomamos dentro de las acciones del sistema (caso de uso). Por lo general, una acción tiene más de un camino de ejecución: la ruta por defecto (esperada) y una o más alternativas. Esta visión puede explorarse mediante un diagrama de actividad.
Este punto de vista también puede ser explorado con el artefacto «scenario» de BDD.

 Scenario: Apply for a loan while having an open loan with a different provider
 Given I already have an account on the site
 And I have an open loan on with a different provider
 When I try to create a new loan
 Then I'll see a message saying "Sorry you can't open a new loan if you already have one open"

Scenario: Apply for a loan with an amount exceding the maximum allowed by the state
 Given I already have an account on the site
 When I try to create a new loan
 And the amount requested exceeds the maximum allowed by the state I live in
 Then I'll see a message saying "Sorry the amount you applied for exceeds the amount allowed by the state"

Scenario: Get a loan
 Given I already have an account on the site
 And I have no open loan
 When I try to create a new loan
 Then the loan will be created

4000 pies

Si la vista de 6000 pies nos permite echar un vistazo en la acción, que nos muestra los varios caminos de ejecución, entonces la vista de 4000 pies nos muestra de que se tratan y la forma en que los objetos de negocio la llevan a cabo. Normalmente utilizo diagramas de interacciones a este nivel.

Como se puede ver este diagrama se enfoca exclusivamente en los objetos de negocio, sus responsabilidades y las interacciones entre ellos con el fin de cumplir con los objetivos de la acción. En este ejemplo en particular estoy incluyendo 2 caminos, como se puede ver pero generalmente tendría uno para cada escenario.
El punto aquí es que estos métodos están vagamente definidos. Aquí es donde entra TDD. Puede crear una prueba declarando el comportamiento esperado y luego codificar ese método en particular, aislando cualquier dependencia exterior.

TDD vs BDD

La razón por la que hice esta tabla fue para explicar a un compañero que TDD y BDD son básicamente lo mismo en un nivel de abstracción diferente.
Así que si creas pruebas antes de escribir cualquier código, si es en el nivel de abstracción de 4000 pies entonces se llama TDD, mientras que si es para cualquier cosa por encima de ese nivel de abstracción, se llama BDD.

Tu que opinas?