Use code to clean code – Wrapper-Funktionen

Unser nächstes AL-Go Template und den ganzen Quellcode findet ihr hier: https://github.com/byndit/BeyondAL

Dort ist auch ein Wrapper für Web Requests und Control Addins zu finden!


Viele neue Funktionalitäten in AL helfen uns vormals komplexe Probleme (bspw. das Parsen von JSON oder XML) einfacher umzusetzen. Dennoch kann solcher Quellcode noch immer unnötig komplex oder lang werden.


Am Beispiel des Parsens eines JSON Objekts möchten wir illustrieren, wie Code effektiv reduziert werden kann, indem Wrapper-Funktionen geschrieben werden.


Folgendes JSON soll als Beispiel dienen:

{ 
    "id": "7eba17ec-399e-4be8-b7a4-1aceeb155b5f", 
    "name": "Max Mustermann", 
    "address": "Musterstraße 1", 
    "postCode": "12345", 
    "city": "Musterstadt", 
    "attributes": { 
  "transfer": true, 
        "homepage": "https://www.mustermann.de" 
    }, 
    "shippingAddresses": [{ 
            "name": "Max Mustermann", 
            "address": "Musterstraße 116", 
            "postCode": "67891", 
            "city": "Musterdorf" 
        }, 
        { 
            "name": "Maxi Musterfrau", 
            "address": "Musterstraße 202", 
            "postCode": "41342", 
            "city": "Musterstadt" 
        } 
    ] 
} 

Der AL Code soll nun alle Werte aus diesem JSON Objekt auslesen und einen Debitor mit den zugehörigen Liefer-an Adressen erstellen.


Ohne Wrapper-Funktionen könnte der Quellcode in etwa so aussehen:


Mit Wrapper-Funktionen kann der obenstehende Quellcode wie folgt verkürzt werden:


Dabei stellt die Codeunit „BYD Json Helper“ kleine Helferfunktionen bereit, die die bestehenden Funktionen von JsonObject, JsonArray, JsonToken und JsonValue geschickt verpacken und einfacher nutzbar machen:


procedure FindValue(JObject: JsonObject; Path: Text): JsonValue 
var 
    JToken: JsonToken; 
begin 
    if JObject.SelectToken(Path, JToken) then 
        if JToken.IsValue() then 
            exit(JToken.AsValue()); 
    Error(UnableToFindJsonValueErr, Path); 
end; 
 
procedure ValAsTxt(JObject: JsonObject; Path: Text): Text 
begin 
    exit(FindValue(JObject, Path).AsText()); 
end; 
 
procedure ValAsBool(JObject: JsonObject; Path: Text): Boolean 
begin 
    exit(FindValue(JObject, Path).AsBoolean()); 
end; 
 
procedure ReadJArrayFromObj(JObject: JsonObject; Path: Text): JsonArray 
var 
    JToken: JsonToken; 
begin 
    if JObject.SelectToken(Path, JToken) then 
        if JToken.IsArray() then 
            exit(JToken.AsArray()); 
end; 

Wir machen uns hier die „SelectToken“ Funktion zu Nutze, um sowohl mit Eigenschaftennamen als auch mit Pfaden zu arbeiten bzw. Werte aus der JSON Struktur zu lesen.


Dadurch sind wir in der Lage den ursprünglichen Quellcode deutlich zu verkürzen, verständlicher zu schreiben und Variablendeklarationen zu sparen.


Da diese Funktionen in einer dedizierten Codeunit ausgelagert sind, können diese immer und immer wieder an verschiedenen Stellen der Anwendung genutzt werden!


Den ganzen Quellcode gibt's hier: https://github.com/byndit/BeyondAL

168 Ansichten0 Kommentare

Aktuelle Beiträge

Alle ansehen