Cuando codifico, codifico estúpido de la A a la Z.
Cuando alguien más lee el código, piensa: “Guau. ¡Eso es muy organizado! ”.
El truco es simple.
- ¿Cuáles son los diferentes tipos de herramientas para desarrolladores?
- ¿Qué tan común es en el software que un gerente venda un producto como se hace cuando no lo es?
- ¿Por qué se usa Eclipse más que NetBeans para el desarrollo de Java?
- ¿Cuáles son los 3 proyectos de código abierto más grandes por esfuerzo total de programación?
- Cómo pasar del desarrollador front-end al arquitecto de software
Imagine que tengo que crear un programa para importar algunos datos en nuestra Base de datos SQL.
Yo escribo esto:
clase DataImporter () { DataImporter (receptor de DataSink) {...} void importData (fuente DataSource, convertidor DataConverter) arroja ImportException () { para (Datos de datos: fuente) { this.db.insert (converter.convert (data)); } } }
Y ahora, puedo continuar y crear mi SQLDataSink, CSVDataSource e IPConverter para importar IP de un archivo CSV a una Base de Datos SQL y mi DataImporter en realidad no se preocupa por estos específicos.
Importador de DataImporter = nuevo DataImporter (nuevo SQLDataSink (...)); Fuente de DataSource = nuevo CSVDataSource (); DataSource source2 = new WSDataSource (); DataConverter csvConv = nuevo IPProviderCSVConverter (); DataConverter xmlConv = new XMLDataConverter (); importador.importData (fuente, csvConv); importador.importData (fuente, xmlConv);
Pero, de hecho, estas 7 líneas no aparecerían en mi código. Al impulsar las dependencias (inyección de dependencia / IOC), puedo crear un archivo de configuración como:
importar: objetivo: MySQLDataSink: anfitrión: ... fuente: csv: "ip.csv" convertidor: - maxMindCSV
Si me pide que lo modifique para importar IP de una imagen a través de OCR, agregaré una pequeña clase (o algunas de ellas para manejar el propio OCR, etc.) sin cambiar una línea en la base de código existente. ¿Quieres tener alguna alternativa? ¿Los han importado de una lista de archivos? No hay grandes, solo algunas clases para agregar. ¿El campo no está en el mismo lugar y no tiene el mismo formato? Agregaré un convertidor. Luego, actualizaré el archivo de configuración. Si evoluciona, crearé una interfaz para tener una vista visual del archivo de configuración.
Otra ventaja: ¡no es necesario volver a compilar si está ajustando la configuración! (De hecho, el archivo YAML simplemente describe el gráfico del objeto ^^)
Y este método tiene estas ventajas:
- Más fácil de entender
- Código corto
- Problemas pospuestos para enfocarse en el asunto real (de manera recursiva)
- Divide y vencerás de forma natural
- Autocontenido
- Altamente reutilizable
- Las dependencias pueden cambiarse e intercambiarse sin buscarlas
- Una brisa para probar
- Las clases más pesadas son alrededor de 30 líneas. (clases en negrita ya que la gente pensará “método”)
- Fácil de aislar una clase y proporcionarle dependencias “simuladas”. (¡EasyMock, Mockito, etc. son menos necesarios!)
- Se presta a
- composición
- decoración
Y en serio, la gente se pregunta cómo sé que necesitaré X e Y. ¡No lo hago! Solo asumo que tengo todo lo que necesito donde estoy ocupado en este momento. Y hago eso por cada parte.
¡Las piezas son tan pequeñas que las pruebas unitarias son en sí mismas bastante ridículas!
Por otro lado, el desarrollador basura creará un método como:
/ ** Actualice el artículo del carrito si el usuario tiene más de 21 años, de lo contrario, redirija al aviso parental a menos que se haya establecido un indicador en "foo.properties". Si alguno de estos falla, reenvíe a su método hermano. * / void setUserProperties (forceMinorCheck, capitalizeName, validateGender, shoulderdupdateDb, extra []) { // Realiza llamadas a muchas partes del sistema // Puntos de bonificación por cada "nuevo" // Llamadas a métodos estáticos // Y el estado de conservación que obliga a la persona que llama a saber en qué orden llamar al método de la clase de propietario. }
Y ese método analiza (Sí, el análisis es la palabra correcta). Parámetros para saber qué hacer, mantener algún caso interno para hacer otro procesamiento cuando se llama de nuevo. Por lo general, son alrededor de 200 líneas de estructura de control altamente anidadas. Y tiene un nombre muy descriptivo.
El comentario describe ampliamente lo que el método está tratando de lograr, pero incluso no lo logra. También se refiere a cosas que no se envían, como un método hermano, ya que la clase tenía solo dos métodos y ahora es el afortunado titular de 40 de ellos (cada uno grabando en varias partes no relacionadas del sistema Y duplicando cargas de código).
FYI: Soy un ingeniero de calidad a quien se le paga para que revise el código. También hago refactores para disminuir las deudas técnicas. Describo el código tal como lo veo. ¡Ni siquiera exagerando!
Parece que malinterpreto algunos comentarios aquí. ¡Disculpas si hago lo mismo con tu!