Domanda

Sto sviluppando un'applicazione desktop con un MainForm che è diventato piuttosto grande. Esistono numerosi controlli in diversi contenitori su diversi livelli (SplitContainers, TabPages, Panels).

Ora voglio refactoring questa classe separando tutto il codice del controller responsabile dell'associazione dati & amp; cancellare i controlli o eseguire le interazioni dell'utente in classi separate del Controller.

[EDIT]

Obiettivo

Lo scopo di questa applicazione è di tracciare gli ordini (chiamati Job) e le loro posizioni (chiamati Jobitem). Ogni Job è correlato a un cliente, ogni Jobitem a un Articolo (Jobitems contiene informazioni specifiche del processo di fabbricazione del suo articolo, quindi sta avvolgendo l'articolo). Job, Jobitem, Customer e Article hanno proprietà dinamiche (coppie chiave / valore di base) che sono gestite da una classe PropertyManager.

Architettura

La mia applicazione è suddivisa in 2 progetti principali: il core contiene il modello di dati in 3 classi LinCToSQL DataContext:

  • ArticleManagement
  • JobManagement
  • PropertyManagement

Per ogni classe DataContext esiste una classe XyzManager che fornisce alla GUI l'oggetto LinqToSQL in una raccolta, incapsulando l'origine dati LinqToSQL. Gestisce anche la creazione, la cancellazione e la modifica dei corrispondenti tipi di DataContext.

Quindi ho un progetto GUI, che contiene naturalmente un modulo principale e alcuni moduli aggiuntivi per cose come opzioni ecc. A partire da ora, il mio progetto GUI contiene un riferimento a ogni classe XyzManager e ottiene & amp; imposta i dati attraverso le classi Manager come richiesto dalle interazioni dell'utente, contenente tutta la logica di controllo.

Ho messo la maggior parte della logica indipendente per questo in una classe Utility statica al di fuori della classe form principale, ma immagino che sia un approccio tutt'altro che ideale.

[/ EDIT]

Questa è la mia prima applicazione desktop più grande e non riesco a incapsulare la GUI. A partire da ora, tutto il codice del controller responsabile della gestione delle interazioni dell'utente risiede nella classe MainForm.

Conosco il modello MVC ma non sono sicuro di come applicarlo su un WinForm C # con il mio disegno attuale.

Il mio codice personalizzato da solo è lungo oltre 2400 righe di codice, senza contare il codice generato automaticamente del modulo, con una tendenza crescente. Voglio riformattare questo, ma mi sono perso su come avrei potuto risolverlo in un modo più elegante.

È stato utile?

Soluzione

Per le applicazioni su piccola scala dovresti dare un'occhiata a Model-View-Presenter (MVP), c'è una buona presentazione del (secondo me) il modo migliore per fare MVP: http://martinfowler.com/eaaDev/SupervisingPresenter.html

Altri suggerimenti

Normalmente provo a comporre una GUI complessa usando UserControls più piccoli. Ma alcuni punti sono molto importanti:

  • Ognuno di questi controlli utente dovrebbe essere indipendente (soprattutto dal modulo)
  • I controlli utente che hanno lo scopo di mostrare o modificare determinati dati dovrebbero dipendere solo da questi dati. Dovresti provare a implementare i tuoi controlli in modo tale che possano essere associati a una DataSource che serve tutti i dati di cui ha bisogno il controllo.
  • Quando è necessario consegnare informazioni al contenitore padre (un altro UserControl o il Modulo) utilizzare gli eventi a cui il contenitore può iscriversi.
  • Quando si utilizzano i menu (di scelta rapida), verificare se sono associati a determinati elementi. È necessario creare i menu vicino agli elementi e non all'interno dei controlli utente. Quindi, quando mostri lo stesso elemento sulla GUI in diverse viste (controlli) più di una volta, ogni elemento dovrebbe avere lo stesso menu contestuale.
  • Prova ad applicare un modello di comando per le azioni di pulsanti / menu.

Le tue soluzioni sembrano non poter separare le diverse responsabilità fino ad ora. Dividere il codice in diversi controlli senza confini e responsabilità chiari non è sufficiente.

Utilizzi JobController solo per un modulo? Se sì, allora forse tutto ciò di cui hai bisogno è dividere il codice in più file usando parola chiave parziale ?

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