A menos que haya hecho el trabajo muchas veces antes, siempre terminará con un código de espagueti. En realidad, en este punto, recién has comenzado: lo que tienes es el borrador de una especificación preliminar. Echa un vistazo a algunos de los otros consejos aquí y haz una reescritura seria. Y luego un poco más de reescritura, y luego ... Personalmente, nunca estoy seguro de si tengo mi código en una forma realmente excelente o simplemente me canso de reescribirlo, pero parece que finalmente lo hago bien.
Aborde el problema desde dos extremos. Intente que el diseño general tenga sentido y elija piezas pequeñas que se encarguen de tareas simples y que sean correctas. Luego, intenta avanzar desde ambos extremos hacia el centro. Y luego trabaje desde el centro hacia los dos extremos. Luego de arriba hacia abajo, luego de abajo hacia arriba. Luego repite todo el proceso.
Esencialmente, lo que tienes es una colección de clases. Considere la clase A. Si la clase A está bien construida, las clases que la usan funcionarán automáticamente mejor, por buenas o malas que sean. Si la clase A usa bien las clases, esas clases usadas harán más, por buenas o malas que sean. Organice sus clases lo mejor que pueda, luego asegúrese de que cada una sea la mejor clase posible.
Es importante hacerlo lo más correcto posible. Un código incorrecto te perseguirá hasta el día que lo tires. Con el software, un poco de pulido extra siempre vale la pena. (A menos que nadie termine usando el código ...)
Para resumir: revisa los consejos reales dados en las otras respuestas, luego reescribe tu código hasta que obtengas algo que te guste.