Soy algo nuevo en la programación (soy ingeniero mecánico de oficio), y estoy desarrollando un pequeño programa durante mi tiempo de inactividad que genera una parte (solidworks) basada en el aporte de varias personas de toda la planta.
Basado en solo unas pocas entradas (6 para ser exactos), necesito hacer cientos de llamadas API que pueden tomar hasta una docena de parámetros cada una; todo generado por un conjunto de reglas que he reunido después de entrevistar a todos los que manejan la parte. La sección de reglas y parámetros de mi código es de 250 líneas y sigue creciendo.
Entonces, ¿cuál es la mejor manera de mantener mi código legible y manejable? ¿Cómo compartimento todos mis números mágicos, todas las reglas, algoritmos y partes procesales del código? ¿Cómo trato con una API muy detallada y granular?
Mi objetivo principal es poder entregar a alguien mi fuente y hacer que entiendan lo que estaba haciendo, sin mi opinión.
fuente
Respuestas:
Según lo que describa, es probable que desee explorar el maravilloso mundo de las bases de datos. Parece que muchos de los números mágicos que usted describe, especialmente si dependen en parte, son realmente datos, no códigos. Tendrá mucha mejor suerte y le resultará mucho más fácil extender la aplicación a largo plazo, si puede clasificar cómo se relacionan los datos con las partes y definir una estructura de base de datos para ello.
Tenga en cuenta que las "bases de datos" no necesariamente significan MySQL o MS-SQL. La forma en que almacene los datos dependerá mucho de cómo se use el programa, cómo lo escriba, etc. Puede significar una base de datos de tipo SQL, o simplemente puede significar un archivo de texto formateado.
fuente
A menos que anticipe extender esto a varias partes, aún no me gustaría agregar una base de datos. Tener una base de datos significa un montón de cosas que aprender para ti y más cosas que instalar para que funcione para otras personas. Agregar una base de datos incrustada mantiene el archivo ejecutable final portátil, pero alguien con su código fuente ahora tiene una cosa más para comenzar a trabajar.
Creo que una lista de constantes claramente nombradas y funciones de implementación de reglas ayudará mucho. Si le da a todo nombres naturales y se enfoca en técnicas de programación alfabetizadas , debería poder hacer un programa legible.
Idealmente, terminarás con un código que dice:
Dependiendo de cuán locales sean las constantes, me vería tentado a declararlas en las funciones en las que se usan cuando sea posible. Es bastante útil convertir:
dentro
Eso le proporciona en gran medida un código autodocumentado y también alienta a cualquier persona que modifique el código a dar nombres igualmente significativos a lo que agregan. Comenzar local también facilita el manejo del número total de constantes que acumulará. Se vuelve un poco molesto si tiene que seguir desplazándose por una larga lista de constantes para asegurarse de que el valor sea el que desea.
Un consejo para los nombres: ponga la palabra más importante a la izquierda. Puede que no se lea tan bien, pero hace que encontrar las cosas sea más fácil. La mayoría de las veces estás mirando un sumidero y te preguntas sobre el perno, no miras un perno y te preguntas dónde está, así que llámalo SumpBoltThreadPitch, no BoltThreadPitchSump. Luego ordena la lista de constantes. Más tarde, para extraer todos los tonos de hilo, puede obtener la lista en un editor de texto y usar la función de búsqueda, o usar una herramienta como grep para devolver solo las líneas que contienen "ThreadPitch".
fuente
.CreateLine(m_trunion_support_spacing / 2, -((m_flask_length / 2) + m_sand_ledge_width + m_wall_thickness), -m_flange_thickness, m_trunion_support_spacing / 2, -((m_flask_length / 2) + m_sand_ledge_width + m_wall_thickness), -m_flask_height + m_flange_thickness)
createGroove(length, depth)
. Debe implementar funciones que describan lo que desea lograr como lo describiría a un ingeniero mecánico. De eso se trata la programación alfabetizada.Creo que su pregunta se reduce a: ¿cómo estructuro un cálculo? Tenga en cuenta que desea administrar "un conjunto de reglas", que son códigos, y "un conjunto de números mágicos", que son datos. (Puede verlos como "datos incrustados en su código", pero de todos modos son datos).
Además, hacer que su código sea "comprensible para otros" es, de hecho, el objetivo general de todos los paradigmas de programación (consulte, por ejemplo, " Patrones de implementación " de Kent Beck, o " Código limpio " de Robert C. Martin para autores sobre software que declaran el mismo objetivo como tú, para cualquier programa).
Todas las sugerencias en estos libros se aplicarían a su pregunta. Permítanme extraer algunos consejos específicos para "números mágicos" y "conjuntos de reglas":
Use constantes con nombre y enumeraciones para reemplazar los números mágicos
Ejemplo de constantes :
debe reemplazarse con una constante con nombre para que ningún cambio posterior pueda introducir un error tipográfico y romper su código, por ejemplo, cambiando el primero
0.625
pero no el segundo.Ejemplo de enumeraciones :
Las enumeraciones pueden ayudarlo a reunir datos que pertenecen juntos. Si está utilizando Java, recuerde que las enumeraciones son objetos; sus elementos pueden contener datos, y puede definir métodos que devuelvan todos los elementos o verificar alguna propiedad. Aquí se usa una Enum para construir otra Enum:
La ventaja es que ahora nadie puede definir erróneamente un EnginePart que no esté hecho de acero o carbono, y nadie puede introducir un EnginePart llamado "asdfasdf", como sería el caso si se tratara de una cadena que se verificaría en el contenido.
El patrón de estrategia y el patrón de método Factory describen cómo encapsular "reglas" y pasarlas a otro objeto que las use (en el caso del patrón Factory, el uso es construir algo; en el caso del patrón Strategy, el el uso es lo que quieras).
Ejemplo de patrón de método de fábrica :
Imagine que tiene dos tipos de motores: uno donde cada parte tiene que estar conectada al Compresor, y uno donde cada parte puede conectarse libremente a cualquier otra parte. Adaptado de Wikipedia
Y luego en otra clase:
La parte interesante es: ahora su constructor de la línea de ensamblaje está separado del tipo de motor que maneja. Tal vez los
addEngine
métodos están llamando a una API remota ...Ejemplo de patrón de estrategia :
El patrón de estrategia describe cómo introducir una función en un objeto para cambiar su comportamiento. Imaginemos que a veces desea pulir una pieza, a veces desea pintarla y, de forma predeterminada, desea revisar su calidad. Este es un ejemplo de Python, adaptado de Stack Overflow
Puede ampliar esto para mantener una lista de acciones que desea realizar y luego llamarlas a su vez desde el
execute
método. Tal vez esta generalización podría describirse mejor como un patrón de Constructor , pero bueno, no queremos ser exigentes, ¿verdad? :)fuente
Es posible que desee utilizar un motor de reglas. Un motor de reglas le proporciona un DSL (lenguaje específico de dominio) que está diseñado para modelar los criterios necesarios para un determinado resultado de una manera comprensible, como se explica en esta pregunta .
Dependiendo de la implementación del motor de reglas, las reglas pueden incluso cambiarse sin volver a compilar el código. Y debido a que las reglas están escritas en su propio lenguaje simple, los usuarios también pueden cambiarlas.
Si tiene suerte, hay un motor de reglas listo para usar para el lenguaje de programación que está utilizando.
La desventaja es que debes familiarizarte con un motor de reglas que puede ser difícil si eres un principiante en programación.
fuente
Mi solución a este problema es bastante diferente: capas, configuraciones y LOP.
Primero envuelva la API en una capa. Encuentre secuencias de llamadas API que se usan juntas y combínelas en sus propias llamadas API. Eventualmente no debería haber llamadas directas a la API subyacente, solo llamadas a sus contenedores. Las llamadas de contenedor deberían comenzar a parecerse a un mini idioma.
Segundo, implemente un 'administrador de configuraciones'. Esta es una forma de asociar nombres con valores dinámicamente. Algo como esto. Otro mini idioma.
Finalmente, implemente su propio mini lenguaje para expresar diseños (esto es programación orientada al lenguaje). Este lenguaje debe ser comprensible para los ingenieros y diseñadores que contribuyen con las reglas y la configuración. El primer ejemplo de tal producto que viene a la mente es Gnuplot, pero hay muchos otros. Podrías usar Python, aunque personalmente no lo haría.
Entiendo que este es un enfoque complejo, y puede ser excesivo para su problema o requerir habilidades que aún no ha adquirido. Así es como lo haría.
fuente
No estoy seguro de haber recibido la pregunta correctamente, pero parece que debería agrupar las cosas en algunas estructuras. Digamos que si está usando C ++, puede definir cosas como:
Puede instanciar estos al comienzo del programa:
Entonces sus llamadas a la API se verán así (suponiendo que no pueda cambiar la firma):
Si puede cambiar la firma de la API, puede pasar toda la estructura:
También puede agrupar todos los parámetros en un contenedor más grande:
fuente
Me sorprende que nadie más haya mencionado esto ...
Tu dijiste:
Permítanme decir esto, la mayoría de las otras respuestas están en el camino correcto. Definitivamente creo que las bases de datos podrían ayudarte. Pero otra cosa que lo ayudará es hacer comentarios, buenos nombres de variables y una organización / separación adecuada de las preocupaciones.
Todas las otras respuestas tienen una base muy técnica, pero ignoran los fundamentos que la mayoría de los programadores aprenden. Dado que usted es un ingeniero mecánico por profesión, supongo que no está acostumbrado a este estilo de documentación.
Comentar y elegir nombres de variables buenos y concisos ayuda enormemente con la legibilidad. ¿Cuál es más fácil de entender?
O:
Este es un lenguaje bastante independiente. No importa con qué plataforma, IDE, idioma, etc., esté trabajando, la documentación adecuada es la forma más limpia y fácil de asegurarse de que alguien pueda entender su código.
Luego se trata de manejar esos números mágicos y toneladas de preocupaciones, pero creo que el comentario de GrandmasterB lo manejó bastante bien.
fuente