OOP - Come gestire più istanze di una classe

4

Nella programmazione OO, qual è il modo preferito di gestire più istanze (oggetti) di una singola classe? Supponi di voler scrivere un programma in cui un numero casuale di cerchi viene disegnato sullo schermo, dove ogni cerchio è un'istanza di una classe Circle e quando fai clic su un pulsante, ogni cerchio cambia colore.

Come faresti?

Vedo due modi: utilizzare una variabile statica (array) nella classe che contiene tutte le istanze, insieme a una funzione statica che scorre in quella matrice e chiama un metodo di ricolorazione su ciascuna istanza. O per usare la stessa variabile e metodo, ma invece metterlo in una classe separata, magari chiamata CircleManager.

    
posta Lars C. Magnusson 07.01.2012 - 14:23
fonte

4 risposte

5

Fondamentalmente la direzione dei tuoi pensieri è corretta. Vorrei generalizzare l'array a una collezione , di cui l'array è solo uno. Esistono molti tipi diversi: elenchi, mappe, set ecc. Da scegliere in base alle proprie esigenze.

La raccolta può essere mantenuta all'interno di un altro oggetto di classe, se lo si desidera. Questa è una domanda di design, a cui è difficile rispondere senza ulteriori dettagli, incluso il linguaggio di programmazione che si sta utilizzando. In alcune lingue, tutto è all'interno di una classe, quindi non hai scelta in questo senso. In altri (come in C ++).

Tipicamente nei moderni framework GUI, facendo clic su un pulsante si genera un evento , che viene poi gestito da qualche entità registrata per ricevere notifiche su quel tipo di evento. Puoi scegliere di registrare un singolo oggetto controller (CircleManager se lo desideri), che quindi scorre attraverso ogni cerchio e cambia il loro colore. Oppure puoi registrare ogni singolo Cerchio come ascoltatore per il clic del pulsante, in modo che ognuno venga informato a sua volta e cambi il suo colore in modo indipendente.

    
risposta data 07.01.2012 - 14:53
fonte
2

Suggerirei di esaminare i sistemi di eventi di pubblicazione e sottoscrizione, come i segnali Qt e il sistema di slot.

Usando questo sistema ogni oggetto grafico pubblicherebbe un segnale di evento click, e qualsiasi altro oggetto interessato potrebbe iscriversi a quell'evento, e quindi reagire al segnale.

La tua grafica potrebbe anche iscriversi a un evento 'set color' e reagire di conseguenza quando quell'evento è stato pubblicato da un altro oggetto.

    
risposta data 07.01.2012 - 17:15
fonte
1

Dato che questa è una domanda piuttosto ampia, proverei a rispondere in un contesto generale e poi con l'esempio del cerchio che hai menzionato

Spiegazione generale

Se crei più istanze della tua classe e vuoi che le istanze comunichino tra loro, il loro ciclo come collezione sarebbe l'ideale, come sottolineato da Peter Torok. Leggi la documentazione della lingua per implementarla in quanto potrebbe variare in tutte le lingue. Questo è OK nel caso in cui tutte le istanze vengano chiamate da un singolo programma o siano eseguite in totale. Non è consigliabile memorizzare i dati all'interno delle classi come variabili statiche in quanto ciò renderebbe la classe piuttosto rigida da modificare in futuro.

Ma nel caso in cui desideri creare più istanze della tua classe e più raccolte delle istanze della tua classe, allora diventerebbe complicato dato che hai bisogno di scambiare informazioni tra le classi e se le classi sono statefule, allora ci vorrebbe del vero lavoro

Esempio di cerchie

In questo caso, puoi avvolgere la tua classe con un'altra classe che disegnerebbe un numero specificato di cerchi e un'azione di clic (presupponendo componenti generali della GUI) che ridisegnerebbe le cerchie.

class CircleWrapper(number):
   constructor creates the required number of circles by calling the circle class with draw method
   click event that calls the recolor method on each of the circles

class circle ():
  draw
  recolor

CircleWrapper (10) crea 10 cerchi. Facendo clic sulla GUI si richiama il metodo recolor. I metodi wrapper non vengono forniti in dettaglio nell'esempio sopra. Sebbene ciò implichi una chiamata in più, è più semplice estendere il modello e aggiungere modifiche e convalide in fase di esecuzione.

    
risposta data 07.01.2012 - 15:39
fonte
0

Ascoltare la tua descrizione mi fa venir voglia di avere 3 classi.

una classe per un cerchio una classe per il contenitore del cerchio (ad esempio, Cerchie);) una classe per la logica dell'applicazione

La classe Cerchia tiene e recupera diverse cerchie con cui interagire. Un'istanza di esso potrebbe essere parte della classe dell'applicazione.

Questo è informato dal Principio di Responsabilità Unica: Circle è responsabile dello stato di possesso di un singolo Cerchio, non di più Cerchie. Circles è semplicemente responsabile della conservazione della collezione di cerchi. L'applicazione può quindi avere una logica che lega l'interfaccia utente ai dati del cerchio o qualsiasi altra cosa diavolo devi fare.

Come aggiungi cose a questo (per esempio, se vuoi che qualcuno interagisca con i cerchi usando il loro mouse?) allora avrai ovviamente bisogno di sviluppare un modello di oggetti più complesso.

Raccomando vivamente di approfondire i principi SOLID OOP e di esaminare cose come "Dillo, non chiedere" ecc.

    
risposta data 07.01.2012 - 21:26
fonte

Leggi altre domande sui tag