Come rompere il modello mentale degli oggetti

1

Ho lavorato con OOP per un po 'ora, ma in ogni progetto grande che mi trovo a iniziare, mi sembra di incontrare lo stesso problema; dove risiede la responsabilità.

Come molti che usano l'OOP su base regolare, diventa naturale iniziare a rompere le cose in nomi, verbi, aggettivi, ecc. Recentemente ho letto un post sul fatto che un oggetto possa o debba contenere qualsiasi informazione di stato, o se dovrebbe essere solo informazioni di stato. Durante questo post, ho visto una risposta che menzionava la macchina per caffè Mark IV di Martin Fowler. Tutti sembravano concordare sul fatto che rompere le cose in quel modo fosse indicativo di un buon design. Il problema che ho è che non lo vedo in quel modo. Per me, sembra indietro in alcune parti. Non lo faccio da quasi quanto alcuni di voi, quindi mi piacerebbe chiedere se c'è qualcosa in cui posso rompere questa abitudine o cosa posso fare per cambiarla.

Un esempio che possiamo considerare è una lampadina. Diciamo che ci sono due casi d'uso, in cui Person vuole accendere la luce e dove Person vuole spegnere la luce. Questo potrebbe essere ridotto a un caso d'uso, dove vogliono toggle della luce, potenzialmente.

Se capisco quell'esempio, la responsabilità di Light di attivazione o disattivazione dovrebbe essere responsabilità dell'oggetto Light , con qualcosa di simile

public interface Light {
    void turnOn();
    void turnOff();
    void toggle();
}

Tuttavia, quando penso a questa situazione, un Light non può spegnersi o accendersi. Ciò accade in risposta ad una sorta di evento o azione. La mia luce della cucina di solito non si accende o si spegne da sola. Non è intelligente. Un Person o Switch può accendere o spegnere una luce; ma un Light non può. Il suo stato è interamente determinato da qualcosa altro. Quindi dove dovrebbe risiedere la responsabilità? Tutti i progetti di cui ho fatto parte, che ho finito per smettere, si sono ridotti a questa domanda. Che tipo di strumenti, mentali o fisici, posso usare per scrivere più codice OO?

Nota: la maggior parte del progetto su cui ho lavorato è stata in Java; è la mia lingua più comoda Questa domanda è però più indipendente dal linguaggio.

    
posta Zymus 11.07.2015 - 05:56
fonte

1 risposta

5

La responsabilità di fare qualcosa dovrebbe risiedere con l'oggetto che modella lo stato che cambia quando lo fai.

Hai ragione che una lampadina non si spegne da sola. Tuttavia, non è quello che chiama un metodo object. Il modello mentale accettato è inviare un messaggio a un oggetto . Nel mondo reale lo fai lanciando il suo interruttore associato. Nel mondo di programmazione, il chiamante richiama un metodo oggetto con parametri. In entrambi gli scenari il bulbo è passivo e altri agiscono su di esso.

Pertanto, bulb.toggle() è il modo preferito di notificare questa azione. Né la persona che preme l'interruttore né l'interruttore stesso sono menzionati perché ciò che ti interessa è lo stato della lampadina (la stanza si oscura), non lo stato dell'interruttore (il contatto è privo di corrente) o lo stato della persona ( leggermente più stanco per lo sforzo?). Lo stato della persona sarebbe rilevante solo se hai scritto un'app per il fitness che monitora l'energia spesa dall'utente. Lo stato del passaggio ... in realtà, non riesco a pensare a uno scenario plausibile in cui vorresti modellarlo.

    
risposta data 11.07.2015 - 08:23
fonte

Leggi altre domande sui tag