2016-05-16 6 views
2

Also .. Ich habe ein Problem mit einem Objekterstellungsmuster.Objekterstellung durch multiple Regex-Werte vorhergesagt

Ich habe mehrere canonicalIds z.

school/1 
school/1/class/12/ 
school/1/class/12/teacher/35 

Ich habe verschiedene Objekte, die diese darstellen und aus der ID erstellt werden. was ich auf eine saubere Art tun möchte, Zyklus durch die Regexs 'und bestimmen, welches Objekt es ist.

Ich bin fest entschlossen zu bestimmen, wie ich über die Regex zu einer bestimmten Fabrikmethode gehen sollte.

Ich möchte den Typ, der durch das letzte Wort in der Zeichenfolge bestimmt ist, extrahieren. aber auch die IDs, die dann an einen Dienst delegiert werden, um ein Objekt aus einem Datenspeicher abzurufen. Alles ist an Ort und Stelle außer dem Leim. Ich fühle mich gibt es einen besseren Weg, als eine massive mit if/else-Anweisung

class Factory() 
{ 
    object create(string value) 
    { 
    if(match1.ismatch(value)) 
    { 
     //getting match groups and then using the values to get an object from a data store 
     var schoolid= mactch.group[1].value; 
     return new SchoolSerice().GetSchool(schoolid); 
    } 
    if(match2.ismatch(value)) 
    {   
     var schoolid= mactch.group[1].value; 
     var classid= mactch.group[2].value; 
     return new SchoolSerice().GetClass(schoolid,classid); 
    } 
    } 
+0

können Sie etwas genauer sein über das, was Sie extrahieren möchten .. – rock321987

+0

bearbeitet Beitrag mit erweiterten Daten – BastanteCaro

+0

ich mir vorstellen kann hier eine Strategie-Muster anwenden, aber ehrlich gesagt sehe ich keinen Nutzen. Der Code würde sich ausbreiten und die Logik schwerer zu "sehen". Ich schlage vor, Sie erstellen Funktionen wie 'isSchool()', 'isClass()' usw., um die Regex-Logik zu kapseln. Es macht Ihre 'if' Anweisungen lesbarer. – Fuhrmanator

Antwort

0

Sie wahrscheinlich Reflection gehen zu müssen, die Sie dynamisch erlauben wird, eine Methode aufrufen, entweder GetSchool, GetClass oder was auch immer. Sie können sich diese post ansehen, da meine Antwort darauf basiert.

Ich habe nur den Regex-Teil validiert, da ich keine Reflexion erlebt habe, also habe ich nur versucht, Sie in die richtige Richtung zu weisen.

Regex: "([^\\/]+)\\/([^\\/]+)"

([^\\/]+) # Capture group #1, will capture any character until forward slash, which will be object name 
\\/  #forward slash, 
([^\\/]+) # Capture group #2, will capture any character until forward slash or end of string, which will be id 

Der Name Methode wird aus dem Objektnamen des letzten Spiels von Get voraus gebildet werden. Alle IDs werden in ein int Array eingefügt und dieses Array wird als Argument für den Methodenaufruf übergeben. Ich nehme an, schoolid und classid sind int, wenn Sie sie als Zeichenfolge benötigen, entfernen Sie einfach Int32.Parse().


Beispielcode.

class Factory() 
{ 
     object create(string value) 
     { 

      Type type = Type.GetType("SchoolSerice"); 
      Object obj = Activator.CreateInstance(type); 
      MethodInfo methodInfo; 

      string pattern = "([^\\/]+)\\/([^\\/]+)"; 
      string methodName = ""; 
      List<int> argsList = new List<int>(); 
      int[] argsArray; 

      foreach (Match m in Regex.Matches(value, pattern)) 
      { 
       methodName="get"+char.ToUpper(m.Groups[1].Value[0]) + m.Groups[1].Value.Substring(1); 
       argsList.Add(Int32.Parse(m.Groups[2].Value)); 
      } 

      argsArray=argsList.ToArray(); 
      methodInfo = type.GetMethod(methodName); 

      return new methodInfo.Invoke(obj, argsArray); 

     } 
} 
Verwandte Themen