Gran pregunta Esto es realmente un problema sorprendentemente común, y es equivalente a preguntar, “¿Cómo diseño e implemento una API?” para una determinada clase de plataformas de programación (que dependen de las bibliotecas). Pienso en este tipo de programación como una interacción entre tres niveles:
- Función
- Diseño
- Implementación
Es decir, comienzas con una idea de lo que quieres que haga , p. Ej.
- “Quiero poder ver una recopilación de datos que tiene fechas como una serie de tiempo”. o
- “Quiero poder tratar un flujo RSS como si fuera una colección de objetos de documento de solo lectura”. o
- “Quiero poder hacer cosas interesantes con los calibres de municiones para armas de mano”.
Cualquier cosa en realidad. Luego comienzas a escribir (en pseudocódigo … o Python, porque es muy fácil de escribir) código que asume que has terminado: “Veamos, si pudiera tratar esta colección de datos como una serie de tiempo, me gustaría ser capaz de decirle de qué tamaño son los contenedores … “En poco tiempo tendrás el comienzo de una lista de cosas que quieres poder preguntar. Lo siguiente es donde sucede la magia: solo comienzas a escribir las cosas de las que has estado dependiendo, así que comienzas a escribir
- ¿Cuáles son ejemplos de excelentes carteras para desarrolladores web e ingenieros de software?
- ¿Crees que los ingenieros de software del pasado tuvieron que ser un poco más inteligentes que los de hoy?
- Soy ingeniero de software, pero ahora tengo una cuenta de GitHub y no tengo nada que poner. ¿Qué cosas puedo desarrollar para mostrar mis habilidades de codificación?
- ¿Cómo se ve el código de clase mundial?
- ¿Cuál es la diferencia entre un vicepresidente de ingeniería y un ingeniero de software principal?
vacío setUnit (…
y piensas, “Hmm. Entonces, ¿qué es una unidad?” e inventas una enumeración o decides usar un int o lo que sea que funcione …
void setUnit (unsigned int aUnit)
{
…
y debe decidir dónde se almacena la unidad. ¿Será esto una clase? Una estructura? ¿Necesitamos que sea persistente y lo guarde en una base de datos o algo así?
El segundo principio principal es: todo devuelve un error. Por lo tanto, cada función que devuelve un estado booleano devuelve “falso”. Todo lo que devuelve un puntero devuelve NULL (o None o lo que tu plataforma quiera que uses para “nada que ver aquí, amigos”). Esto significará que, para algunas cosas, debe inventar un estado de error:
Unidad unidad ()
{
return InvalidUnit;
}
Después de una o dos iteraciones que van y vienen entre la función y el diseño, una pequeña decisión a la vez, terminas con un conjunto de funciones que, si se implementaran, harían más o menos lo que comenzaste a lograr. Una vez que tiene un conjunto relativamente completo de funcionalidades esbozadas en la API (el nivel de “diseño” anterior), escribe una prueba unitaria que lo llama todo. Obviamente, la prueba unitaria fallará espectacularmente, porque aún no ha hecho nada. Entonces, el siguiente paso es completar las implementaciones reales hasta que pasen las pruebas unitarias. Funciona algo como esto:
El primer boceto funcional le brinda suficiente para hacer un boceto de diseño. El diseño deja en claro que su idea de lo que se supone que debe hacer (función) necesita un ajuste, por lo que debe hacer el ajuste, luego reflejarlo en el diseño, y así sucesivamente. En cada paso, dejas que lo que acabas de hacer informe lo que haces a continuación.