No , un oggetto non deve rappresentare un'entità.
In effetti, direi che quando smetti di pensare agli oggetti come entità fisiche è quando finalmente ottieni i benefici che OOP promette.
Questo non è il miglior esempio, ma il design della caffettiera è probabilmente il punto in cui la luce ha iniziato ad accendersi per me.
Gli oggetti riguardano i messaggi. Riguardano le responsabilità. Non si tratta di automobili, utenti o ordini.
So che insegniamo OO in questo modo, ma dopo alcuni tentativi diventa evidente quanto sia fondamentalmente frustrante capire dove vanno le cose quando provi a fare MVC, MVVM o MVWhatever. O i tuoi modelli diventano ridicolmente gonfi o lo fanno i tuoi controller. Per la navigabilità, è bello sapere che tutto ciò che tocca i veicoli è nel file Vehicle.ext, ma quando la tua applicazione riguarda i veicoli, inevitabilmente finisci con 3000 linee di spaghetti in quel file.
Quando hai un nuovo messaggio da inviare, hai almeno un nuovo oggetto e forse un paio di essi. Quindi, nella tua domanda su un insieme di metodi, direi che potenzialmente stai parlando di un insieme di messaggi. E ognuno potrebbe essere il proprio oggetto, con il proprio lavoro da svolgere. E va bene. Diventerà evidente quando dividerai le cose che le cose davvero, davvero hanno bisogno di stare insieme. E li metti insieme. Ma non lasci immediatamente cadere tutti i metodi in un cassetto vagamente appropriato per comodità, se vuoi goderti OO.
Parliamo di sacchi di funzioni
Un oggetto può essere solo una raccolta di metodi ed essere ancora OO, ma le mie "regole" sono piuttosto rigide.
La raccolta dovrebbe avere una sola responsabilità e quella responsabilità non può essere generica come "Fa roba ai motori". Potrei fare qualcosa come una facciata del livello di servizio, ma sono profondamente consapevole di essere pigro per motivi di navigabilità / scoperta, non perché sto cercando di scrivere il codice OO.
Tutti i metodi dovrebbero essere a un livello coerente di astrazione. Se un metodo recupera oggetti motore e un altro restituisce potenza, probabilmente è troppo distante.
L'oggetto dovrebbe funzionare sullo stesso "tipo" di dati. Questo oggetto fa cose ai motori (start / stop), questo fa cose con lunghezze di manovella, questo gestisce il sequenziamento dell'accensione, questo assume una forma html. Questi dati potrebbero essere campi sull'oggetto e sembrerebbero coesivi.
Generalmente costruisco oggetti di questo tipo quando faccio trasformazioni, composizione o semplicemente non voglio preoccuparmi della mutabilità.
Trovo che concentrarmi sulle responsabilità oggettive mi porti alla coesione. Deve esserci un po 'di coesione per essere un oggetto, ma non c'è bisogno di campi o comportamenti per essere un oggetto. Se stavo costruendo un sistema che richiedesse quei 5 metodi motori, inizierei con 5 diversi oggetti che fanno quelle cose. Quando ho trovato la comunanza, avrei iniziato a fondere le cose insieme o avrei usato oggetti comuni "aiutanti". Questo mi porta a preoccupazioni aperte / chiuse: come posso estrarre questo bit di funzionalità in modo da non dover più modificare quel particolare file ma utilizzarlo ancora dove necessario?
Gli oggetti riguardano i messaggi
I campi contano a malapena un oggetto: ottenere e impostare i registri non cambia il mondo al di fuori del programma. Collaborare con altri oggetti porta a termine il lavoro. Tuttavia, il punto di forza di OO è che possiamo creare astrazioni in modo da non dover pensare a tutti i singoli dettagli contemporaneamente. Le astrazioni che perdono o non hanno senso sono problematiche, quindi pensiamo profondamente (troppo, forse) alla creazione di oggetti che corrispondono ai nostri modelli mentali.
Domanda chiave: perché questi due oggetti devono dialogare?
Pensa all'oggetto come a un organo di una persona: ha uno scopo predefinito e cambia comportamento solo quando riceve un messaggio specifico a cui tiene.
Immagina uno scenario in cui sei nel passaggio pedonale e un'auto sta arrivando velocemente. Come oggetto del cervello, rilevo un fattore di stress. Dico all'ipotalamo di inviare l'ormone che rilascia corticotrofina. La ghiandola pituitaria riceve quel messaggio e rilascia l'ormone corticotrofico surrenale. Le ghiandole surrenali ricevono quel messaggio e creano adrenalina. Quando l'oggetto muscolare riceve quel messaggio di adrenalina, si contrae. Quando il cuore riceve lo stesso messaggio, batte più velocemente. C'è un'intera catena di giocatori coinvolti nell'iniziare il comportamento complesso di correre attraverso la strada ed è i messaggi che contano. L'oggetto cerebrale sa come far sì che l'ipotalamo invii l'allerta, ma non conosce la catena di oggetti che alla fine farà accadere il comportamento. Allo stesso modo il cuore non ha idea da dove provenga l'adrenalina,
Quindi, in questo esempio ( semplificato ), l'oggetto ghiandola surrenale deve solo sapere come prendere ACTH e produrre adrenalina. Non ha bisogno di alcun campo per farlo, eppure mi sembra ancora un oggetto.
Ora, se la nostra applicazione è progettata solo per correre attraverso la strada, potrei non aver bisogno della ghiandola pituitaria e degli oggetti della ghiandola surrenale. Oppure ho solo bisogno di un oggetto ghiandola pituitaria che fa solo una piccola parte di quello che potremmo vedere concettualmente come il "modello di ghiandola pituitaria". Tutti questi concetti esistono come entità concettuali, ma è un software e possiamo creare AdrenalineSender o MuscleContractor o qualsiasi altra cosa e non preoccuparci molto della "incompletezza" del nostro modello.