Strings für ein Geräteinterface parsen (Vorgehen/Patterns)



  • Hallo zusammen,

    eine vielleicht etwas komische Frage, aber evtl. gibt es hierzu Ideen.
    Vorweg: Der betreffende Sprachraum is hauptsächlich C#/.NET, allerdings lässt sich das ja auch teils auf andere Sprachen ummünzen, deswegen der Post in 'Sonstige Programmiersprachen'.
    Wenn ich eine Schnittstelle für ein Gerät implementiere und dieses Interface mit Strings arbeitet, also das betreffende Gerät Commands in Form von Strings erwartet, dann schreibe ich eine Methode TuWas(...) und sende den String direkt über einen Verbindungsmanager an die Komponente. Analog wenn ich Daten lesen möchte sende ich erst den Befehl (bspw. mit UDPClient.SendAnswer) und frage unmittelbar (bspw. mit UDPClient.ReceiveAnswer) nach einer Antwort.

    Gibt es hierfür eine Art Pattern wie man solche Geschichten sauberer oder abstrakter machen könnte? Nicht unerheblich wäre auch ein Fehlerhandling falls z.B. ReceiveAnswer fehlschlägt.
    Gesehen hab ich auch schon Quellcode, der erste eine allgemeine Verbindung besitzt, diese Verbindung dann genauer spezifiziert (RS232,TCP,UDP,XYZ) aber die Commands erst zwischenpackt in einer anderen Klasse (BitPacker etc.) usw.

    TL;DR: Kann man dieses Stringparsing schöner machen oder ist dieses verpacken dann schon einmal ein Ansatz?

    Beste Grüße!



  • wenn du strings übertragen willst, benutz doch am besten eine switch-anweisung und ruf dann die entsprechenden funktionen/methoden auf.



  • Entschuldigung für die späte Antwort. Im Moment behandle ich das so, dass ich Funktionen direkt aufrufe:

    //pseudocode
    public string TuWas1("tuwas1",parameter1, parameter2,...)
    {
       byte[] cmd = ...GetBytes("tuwas1;parameter1;parameter2", Encoding e...);
       SendAnswer(cmd);
       byte[] rueckmeldung = ReceiveAnswer();
    
       string s = ParseByteToString(rueckmeldung);
       s = PrüfeAufMöglicheAntworten();  //schmeißt im Fehlerfall eine Exception, ansonsten erhalte ich den Rückgabewert
    
       return s;
    }
    

    Was ich mit pattern meine: Soll ich irgendwo zum Beispiel mappings anlegen, d.h. eine Tabelle in der mögliche valide Antworten stehen und darauf das erhaltene prüfen oder ähnliches.
    Natürlich wäre es auch möglich das mittels switch-case zu machen:

    //pseudocode
    switch(answer)
    {
       case "BeginOperation":
         switch(answer.split(';')[1])
         {
          case answer.Contains("OK"):
            return "OK";
          break;
    
          case answer.Contains("NOK"):
            return "OK";
          break;
    
          case answer.Contains(ERR_123):
            return "OK";
          break;
        }
    
       case "StopOperation":
             ...
    }
    

    Ich denke aber switch case könnte einfach zu groß und zu unübersichtlich werden. Aber danke trotzdem für diesen Ansatz.



  • also wie du sehen kannst, gab es hier keine 10 mio bessere vorschläge, von daher wirst du es wohl so machen müssen.

    du könntest es ja noch irgendwie nach funktionalitäten unterteilen, sei halt mal kreativ!😉



  • @Wade1234 :
    Ging ja nur drum den eigenen Codingstil etwas zu verbessern und deshalb die Frage ob es sowas wie Patterns oder "professionelle Vorgehensweisen" gibt. Aber danke dir, da lass ich dann einfach weiter die Kreativität spielen 🙂


Log in to reply