C # Open Source software utile per l'apprendimento dei modelli di progettazione [chiuso]

4

All'università ho preso una lezione in Expert Systems. La lingua insegnata dal libro (CLIPS) era esoterica - Sistemi esperti: Principi e programmazione, quarta edizione . Ricordo di aver passato momenti difficili con questo. Quindi, dopo aver quasi fallito la lezione, avevo bisogno di creare il più fantastico sistema esperto per la mia presentazione finale. Ho scelto di creare un sistema esperto che calcolasse l'analisi del rischio per il portafoglio previdenziale di una persona. In breve, il sistema fornirebbe i servizi normalmente eseguiti dal proprio consulente finanziario. In altre parole, sulla base della personalità, dell'età, dello stato dell'economia macro e di altri fattori, il portafoglio dovrebbe essere conservativo, moderato o aggressivo?

Nell'appendice del libro (o sul CD-ROM), c'era questo programma di esempio approfondito per qualcosa che non era correlato alla mia presentazione. Durante la mia pausa, ho letto e riletto ogni riga di quel programma finché non l'ho capito alla lettera. Anche se non era correlato, ho imparato più di quanto potessi mai leggendo tutti i capitoli. La mia presentazione si è rivelata davvero dannatamente buona e ho ricevuto lodi dal mio professore e dai miei compagni di classe.

Quindi, la morale della storia è ..., comprendendo il codice di altre persone, puoi ottenere maggiori informazioni su un linguaggio / paradigma piuttosto che leggere esempi canonici. Eppure, fino ad oggi, ho problemi con modelli di design di tutti i giorni come il Pattern di fabbrica. Mi piacerebbe sapere se qualcuno potrebbe raccomandare un software open source che mi aiuterebbe a capire i modelli di design della Gang of Four, per lo meno. Ho letto i libri, ma ho problemi a scrivere codice per i concetti nel mondo reale. Forse, studiando il codice utilizzato nelle applicazioni del mondo reale di oggi, potrebbe semplicemente "fare clic".

Mi rendo conto che un software può implementare solo un tipo di modello di progettazione. Ma se il pattern è un'implementazione che ritieni sia utile per l'apprendimento e sai quale pattern cercare all'interno della fonte, spero che tu possa parlarmene.

Ad esempio, lo spazio dei nomi System.Linq.Expressions ha un buon esempio del pattern Visitor. Il client chiama Expression.Accept (new ExpressionVisitor ()), che chiama ExpressionVisitor (VisitExtension), che richiama Expression (VisitChildren), che quindi chiama nuovamente Expression (Accept) - wooah, un po 'contorto. Il punto da notare qui è che VisitChildren è un metodo virtuale. Entrambe le espressioni e le classi derivate da Expression possono implementare il metodo VisitChildren in qualsiasi modo. Ciò significa che un tipo di espressione può eseguire codice completamente diverso da un altro tipo di espressione derivata, anche se la classe ExpressionVisitor è la stessa nel metodo Accept. (Come nota a lato Expression.Accetto è anche virtuale). Alla fine, il codice fornisce un esempio del mondo reale che non si ottiene in nessun libro perché è un po 'confuso.

Per riassumere, se sei a conoscenza di qualsiasi software open source che utilizza un'implementazione del modello di progettazione sei rimasto colpito, per favore elencalo qui. Sono sicuro che aiuterà molti altri oltre a me.

public class VisitorPatternTest
{

    public void Main()
    {
        Expression normalExpr = new Expression();
        normalExpr.Accept(new ExpressionVisitor());
        Expression binExpr = new BinaryExpression();
        binExpr.Accept(new ExpressionVisitor());
    }
}

public class Expression
{
    protected internal virtual Expression Accept(ExpressionVisitor visitor)
    {
        return visitor.VisitExtension(this);
    }

    protected internal virtual Expression VisitChildren(ExpressionVisitor visitor)
    {
        if (!this.CanReduce)
        {
            throw Error.MustBeReducible();
        }
        return visitor.Visit(this.ReduceAndCheck());
    }

    public virtual Expression Visit(Expression node)
    {
        if (node != null)
        {
            return node.Accept(this);
        }
        return null;
    }

    public Expression ReduceAndCheck()
    {
        if (!this.CanReduce)
        {
            throw Error.MustBeReducible();
        }
        Expression expression = this.Reduce();
        if ((expression == null) || (expression == this))
        {
            throw Error.MustReduceToDifferent();
        }
        if (!TypeUtils.AreReferenceAssignable(this.Type, expression.Type))
        {
            throw Error.ReducedNotCompatible();
        }
        return expression;
    }

}

public class BinaryExpression : Expression
{
    protected internal override Expression Accept(ExpressionVisitor visitor)
    {
        return visitor.VisitBinary(this);
    }

    protected internal override Expression VisitChildren(ExpressionVisitor visitor)
    {
        return CreateDummyExpression();
    }

    protected internal Expression CreateDummyExpression()
    {
        Expression dummy = new Expression();
        return dummy;
    }
}


public class ExpressionVisitor
{
    public virtual Expression Visit(Expression node)
    {
        if (node != null)
        {
            return node.Accept(this);
        }
        return null;
    }

    protected internal virtual Expression VisitExtension(Expression node)
    {
        return node.VisitChildren(this);
    }

    protected internal virtual Expression VisitBinary(BinaryExpression node)
    {
        return ValidateBinary(node, node.Update(this.Visit(node.Left), this.VisitAndConvert<LambdaExpression>(node.Conversion, "VisitBinary"), this.Visit(node.Right)));
    }
}
    
posta John C 20.09.2012 - 07:59
fonte

4 risposte

2

Suggerisco di studiare il xUnit Framework insieme all'implementazione. È un prodotto maturo con architettura pulita e codice sorgente estremamente ordinato. Inoltre, viene fornito con un pacchetto completo di test unitari, in modo da poter raggiungere più obiettivi contemporaneamente: approfondendo a fondo un framework di test delle unità, esaminando gli esempi di schemi di progettazione applicati e vedendo come scrivere test per essi.

    
risposta data 20.09.2012 - 13:31
fonte
9

Sembra che tu voglia comprendere gli schemi di progettazione in senso pratico con esempi. Suppongo che un buon libro con esempi di vita reale ti aiuterà.

Inoltre, sembra che ci sia un certo accoppiamento stretto nel codice. Prenderò in considerazione i principi di progettazione SOLID (come il principio della responsabilità unica) per progettare il mio codice in pezzi non accoppiati e intercambiabili / sostituibili.

Come suggerimento, puoi iniziare con un libro di modelli di progettazione altamente raccomandato , Head First Design patterns è davvero un buon libro da considerare. Adoro questo libro.

    
risposta data 20.09.2012 - 12:57
fonte
4

Gli sviluppatori di SharpDevelop in realtà hanno scritto un libro su di esso e discute i modelli di design usati: Sezionare un'applicazione C # - All'interno di SharpDevelop

    
risposta data 21.09.2012 - 14:31
fonte
3

L'hai capovolta, come molti studenti / persone appena usciti da scuola, i modelli di design brillano come un modo per diventare un grande sviluppatore.
Non potresti sbagliarti di più, questo porta a un eccesso di ingegnerizzazione veloce, e questa è una cattiva programmazione.

Non inizi a pensare quale schema di progettazione dovrebbe essere usato per questo o quello, inizi a scrivere il codice e, come refactoring, emergono i pattern. Possa riutilizzare alcuni componenti, componenti con un comportamento simile, è il nome.

Poi, man mano che acquisisci esperienza, sarai in grado di prevedere che un determinato modello sta per emergere e può pianificare in anticipo utilizzando un modello di progettazione sin dal primo giorno.

Gli stessi modelli di design, come minimo la definizione di GoF, sono un modo per i programmatori di essere in grado di parlare e condividere esperienze utilizzando parole che tutti comprendono (es .: pattern di fabbrica).
Tuttavia, non sono un modo internazionale di gestire un problema particolare, e non dovrebbero essere usati ciecamente.

Il mio consiglio è che dovresti sporcarti le mani, fare esperienza e riflettere su di esso: "come avrei potuto migliorare questo codice?". E ogni volta che puoi / avere il tempo / toccare un codice mal progettato, refactor!

    
risposta data 21.09.2012 - 14:11
fonte

Leggi altre domande sui tag