Domanda

In uno strumento come Photoshop, esiste una selezione di strumenti su cui è possibile fare clic (ad esempio penna, pennello ecc.). Dopo aver fatto clic su uno strumento, è possibile utilizzare quello strumento per dipingere, cancellare ecc a seconda dello strumento selezionato.

Mi chiedo come sarebbe meglio implementarlo in un progetto OO. Potrei solo pensare di avere un GUIManager che sa sempre quale strumento è selezionato, quindi quando l'area di disegno (area di disegno) rileva un clic del mouse o il trascinamento del mouse, chiede a GUIManager quale strumento è selezionato e applica il suo comportamento.

Qualcuno descrive una possibile soluzione in dettaglio a livello di classe (o in dettaglio se non hai tempo).

È stato utile?

Soluzione

Dai un'occhiata al Pattern di stato che ha esattamente il tuo esempio.

Tuttavia, in realtà non si tratta di una domanda della GUI ma piuttosto di un approccio orientato agli oggetti su come modellare questo problema. La GUI non ci gioca davvero.

Altri suggerimenti

Non sono sicuro che i principi di OO abbiano davvero un ruolo in questo, tranne nel senso che tutti gli elementi grafici sono probabilmente derivati ??da classi base comuni nella tua GUI preferita.

La quantità di complessità in un'applicazione che necessita di una gerarchia di menu su schermo & # 224; la photoshop presumibilmente ridurrebbe la differenza tra composizione vs eredità vs stile funzionale vs qualunque cosa tu voglia.

Anche se, se dovessi essere motivato a scrivere il programma due volte usando stili diversi, potrebbe essere interessante vedere i risultati. La classifica dei vari stili di programmazione è una domanda aperta senza risposte reali a questo punto, sebbene pensiamo che gli stili OO siano importanti in un modo che non abbiamo ancora quantificato completamente.

Un'idea per questo sarebbe quella di avere una classe di strumenti. Sto solo disegnando questo in C ++ - come pseudocodice:

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

Quindi erediti da questa classe di strumenti astratti per fornire gli strumenti concreti necessari alla tua applicazione. Quando viene selezionato un determinato strumento, si crea un'istanza di un oggetto strumento corrispondente e lo si ricorda da qualche parte. La finestra inoltra gli eventi del mouse all'oggetto strumento attualmente attivo, che quindi fa la cosa appropriata per lo strumento che è stato selezionato.

Questa è un'implementazione del modello statale a cui fa riferimento Johannes.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top