Dovrei creare lo stack di annullamento nel modello o nel relativo wrapper?

7

Sto costruendo un'applicazione (Python / PyQt). L'articolo del primo ordine sarà una vista ad albero / modello con molte funzioni di supporto per aggiungere nuovi elementi, spostarli nell'albero, ecc. Quindi avrò un oggetto finestra principale che servirà fondamentalmente da wrapper per l'albero. Questa finestra principale ha una barra degli strumenti con pulsanti che consentono all'utente di aggiungere / rimuovere / spostare elementi (questi pulsanti chiamano i metodi di supporto incorporati nell'oggetto tree).

È quasi finito, ma ahimè, ho deciso di aggiungere la funzionalità di annullamento / ripetizione usando il quadro di annullamento di Qt . È la prima volta che utilizzo la funzionalità di annullamento / ripristino e sono curioso di sapere se esiste un consenso / esperienza sull'implementazione dello stack di annullamento nel wrapper della finestra principale o sui dettagli all'interno della classe dell'albero. Posso vedere andare in entrambi i modi.

Inizialmente ho inserito la funzionalità di stack di annullamento nel wrapper, così ho potuto mantenere il mio albero più semplice, e stavo pensando che annulla / ripeti sia in gran parte una sorta di semplice wrapper stesso, non qualcosa che volevo includere nella funzionalità del albero stesso.

Come ho iniziato, però, mi sono reso conto che mi sembrava di rompere la modularità e, a causa del modo in cui queste classi di annullamento sono implementate (sono piuttosto complicate e si inseriscono nell'interno del modello ad albero), cominciava a sentirsi come Stavo facendo in modo che il wrapper si occupasse di troppi dettagli su come l'albero è implementato. Ciò vanifica lo scopo di un semplice wrapper.

Quindi ora mi sto adoperando per incorporare lo stack di annullamento, in particolare le classi QUndoCommand , nel modello di albero, che è felice di occuparsi di tutti questi interni. Questo probabilmente semplificherà il wrapper, che è una specie di punto. In altre parole, sto pensando che sono stato ingenuo su quanto fosse complicato aggiungere funzionalità di annullamento / ripetizione. Non è semplice, ma qualcosa su cui il modello stesso dovrebbe davvero lavorare.

Tuttavia, sono completamente nuovo per questo, quindi mi chiedo se sto facendo un errore di progettazione stupido che mi perseguiterà tra due anni quando cercherò di espandere il progetto. Una cosa che apprezzo ora: il modo in cui incorporo annulla / ripeti in questa applicazione sarà un problema per passare in futuro, quindi voglio farlo bene la prima volta.

Nota aggiunta

In base a un commento, ho cercato "annulla schemi di progettazione" e ho ottenuto alcuni collegamenti potenzialmente pertinenti:

Se guardi i documenti per quadro di annullamento di Qt collegati sopra, sembra che usi < a href="http://en.wikipedia.org/wiki/Command_pattern"> schema di progettazione del comando , quindi è quello con cui sto lavorando. Quindi, riposizionando la mia domanda in questa luce, dovrei generare gli oggetti comando all'interno della classe originale o del suo wrapper? C'è qualche errore evidente nel mio ragionamento sopra riportato che è meglio per la modularità farlo nella classe originale?

    
posta neuronet 22.03.2015 - 22:08
fonte

1 risposta

2

Sembra che tu non stia chiedendo come implementare l'annullamento, dal momento che hai già scelto di lavorare con Annullare Qt Framework , che ha già un'implementazione da collegare a.

Se ti capisco correttamente, sei più interessato a dove implementare il codice necessario. Sembra che tu abbia provato a metterlo in pratica in due punti, il che porta alla complessità in entrambe le situazioni (ci sono stato prima). Quindi in qualche modo è una scelta arbitraria.

Una cosa che potresti non aver considerato è creare più di un wrapper. Se dovessi avvolgere il tuo albero con un wrapper che aggiungesse la funzionalità di annullamento e quindi un altro wrapper che aggiunge funzionalità aggiuntive richieste dall'applicazione, allora potresti trovare un'architettura migliore. In linea con il principio di responsabilità singola . Nota che puoi avvolgere l'albero in un ordine diverso, a seconda delle tue esigenze.

    
risposta data 23.03.2015 - 23:47
fonte

Leggi altre domande sui tag