Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Scriptable business logic

Îåêßíçóå áðü ôï ìÝëïò KelMan. Τελευταία δημοσίευση από το μέλος Panagiotis Kefalidis στις 17-03-2009, 12:09. Υπάρχουν 21 απαντήσεις.
Σελίδα 2 από 2 (22 εγγραφές)   < 1 2
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  13-03-2009, 10:54 49162 σε απάντηση της 49134

    Απ: Scriptable business logic

    Μια άλλη εκδοχή έρχεται από το "Oslo" project. Εδώ υπάρχει μια σύντομη περιγραφή. Στο παράδειγμα μπορεί κανείς να γράψει κανόνες με φυσική γλώσσα ή μια domain specific language.

    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
  •  13-03-2009, 21:57 49166 σε απάντηση της 49152

    Απ: Scriptable business logic

    Μια τελευταία ερώτηση:

    Ρϊχνοντας μια δεύτερη ματιά, κατάλαβα ότι το μεγαλύτερο πρόβλημα είναι το conditional nesting. Γιατί το ReturnValue του Point<T> να προέρχεται μόνο από εξίσωση ή από explicit assignment; Τα rule objects επιστρέφουν ReturnValue (double). Συνεπώς, μπορούμε να ορίσουμε με oveloading στον constructor του point όσα rule objects θέλουμε, αντί μόνο για μια εξίσωση ή μια προκαθορισμένη τιμή. Με αυτό τον τρόπο, με δύο ή τρεις το πολύ generic classes οι οποίες θα καλύπτουν conditional περιπτώσεις για discrete ή range values (συμπεριλαμβανομένων των strings), μπορούμε να έχουμε όσο conditional nesting θέλουμε. Μου φαίνεται ότι κάτι τέτοιο θα δουλέψει καλά για πάρα πολλές περιπτώσεις. Μήπως χρειάζεσαι και looping;


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  14-03-2009, 02:03 49169 σε απάντηση της 49166

    Απ: Scriptable business logic

    Άκυρο. Όταν έγραφα το προηγούμενο post μου είχε φανεί πιο απλό. Τώρα και να γίνεται, δεν ξέρω αν αξίζει τον κόπο τη στιγμή που υπάρχουν ήδη έτοιμες λύσεις.
    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  16-03-2009, 14:11 49220 σε απάντηση της 49093

    Απ: Scriptable business logic

    Το Σαββατοκύριακο είχα την ευκαιρία να σκεφτώ πάνω σ' αυτό το πρόβλημα πιο χαλαρά και κατέληξα σε ορισμένα συμπεράσματα που θέλω να μοιραστώ μαζί σας, μιας και άρχισε κι εμένα να με ενδιαφέρει αυτό το topic. Για να τα πάρουμε, όμως, τα πράγματα με τη σειρά.

    Το πρώτο θέμα που πρέπει να επιλυθεί είναι η έκφραση των conditions. Με λίγη σκέψη εύκολα φτάνει κανείς στο συμπέρασμα ότι όλα τα conditions μπορούν να εκφραστούν σε στήλες και σειρές. Οι σειρές μπορεί να είναι AND συνθήκες και οι στήλες OR. Για παράδειγμα, το condition (A OR B) AND (C OR D) μετασχηματίζεται σε:

    A AND C OR
    A AND D OR
    B AND C OR
    B AND D

    Ομοίως, το condition (A AND B) OR ((C AND D) OR E) μετασχηματίζεται ακόμα πιο εύκολα σε:

    A AND B OR
    C AND D OR
    E

    Από τα παραπάνω βγαίνει το συμπέρασμα, ότι το μόνο που χρειάζεται είναι ένας table editor εισαγωγής συνθηκών ο οποίος θα δέχεται τα AND σε σειρές και τα OR σε στήλες. Κάθε σειρά είναι true εάν και μόνο εάν όλες οι συνθήκες είναι true, ενώ η OR στήλη είναι true εάν και μόνο εάν μία σειρά είναι true. Με χρήση generics, αυτό μπορεί να γραφτεί ως εξής:

        public enum Condition
        {
            EQ,NotEQ,LT,LTorEQ,GT,GTorEQ
        }
        
        //
        // Σύγκριση μεταξύ δύο μεταβλητών...
        //
        public class Comparison<T> where T : IComparable<T>
        {
            private T lhs; // Left hand side
            private T rhs; // Right hand side
            private Condition cond;
            private bool result;
    
            public bool Result
            {
                get
                {
                    this.result = this.ComparisonResult();
                    return result;
                }
            }
    
            public Comparison(T lhs, T rhs, Condition cond)
            {
                this.lhs = lhs;
                this.rhs = rhs;
                this.cond = cond;
            }
    
            private bool ComparisonResult()
            {
                bool result = false;
                //
                switch (cond)
                {
                    case Condition.EQ:
                        if (lhs.CompareTo(rhs) == 0) { result = true; }
                        break;
                    case Condition.NotEQ:
                        if (lhs.CompareTo(rhs) != 0) { result = true; }
                        break;
                    case Condition.GT:
                        if (lhs.CompareTo(rhs) > 0) { result = true; }
                        break;
                    case Condition.GTorEQ:
                        if (lhs.CompareTo(rhs) >= 0) { result = true; }
                        break;
                    case Condition.LT:
                        if (lhs.CompareTo(rhs) < 0) { result = true; }
                        break;
                    case Condition.LTorEQ:
                        if (lhs.CompareTo(rhs) <= 0) { result = true; }
                        break;
                }
                //
                return result;
            }
        }
    
        //
        // Στο ComparisonRow όλα τα conditions είναι AND
        //
        public class ComparisonRow
        {
            private List<bool> rowResults = new List<bool>();
            private bool result;
    
            public bool Result
            {
                get
                {
                    this.result = this.RowResult();
                    return result;
                }
            }
    
            public void AddRowResult(bool comparisonResult)
            {
                this.rowResults.Add(comparisonResult);
            }
    
            private bool RowResult()
            {
                bool rowResult = true;
                //
                if (this.rowResults.Count == 0)
                {
                    throw new Exception("No results entered in the comparison row...");
                }
                else
                {
                    if (this.rowResults.Contains(false))
                    {
                        rowResult = false;
                    }
                }
                //
                return rowResult;
            }
        }
    
        //
        // Στο ComparisonColumn όλα τα conditions είναι OR
        //
        public class ComparisonColumn
        {
            private List<bool> columnResults = new List<bool>();
            private bool result;
    
            public bool Result
            {
                get
                {
                    this.result = this.ColumnResult();
                    return result;
                }
            }
    
            public void AddColumnResult(bool rowResult)
            {
                this.columnResults.Add(rowResult);
            }
    
            private bool ColumnResult()
            {
                bool columnResult = false;
                //
                if (this.columnResults.Count == 0)
                {
                    throw new Exception("No results entered in the comparison column...");
                }
                else
                {
                    if (this.columnResults.Contains(true))
                    {
                        columnResult = true;
                    }
                }
                //
                return columnResult;
            }
        }

    Το επόμενο θέμα είναι η δομή IF THEN ELSE. Νομίζω ότι και αυτό μπορεί να λυθεί με την ισοδύναμη έκφραση του Immediate IF. Δηλαδή, IF (Condition, True part, False part). Από πλευράς editing ο χρήστης θα εισάγει τους περιορισμούς με τη μορφή ενός branching tree:

                                      |---------------> ...
           True                    |
              |-------> Condition2 (ή RV)
              |                       |
              |                       |---------------> ...
    Condition1
              |
              |
              |-------> Condition3 (ή RV)

    Όπου RV: Return Value, Condition(i): Οι συνθήκες που εισάγονται με μορφή πίνακα από τον προηγούμενο editor

    Τέλος, απαιτείται η χρήση ενός equation editor ο οποίος θα κάνει evaluation σε expressions. Μάλιστα, οι τιμές των εξισώσεων μπορεί να είναι return values των conditions. Μια γενική μορφή του μπορεί να είναι η εξής:


    Y variable: (ορίζεται από το χρήστη)

    Equation:                                                   Panel αριθμών, τελεστών και συναρτήσεων:
    +-----------------------------------------------+ +-----------------------+
    |(3*x1+log(x2))*x3.....                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    |                                                            | |                              |
    +-----------------------------------------------+ +-----------------------+

    Επιλογή μεταβλητών (μπορεί να είναι πεδία πινάκων):
    +-----------------------------------------------+
    |x1 x2 x3...                                             |
    |                                                            |
    |                                                            |
    |                                                            |
    +-----------------------------------------------+

    Σίγουρα μια τέτοια υλοποίηση είναι αρκετά πιο δύσκολο να επιτευχθεί σε σύγκριση με έναν απλό script editor τύπου notepad, αλλά αρκεί να γίνει μια φορά. Τα components είναι reusable και μπορούν να ενσωματωθούν εύκολα σε οποιαδήποτε μελλοντική εφαρμογή. Το evaluation δε των εκφράσεων με τον τρόπο αυτό γίνεται εύκολα. Όσο για expression evaluators έχει πήξει ο τόπος (βλπ. εδώ κι εδώ). Ο κώδικας του RangeEvaluator που έκανα post πιο πριν μπορεί να χρησιμοποιηθεί σαν μια ειδική περίπτωση του IF THEN ELSE. Πιστεύω ότι μια τέτοια υλοποίηση θα δουλέψει. Εσείς τι λέτε;


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  17-03-2009, 08:36 49240 σε απάντηση της 49220

    Απ: Scriptable business logic

    Μου είναι λίγο δύσκολο να φανταστώ πώς θα δουλέψει η λύση σου στην πράξη (μου φαίνεται ότι είναι κάτι σαν rule engine). Βασικά με βρίσκει λίγο διστακτικό η γενική ιδέα του να φτιάξω κάτι δικό μου από την αρχή γιατί συνήθως σε τέτοιες περιπτώσεις ισχύει ο κανόνας του 80-20. Μπορείς να καλύψεις εύκολα το 80% των περιπτώσεων αλλά για το υπόλοιπο 20% - που συνήθως δεν το έχεις σκεφτεί ή σου βγαίνει στην πορεια - χρειάζεται πολύυυυ δουλειά ή μεγάλο re-engineering.

    Από την άλλη έφτιαξα ένα working protorype με την τεχνική του κώδικά μέσω CodeDOM και παίζει μια χαρά. Αυτό που θέλω να κάνω είναι να βάλω κάτω (μόλις τα έχω) όλα τα business rules και να προσπαθήσω να τα εκφράσω με κάπως τυποποιημένη μορφή ώστε να εξετάσω κατά πόσο μπορεί να εφαρμοσθεί κάποιο έτοιμο rule engine ή όπως μου πρότεινε ο Παναγιώτης, κάποια λύση τύπου fluent interface.

     


    Vir prudens non contra ventum mingit
  •  17-03-2009, 11:09 49247 σε απάντηση της 49240

    Απ: Scriptable business logic

    Καλημέρα,

    Κι εγώ δεν μπορώ να πω πως έχω σκεφτεί όλα τα πιθανά σενάρια. Απλά σκέφτηκα πάνω σε μια εναλλακτική πρόταση η οποία έχει το πλεονέκτημα στο ότι μπορεί κανείς να βασιστεί πάνω της και να φτιάξει ένα εύχρηστο interface. Για της ανάγκες δικής μου εφαρμογής έχω ήδη φτιάξει έναν equation editor ο οποίος χρησιμοποιεί πεδία από tables της βάσης σα μεταβλητές και ο χρήστης μπορεί να εισάγει την εξίσωση. Το επόμενο βήμα είναι αυτό, αλλά δεν είχα μέχρι τώρα αφιερώσει χρόνο για να βρω μια λύση. Έτσι όπως το σκέφτομαι είναι όλα να μπορούν να λειτουργήσουν σα μεταβλητές. Για παράδειγμα, το αποτέλεσμα μιας εξίσωσης να μπορεί να συμμετέχει σε μία σύγκριση και αντίθετα, το αποτέλεμα μιας σύγκρισης (αν είναι αριθμός) να μπορεί να χρησιμοποιηθεί σα μεταβλητή σε μία εξίσωση. Η αλήθεια είναι ότι θέλει πολύ δουλειά. Σκέφτομαι να το προχωρήσω μόλις ξεμπερδέψω μ' αυτό που ασχολούμαι τώρα (κι αν δεν προκύψει κάτι άλλο στην πορεία βέβαια). Μου αρέσει το ότι έτσι μπορώ να δώσω στο χρήστη κάτι πολύ εύχρηστο. Το αν θα δουλέψει σε όλα τα σενάρια δεν το γνωρίζω. Αυτό, όμως, είναι το περιεχόμενο και ο ορισμός του R and D. Έτσι, δεν είναι;


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  17-03-2009, 12:09 49255 σε απάντηση της 49130

    Απ: Scriptable business logic

    Παναγιώτης Καναβός:

    Integration με .NET έχει? Εδώ μιλάμε για business λογική και όχι γενικό scripting. Αυτό σημαίνει ότι υπάρχουν κάποιοι ουσιαστικοί περιορισμοί για να πεις ότι αξίζει τον κόπο:

    ...

    Αν και με πολύ καθυστέρηση.. Ναι έχει και μάλιστα προσφέρει και έτοιμο assembly για να "μιλήσεις" με το engine. Απο εκεί και πέρα, φτιάχνεις κάποια "functions" τα οποία τα δηλώνεις και σαν functions που φαίνονται και στο Scripting engine και φυσικά τι τύπο επιστρέφει αυτό και τελείωσες όσο αφορά το κομμάτι του integration/intepretation των script. Απο εκεί και πέρα το πως θα τα σώσεις κλπ στην βάση, θα μπορούσε να είναι απλό κείμενο καθώς το scripting engine διαβάζει τα script σαν απλό κείμενο και στην συνέχεια τα τρέχει.


    Παναγιώτης Κεφαλίδης

    "Για να επιτύχεις, θα πρέπει το πάθος σου για την επιτυχία να είναι μεγαλύτερο απο τον φόβο σου για την αποτυχία"

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Παρακαλώ διαβάστε τους όρους χρήσης.
Σελίδα 2 από 2 (22 εγγραφές)   < 1 2
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems