Design: condivisione di una classe tra più forme

3

Questa domanda si riferisce a una domanda che ho chiesto in precedenza, che può essere utilizzata come riferimento qui: È questo il modo migliore per avvicinarsi a questo design? Questo è un esempio di MVC?

Durante la codifica, mi sono reso conto che non sto creando un "accoppiamento lento". Il modo in cui sto cercando di risolvere il problema al momento è la creazione di un'istanza della classe Log Collector in MAIN e di passarla a ogni costruttore di classi di form.

Ora, in teoria, la classe Log Collector deve essere istanziata una sola volta per tutto il tempo di esecuzione del programma. Stavo pensando di usare un Singleton Pattern per questa classe, ma pensavo che se due form dovessero aggiornare questa classe allo stesso tempo, ci sarebbe un problema.

Quale sarebbe il modo migliore per condividere la classe di Log Collector tramite più moduli senza istanziare ogni volta una nuova versione della classe Log Collector?

Ho fatto qualche ricerca prima di postare questa domanda e ho letto alcune persone che dicono di usare una classe statica per questo tipo di design. Tuttavia, questo non mi sembra un accoppiamento lento.

Un'altra domanda

Sarebbe meglio utilizzare un'interfaccia per la classe Log Collector qui per tutti i moduli che vogliono comunicare con essa? Ad esempio:

public interface LogCollectorInterface
{
    void SendLogMessage(string logMessage);
}

Ora, quando tutti i moduli vogliono comunicare con la classe Log Collector , questa è l'unica funzione che devono realmente utilizzare, SendLogMessage. Istanziare l'interfaccia piuttosto che la classe Log Collector è il modo migliore per farlo?

FWIW, non sono sicuro che "l'accoppiamento libero" sia la direzione migliore è la strada da percorrere. È una di quelle cose a cui mi sono aggrappato mentre leggevo le domande relative a OOP. Essendo un nuovo programmatore OOP, ha più senso per me sia dal punto di vista organizzativo che di testing stand-on.

Modifica Questa non sarà un'applicazione multi-threading, quindi non è possibile aggiornare contemporaneamente la classe del programma di raccolta log di due moduli.

    
posta brazc0re 24.05.2012 - 19:59
fonte

2 risposte

3

While coding, I came across a realization that I am not creating 'loose coupling'. The way I am trying to solve the problem right now is creating an instance of the Log Collector Class in MAIN and passing it around to each form classes constructor.

Questo è il modo migliore per andare.

Un singleton funzionerà, ma porta con sé tutti i tipi di rischi man mano che la tua applicazione cresce, specialmente se hai intenzione di implementare i test delle unità.

Il problema più grande con un singleton è che sarà disponibile per ogni singola classe nella tua applicazione, non solo per quelli a cui hai consentito l'accesso. E, come vedrai più avanti, non puoi più separare l'accesso a determinate funzionalità tramite l'interfaccia.

but than thought that if two forms need to update this class at the same time, there would be an issue.

Questo vale sia che si tratti di un Singleton o di una singola istanza detenuta da ciascun modulo. Ma, se è il modulo che invia il messaggio, anche in un'applicazione multi-thread, tutto ciò si verificherà nel thread dell'interfaccia utente, quindi non è un problema.

Se c'è qualche tipo di pericolo allora un semplice lock () risolverà il problema per te.

Would an Interface for the Log Collector Class be best used here for all forms wanting to communicate with it?

Sì. Decisamente. Anche se estendi il tuo mediatore in un secondo momento per ricevere più messaggi da ogni modulo, disponi di più interfacce e tieni lo stesso oggetto in ogni campo.

ad es. (nota come un singleton non è così attraente ora?)

public class FooForm : Form
{
    private ILogCollector _logCollector;
    private IDataRequestor _dataRequestor;

    public FooForm (FormMediator mediator)
    {
        _logCollector = mediator;
        _dataRequestor = mediator;
    }

    // Stuff here
}

In questo modo, se un altro modulo può solo registrare eccezioni e non richiedere dati, non è necessario esporre tale funzionalità al modulo.

Questo è il "I" in SOLID : Principio di segregazione dell'interfaccia .

    
risposta data 24.05.2012 - 20:29
fonte
2

if two forms need to update this class at the same time, there would be an issue

Due moduli non possono aggiornare lo stesso oggetto collettore di log esattamente nello stesso momento, a meno che non si trovino in thread diversi. Se i moduli sono in esecuzione in thread diversi ma tutti condividono lo stesso oggetto collector di log (o qualsiasi altro oggetto), è necessario riflettere attentamente su come mantenere il log collector in uno stato coerente. Potrebbe diventare piuttosto complicato.

Una soluzione comune a questo tipo di problema riguarda l'uso di un mutex per impedire che due thread eseguano entrambe le modifiche contemporaneamente. Un altro è che i thread postino messaggi a una coda che il log collector può quindi elaborare in sequenza. Prima di saltare a provare a risolvere il problema, leggi la programmazione multithread. È facile sbagliare qui e notoriamente è difficile eseguire il debug dei problemi di interazione dei thread.

    
risposta data 24.05.2012 - 20:11
fonte

Leggi altre domande sui tag