Pagina 1 van 1  [ 3 berichten ]
Offline IsIkke
Master
ma 19 dec 2011, 10:42 Bericht 
Avatar gebruiker
Hier weet men alles, dat is een feit :P dus ik dacht ik stel em maar hier ipv een dev forum :P

Ik heb met een babbel met een collega van mij (die nu helaas weg is, anders had ik het hem gevraagd) interesse ontwikkeld in het GoF pattern "Visitor". Maar nu zat ik thuis een beetje te experimenteren en kwam eigenlijk op het idee om dit pattern wat sterker te maken. Nu weet ik eigenlijk niet of ik het goed doe en of ik het concept visitor nou echt doorheb. Ik ga er van uit van niet omdat ik dus het "Accept" deel niet toepas.. wat dus wel moet.

Code:
public void Visit(CharSheetElement element, XmlNode charSheetNode)
        {
            foreach (XmlNode currNode in charSheetNode.ChildNodes)
            {
                var property = element.GetType().GetProperty(currNode.Name);

                if (property.PropertyType.IsSubclassOf(typeof(CharSheetElement)))
                {
                    var subElement = property.PropertyType.GetConstructor(new Type[0]).Invoke(new object[0]) as CharSheetElement;
                    property.SetValue(element, subElement, null);
                    CharSheetVisitor.Instance.Visit(subElement, currNode);
                }
                else if ((property.PropertyType.GetGenericArguments().Length > 0) && property.PropertyType.GetGenericArguments()[0].IsSubclassOf(typeof(CharSheetElement)))
                {
                    var methodInfo = this.GetType().GetMethod("ParseList", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static);
                    var genericArgs = new Type[1];
                    genericArgs[0] = property.PropertyType.GetGenericArguments()[0];
                    methodInfo = methodInfo.MakeGenericMethod(genericArgs);

                    var currChildNodes = currNode.SelectNodes("./" + property.Name);
                    List<CharSheetElement> myList = new List<CharSheetElement>();
                    var args = new object[1];

                    foreach (XmlNode currChildNode in currNode.ChildNodes)
                    {
                        var childElement = property.PropertyType.GetConstructor(new Type[0]).Invoke(new object[0]) as CharSheetElement;
                        CharSheetVisitor.Instance.Visit(childElement, currChildNode);
                        myList.Add(childElement);
                    }
                    args[0] = myList;

                    var result = methodInfo.Invoke(this, args);
                    property.SetValue(element, result, null);
                }
                else
                {
                    var methodInfo = this.GetType().GetMethod("Parse", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static);
                    var genericArgs = new Type[1];
                    genericArgs[0] = property.PropertyType;
                    methodInfo = methodInfo.MakeGenericMethod(genericArgs);

                    var args = new object[1];
                    args[0] = currNode.InnerText;
                    var result = methodInfo.Invoke(this, args);
                    property.SetValue(element, result, null);
                }
            }
        }


dit is mijn implementatie ff voor de aannames:
- CharsheetElement is dus een boom van elementen die in deze code doorgelopen wordt met 3 condities:
-- Als het childelement een CharsheetElement is "Visit" zijn childelement;
-- Als het childelement een list van CharsheetElements is "Visit" elk van de elementen;
-- Als het een bekend basetype is, parse invoer naar uitvoer en klaar.
- Parse en ParseList zijn puur helper functies die een convert doet van basetypes.

Nu dus mijn vraag, sla ik de plank helemaal mis?
Offline WNS2.0D
Master
ma 19 dec 2011, 11:23 Bericht 
Avatar gebruiker
Dit pattern ken ik zelf niet, wie weet duik ik er zo even in (misschien heb jij zelf een pitch om helder te maken wat het is en waarom je dit toe wil passen) Wat me in je code wel opvalt is een gebrek aan SRP (Single Responsibility Principle). Zonder naar de inhoud van de implementatie te kijken, meer dan een if of for statement per method jeukt..... (Iedere conditie of loop staat bijna altijd voor een eigen verantwoordelijkheid)
Offline IsIkke
Master
ma 19 dec 2011, 11:28 Bericht 
Avatar gebruiker
WNS2.0D schreef:
Dit pattern ken ik zelf niet, wie weet duik ik er zo even in (misschien heb jij zelf een pitch om helder te maken wat het is en waarom je dit toe wil passen) Wat me in je code wel opvalt is een gebrek aan SRP (Single Responsibility Principle). Zonder naar de inhoud van de implementatie te kijken, meer dan een if of for statement per method jeukt..... (Iedere conditie of loop staat bijna altijd voor een eigen verantwoordelijkheid)

mja het was ff snel in elkaar geflanst ;) omdat ik meer interesse had in het pattern dan nette code.

het visitor pattern wordt hier beschreven: http://en.wikipedia.org/wiki/Visitor_pattern

en de waarom, niet zo zeer een concrete waarom, meer een "handig om te weten".
 [ 3 berichten ] 


Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 4 gasten


Je mag geen nieuwe onderwerpen in dit forum plaatsen
Je mag niet antwoorden op een onderwerp in dit forum
Je mag je berichten in dit forum niet wijzigen
Je mag je berichten niet uit dit forum verwijderen

Zoek naar: