Va a depender bastante del tamaño del codigo.
Creo que la ayuda mas basica es:
- tratar de no crear funciones extremadamente largas, absolutamente NO
- usar la identacion correcta,
- usar nombres bien descriptivos de variables/funciones por mas que te tome 10 seg mas por cada variable, nada de esos nombres: i , ii, iii, iiii o por ejemplo el valor de un sensor de iluminacion: vseil, en el que podrias haber puesto SensorIluminacionValor y saber claramente de que se trata incluso para alguien de afuera,
- usar mas archivos cuando se necesario, no es nada lindo un solo archivo con 90381098139081903829031209 lineas.
- Tener una "norma" de donde ubicar las cosas, ejemplo primero todos los includes, luego las variables, luego prototipos de ser necesario, luego funciones. Las definiciones en las cabeceras, etc
- aprender a separar las funciones creando "capas" o "niveles" en el que estos no se modifiquen continuamente.
Un ejemplo sencillo, imaginate un LCD 2x16 y queres hacer una libreria. Algo correcto seria tener como minimo 2 archivos de funciones.
1 archivo de port, en este archivo se modifican los puertos etc, supongamos que tenes que poner el pin CS a 0 y esta en en el RA0, aca harias tu funcion que haga: PORTAbits.RA0 = 0; o output_low(PIN_A0); como sea el compilador.
1 archivo con las funciones del LCD, en este caso cuando alguna funcion por ejemplo de escribir un puerto necesite activar el CS, va a llamar a la funcion anterior. Pero JAMAS vas a encontrar una modificacion de un bit aca.
De esta forma si tenes que cambiar de micro, solo modificas el archivo de port para ese micro y funciona como antes, y sin tocar tu archivo con las funciones del LCD las cuales son "independientes" del micro que uses. Obviamente luego puede haber mas archivos, etc.
- La Documentacion (comentarios) es SUPER importante, hay muchas funciones que creo que el encabezado con la explicacion + ejemplo de la funcion es mas grande que la funcion misma.
Y si, debe haber un diseño / boceto / idea de como va a ser el programa/funcion a realizar, de que va a tener que hacer, cada parte que funcion debe cumplir, que parametros deberia aceptar, etc y luego tratar de integrar todo, pero pienso que cada parte deberia ser "independiente" de la otra, es decir podes probar una parte sin necesidad que la otra este en funcionamiento.
PD: Esto es lo que me parece a mi. Alguien con experiencia en informatica y programacion seguro que tendra mas idea que yo al haber realizado infinidad de lineas de codigo.