I am trying to understand how to design classes which take an input, do some processing, and return a result.
C'è un principio nel design orientato agli oggetti chiamato "Tell, do not ask"
Ciò significa in genere che dici a un oggetto di cambiare se stesso, non chiedi a un oggetto i dati che poi manipoli altrove.
Quindi, quando pensi a come gestire qualcosa di simile nel design OO, devi continuare a tornare ai tuoi oggetti e quello che loro stessi fanno. In generale non hai un oggetto che prende input da un altro oggetto, perché fai in modo che gli oggetti facciano il lavoro.
Quindi, prendendo il tuo esempio, ci sono una serie di problemi di progettazione immediati che nascono. Stai passando una raccolta di pagine in un oggetto senza nome che le elaborerà. Probabilmente è meglio lasciare che siano le stesse pagine a gestirlo.
Quindi invece di
removeHeaderFooterText(pages)
prova invece
pages.each |page|
page.removeHeaderFooterText
Niente quindi al di fuori dell'oggetto stesso della pagina deve sapere come diamine rimuovere il testo dell'intestazione e del piè di pagina dalla pagina.
Hai i passaggi per raggiungere questo come
getBoundaryBlocks
detectRepeatingBlocks
removeBlocks
Subito un nome salta fuori, "Boundary Blocks". Una pagina ha dei blocchi di confine, quindi non ci dovrebbe essere qualcosa al di fuori dell'oggetto Pagina interessato a ottenere blocchi di confine dalla pagina
class Page
def removeHeaderFooterText
page_blocks.each |block|
if block.repeating_block?
page_blocks.delete(block)
Vedi di avere un oggetto lì dentro di un blocco, che a sua volta sa come determinare se si tratta di un blocco ripetuto o meno. Se è la pagina lo rimuove. La pagina non interessa come il blocco determina se si tratta di un blocco ripetuto o meno.
Questo è solo un breve esempio. Ad essere onesti, non sono aggiornato sulla terminologia del mio documento, quindi potrebbe non corrispondere esattamente a quello che stai cercando di fare.
tl; dr versione
Il punto è che nella progettazione orientata agli oggetti un "algoritmo" non sarà rappresentato come una singola lista di operazioni procedurali da eseguire.
Sarà invece un insieme di interazioni tra oggetti. Come ha detto Adele Goldberg su Smalltalk, uno dei primi linguaggi orientati agli oggetti, "In Smalltalk, tutto accade un po 'altrove"
Non dovrai mai (dovrebbe) avere un elenco di istruzioni procedurali algoritmiche per eseguire un algoritmo. Invece di un certo numero di oggetti interagenti, ognuno con una piccola unità di comportamenti, il lavorare insieme produrrà il risultato dell'algoritmo. Ogni oggetto è un'unità di comportamento autonomo e il sistema raggiunge i suoi obiettivi da ciascuna di queste unità che dice ad altre unità di fare qualcosa.
Il problema, ovviamente, è che richiede un modo molto diverso di pensare a problemi e algoritmi, ed è per questo che spesso le affermazioni sulla progettazione orientata agli oggetti ricadono sulla progettazione procedurale.