AL-Code segmentieren und Namenskonflikte mit Namespaces reduzieren
Namespaces werden verwendet, um Code in logischen Gruppen und Hierarchien zu organisieren, wodurch Namenskonflikte vermieden werden, die auftreten können, wenn Bibliotheken kombiniert werden. Namespaces stellen die Eindeutigkeit von Codenamen sicher und ermöglichen die Wiederverwendung von Namen in unterschiedlichen Kontexten. Namespaces bieten Struktur für die Codebasis und vereinfachen so die Navigation und das Verständnis. Namespaces werden in vielen Programmiersprachen genutzt und sind mit Business Central mit AL verfügbar.
Eine AL-Datei deklariert am Anfang einen Namespace, und alle Objekte in der Codedatei sind Teil von diesem Namespace. Ein bestimmtes Objekt kann nur zu einem Namespace gehören, aber derselbe Namespace kann für mehrere AL-Dateien verwendet werden, also für mehrere Objekte und für mehrere Module. Es gibt zwei Compilerregeln, die insbesondere für Namespaces und Objektbenennung gelten:
In einem Modul kann es nur ein Objekt einer Art mit demselben Namen geben
In einem Namespace kann es nur ein Objekt einer Art mit demselben Namen geben
Das Umbenennen vorhandener Objekt‑ oder Mitgliedsnamen stellt eine bahnbrechende Änderung dar, daher können Namespaces nur bei der logischen Struktur von vorhandenen Objekten helfen.
Jede App, die von Ihrer App abhängt, wird unterbrochen, wenn Sie Namespaces umbenennen, und Ihre App wird ebenfalls unterbrochen, wenn eine Ihrer Abhängigkeiten ihre Namespaces umbenennt.
Sie müssen das Schlüsselwort Namespace gefolgt vom Namen des Namespace verwenden, um einen Namespace in AL zu deklarieren. Einige Best Practices für Namespace-Schlüsselwörter sind folgende:
Ein Namespace sollte global eindeutig sein.
Der erste Teil von einem Namespace ist an die entwickelnde Organisation oder eine Einzelperson gebunden, gefolgt von einem Produktnamen und einer logischen Gruppierung innerhalb des Produkts, wie zum Beispiel
namespace BigCompany.SmartProduct.SomeProductArea. Dies unterstützt die beiden Zwecke von Namespaces – die Eindeutigkeit des Objektnamens und die logische Gruppierung von verwandten Funktionen.Verwenden Sie für den Namespace einen stabilen und nicht versionierten Namen. Das Anpassen des Namens eines Namespace ist eine bahnbrechende Änderung.
Der Namespace-Name kann ein beliebiger gültiger AL-Bezeichner sein und Punkte umfassen, um eine Hierarchie von Namespaces anzuzeigen.
Das folgende Beispiel zeigt die Syntax einer Namespace-Deklaration. Alle in der Codedatei deklarierten Objekte sind Teil vom Namespace MyNamespace. Die hier gezeigte Syntax dient zur Veranschaulichung, da es immer noch eine bewährte Methode ist, Objekte in verschiedene Dateien aufzuteilen und für die Datei denselben Namen wie für das Objekt zu verwenden. Weitere Informationen finden Sie unter Bewährte Methoden für AL-Code.
namespace MyNamespace;
// codeunits, tables, pages....
Sie müssen entweder den vollständig qualifizierten Namen oder die Verwendungsrichtlinie verwenden, um nun auf die Objekte im MyNamespace zu verweisen. Weitere Informationen finden Sie unter Richtlinie verwenden.
Sie können dieselbe Namespace-Deklaration in anderen .al-Dateien verwenden, um weitere Objekte im selben Namespace zu deklarieren. Alle Codedateien, die dieselbe Namespace-Deklaration verwenden, sind Teil des selben Namespace.
Die Verwendungsrichtlinie
Sie können entweder den vollständig qualifizierten Namen oder die Verwendungsrichtlinie verwenden, um auf die Objekte in anderen Namespaces zu verweisen. Die Verwendungsrichtlinie wird verwendet, um auf Objekte in anderen Namespaces zu verweisen, ohne den vollqualifizierten Namen zu verwenden. Die Verwendungsrichtlinie wird oben in der Datei .al nach der Namespace-Deklaration und vor allen Objektdeklarationen. platziert. Das folgende Beispiel zeigt die Reihenfolge der Namespace-Deklaration und der Verwendungsrichtlinie. Die Reihenfolge der Verwendungsrichtlinien spielt keine Rolle.
namespace MyNamespace;
using SomeOtherNamespace;
codeunit 10 MyCode
{
...
}
Beim Auflösen von Objekten werden diese zuerst mit dem nächstgelegenen Bereich aufgelöst. Der Verweis muss einen vollständig qualifizierten Namen verwenden, um in ein ähnlich benanntes Objekt in einer abhängigen Erweiterung aufzulösen. Alternativ ist es möglich, Verwendungsrichtlinien zu definieren, um auf externe Namespaces zu verweisen und vollständig qualifizierte Namen für Verweise auf Objekte in diesen zu vermeiden.
Ein verschachtelter Namespace ist ein Namespace, der in einem anderen Namespace deklariert ist. Verschachtelte Namespaces ermöglichen eine bessere und strukturiertere Benennung von Objekten verglichen dazu, wenn die vollständige Struktur im 30-stelligen Objektnamen ausgedrückt werden muss. Die folgende Syntax zeigt eine verschachtelte Namespace-Deklaration von MyNestedNamespace im MyNamespace-Namespace, getrennt durch einen Punkt.
namespace MyNamespace.MyNestedNamespace;
Im Beispiel ist der vollqualifizierte Name des Namespace „MyNamespace.MyNestedNamespace“. Sie müssen entweder den vollständig qualifizierten Namen oder die Verwendungsrichtlinie verwenden, um nun auf die Objekte im MyNamespace MyNestedNamespace zu verweisen. Fügen Sie die folgende Anweisung in Ihren Code ein, um auf Objekte zugreifen zu können, die im MyNestedNamespace deklariert sind:
using MyNamespace.MyNestedNamespace
Verwenden Sie Codeaktionen, um Namespaces einer vorhandenen Quelle hinzuzufügen. Weitere Informationen finden Sie unter Code-Aktionen.
Zusammenfassung
Eine AL-Datei kann oben einen Namespace festlegen, der für alle Objekte in der Codedatei gilt. Ein bestimmtes Objekt kann nur zu einem Namespace gehören, aber derselbe Namespace kann für mehrere AL-Dateien und Objekte verwendet werden.
Beim Auflösen von Objekten wird zuerst der nächstgelegene Bereich verwendet. Der Verweis muss einen vollständig qualifizierten Namen verwenden, um in ein ähnlich benanntes Objekt in einer abhängigen Erweiterung aufzulösen. Oder Sie können es mit Anweisungen definieren, um externe Namespaces einzuschließen und vollqualifizierende Namen wegzulassen.
Da Namespaces für die logische Segmentierung von Erweiterungen hilfreich sind, zeigt der AL Explorer auch Namespaces für Objekte an und ermöglicht die Gruppierung von Objekten nach Namespace. So ist es einfacher, verwandte Objekte zu erkennen, sich auf App-Teilbereiche zu konzentrieren und Inkonsistenzen beim Hinzufügen neuer Objekte zu erkennen.
Verschachtelte Namespaces ermöglichen eine bessere Benennung von Objekten, als die vollständige Struktur im 30-stelligen Objektnamen auszudrücken. Das Umbenennen vorhandener Objekte ist jedoch eine bahnbrechende Änderung, sodass diese Funktion in Zukunft hauptsächlich bei der logischen Struktur vorhandener Objekte und neuen Namen hilft.
Hier ist ein Beispiel für nach Namespace gruppierte Basis-App-Objekte, wobei sich die Debitorentabelle im Namespace Microsoft.Sales.Customer befindet. Wenn Sie Objekte nach Namespace so gruppieren, können Sie sich leichter auf verwandte Objekte konzentrieren und diese finden.
