Dato che non sei un programmatore professionista, ti consiglio di attenermi alla semplicità. Sarà molto più facile per il programmatore prendere il tuo codice procedurale modularizzato e renderlo OO più tardi, piuttosto che per loro fissare un programma OO scritto male. Se non sei esperto, è possibile creare programmi OO che possono trasformarsi in un disastro empio che non ti aiuterà né a chi ti verrà dopo.
Penso che il tuo primo istinto, il codice "questa cosa-quella cosa" nel primo esempio sia la traccia giusta. È chiaro e ovvio cosa vuoi fare. Non preoccuparti troppo dell'efficienza del codice, la chiarezza è molto più importante.
Se un segmento di codice è troppo lungo, suddividilo in blocchi di dimensioni ridotte, ognuno con la propria funzione. Se è troppo corto, considera di utilizzare meno moduli e di mettere più in fila.
---- Postscript: OO Design Trap
Lavorare con successo con la programmazione OO può essere complicato. Esistono anche alcune persone che considerano il intero modello imperfetto. C'è un ottimo libro che ho usato quando ho iniziato a studiare la programmazione OO chiamato Thinking in Java (ora alla sua 4a edizione) . Lo stesso autore ha un libro corrispondente per C ++. C'è in realtà un'altra domanda sui programmatori che si occupano di problemi comuni nella programmazione orientata agli oggetti .
Alcune insidie sono sofisticate, ma ci sono molti modi per creare problemi in modi molto semplici. Ad esempio, un paio di anni fa c'era uno stagista nella mia azienda che ha scritto la prima versione di alcuni software che ho ereditato e ha creato interfacce per tutto ciò che potrebbe un giorno avere implementazioni multiple. Naturalmente, nel 98% dei casi c'era solo una singola implementazione, quindi il codice è stato caricato con interfacce inutilizzate che hanno reso il debug molto fastidioso perché non è possibile tornare indietro attraverso una chiamata all'interfaccia, quindi si finisce per dover fare una ricerca del testo per l'implementazione (anche se ora uso IntelliJ era una funzionalità "Mostra tutte le implementazioni", ma nel giorno in cui non avevo questo). La regola qui è la stessa della programmazione procedurale: sempre una cosa hardcode. Solo quando hai due o più cose, crea un'astrazione.
Un simile errore di progettazione si può trovare nell'API Java Swing. Utilizzano un modello di sottoscrizione di pubblicazione per il sistema di menu Swing. Ciò rende la creazione e il debug di menu in Swing un incubo completo. L'ironia è che è completamente inutile. Non c'è praticamente mai una situazione in cui più funzioni avrebbero bisogno di "iscriversi" a un clic del menu. Inoltre, pubblicare-iscriversi era un completo errore di attivazione perché normalmente un sistema di menu è sempre in uso. Non è come se le funzioni fossero abbonate e poi cancellate in modo casuale. Il fatto che gli sviluppatori "professionisti" di Sun abbiano commesso uno svarione del genere dimostra semplicemente quanto sia facile per i professionisti fare degli sconvolgenti scoppi nel design OO.
Sono uno sviluppatore molto esperto con decenni di esperienza nella programmazione OO, ma anche io sarei il primo ad ammettere che ci sono tonnellate che non conosco e anche ora sono molto cauto nell'usare un sacco di OO. Ascoltavo le lunghe lezioni di un collega che era un fanatico della OO su come fare progetti particolari. Sapeva davvero cosa stava facendo, ma in tutta onestà ho avuto difficoltà a capire i suoi programmi perché avevano modelli di design così sofisticati.