هذا الوثائق مخصصة للمصممين الذين يستخدمون لغات OCL الكائن. يوجد هنا وثائق مفصلة لمهندسي اللغة الذين يستخدمون أو تمديد لغة OCL هنا . نوصي بمهندسي اللغة قراءة هذه الوثائق قبل قراءة الوثائق التفصيلية.
ocl Bookshop {
context Shop s inv CustomerPaysBeforeNewOrder: // invariant
forall Customer c in s.customers: // quantifiers available
c.allowedToOrder implies !exists Invoice i in s.invoices:
i.buyer == c && i.moneyPayed < i.invoiceAmount ;
// Method specification for selling a book
context Invoice Stock.sellBook(String iban, int discountPercent, Customer c)
let availableBooks = // set comprehension
{ book | Book book in booksInStock, book.iban == iban }
pre: !availableBooks.isEmpty && // precondition
c.allowedToOrder;
post: let discount = (100 - discountPercent)/100; // postcondition, let
b = result.soldBook // result variable
in
!(b isin booksInStock) &&
booksInStock.size@pre == booksInStock.size + 1 && // @pre
result.invoiceAmount == b.price * discount;
}
أمثلة مزيد من التعبير (بما في ذلك Monticore's commonexpressions):
a + 3*4; // number expressions
a >= b; a < 3; a == "myName"; // equalities
b implies (c && a) || d; // boolean expressions
forall a in S: foo(a) > 3; // quantifiers
exists a in S: foo(a) > 3;
a ?== b; c ?<= d // elvis operators (dealing with optionals)
S.first; S.size; S.addAll(T); // 30 operators for Lists
a in S; S.add(a); // + more for Sets
max(S) > 3; // + more for numbers
يعتمد تمثيل OCL النصي في الغالب على التعريف في [Rum16 ، Rum17]. يتم استخدام OCL للتحقق من صحة النماذج الأخرى. هنا ، يتم تعريف أنواع Book
Customer
، على سبيل المثال ، بواسطة مخطط الفصل:
classdiagram Bookshop {
class Book {
String name;
String iban;
double cost;
double price;
}
class Shop;
association [1] Shop -> (invoices) Invoice [*];
association [1] Shop -> (customers) Customer [*];
class Stock {
void addBook(Book b);
Invoice sellBook(Book bookToSell, int discountPercent, Customer buyer);
}
association [1] Stock -> (booksInStock) Book [*];
class Customer {
String name;
String phoneNumber;
int customerNumber;
boolean allowedToOrder;
void payInvoice(double moneyWired, Invoice invoice);
}
class Invoice {
int invoiceNumber;
double invoiceAmount;
double moneyPayed;
}
association [1] Invoice <-> (buyer) Customer [1];
association [1] Invoice <-> (soldBook) Book [1];
}
يصف هذا القسم أداة سطر الأوامر للغة OCL. توفر الأداة وظائف نموذجية تستخدم عند المعالجة. لهذا الغرض ، يوفر funcionality
تتمثل متطلبات بناء واستخدام أداة OCL في (على الأقل) JDK 8 (JDK 11 و JDK 14 أيضًا من قبلنا) ، يتم تثبيت GIT و Gradle ومتاحين للاستخدام في Bash. إذا كنت تستخدم Docker ، فيمكنك أيضًا استخدام حاوية Docker دون تثبيت Java أو Git أو Gradle.
يصف القسم الفرعي التالي كيفية تنزيل الأداة. ثم ، يصف هذا المستند كيفية إنشاء الأداة من الملفات المصدر. بعد ذلك ، يحتوي هذا المستند على برنامج تعليمي لاستخدام الأداة.
يمكن تنزيل إصدار جاهز لاستخدام الأداة في شكل ملف جرة قابل للتنفيذ. يمكنك استخدام رابط التنزيل هذا لتنزيل الأداة.
بدلاً من ذلك ، يمكنك تنزيل الأداة باستخدام wget
. يقوم الأمر التالي بتنزيل أحدث إصدار من الأداة ويحفظه تحت اسم MCOCL.jar
في دليل العمل الخاص بك:
wget "monticore.de/download/MCOCL.jar" -O MCOCL.jar
يمكن الحصول على أحدث إصدار من صورة Docker من الأدوات باستخدام
docker pull monticore/ocl
في حال كنت تستخدم Docker ، استبدل java -jar MCOCL.jar
في ما يلي (لنظام التشغيل Windows PowerShell أو Mac Terminal أو Linux Bash)
docker run --rm -v ${PWD}:/input -w /input monticore/ocl
أو (لسطر أوامر Windows)
docker run --rm -v %CD%:/input -w /input monticore/ocl
على سبيل المثال ، هذا الأمر من الخطوة 2 من هذا البرنامج التعليمي
java -jar MCOCL.jar -i Example.ocl -pp
يصبح
docker run --rm -v ${PWD}:/input -w /input monticore/ocl -i Example.ocl -pp
عند استخدام Docker.
من الممكن إنشاء جرة قابلة للتنفيذ من الأداة من الملفات المصدر الموجودة في GitHub. يصف ما يلي عملية إنشاء الأداة من الملفات المصدر باستخدام Bash. لبناء جرة قابلة للتنفيذ مع Bash من الملفات المصدر المتوفرة في Github ، قم بتنفيذ الأوامر التالية.
أولاً ، استنساخ المستودع:
git clone https://github.com/MontiCore/ocl.git
تغيير الدليل إلى الدليل الجذر للمصادر المستنسخة:
cd OCL
ثم قم ببناء المشروع عن طريق التشغيل (معلومات: تحتاج إلى تثبيت Gradle لهذا):
gradle build
مبروك! يمكنك الآن العثور على ملف JAR القابل للتنفيذ MCOCL.jar
في target/libs
الدليل (يمكن الوصول إليه عبر cd target/libs
).
تصف الأقسام السابقة كيفية الحصول على ملف جرة قابلة للتنفيذ (أداة سطر أوامر OCL). يوفر هذا القسم تعليميًا لاستخدام أداة OCL. تفترض الأمثلة التالية أنك سميت Tool MCOCL
محليًا. إذا قمت بإنشاء الأداة من المصادر أو استخدمت أمر wget
أعلاه ، فأنت بخير. إذا قمت بتنزيل الأداة يدويًا ، فعليك التفكير في إعادة تسمية الجرة التي تم تنزيلها.
تنفيذ ملف الجرة دون أي خيارات يطبع معلومات الاستخدام من
أداة إلى وحدة التحكم:
$ java -jar MCOCL.jar
usage: OCLTool
-c,--coco <arg> Checks the CoCos for the input. Optional
arguments are:
-c intra to check only the intra-model CoCos,
-c inter checks also inter-model CoCos,
-c type (default) checks all CoCos.
-cd4c,--cd4code Load symbol kinds from CD4C. Shortcut for loading
CDTypeSymbol as TypeSymbol,
CDMethodSignatureSymbol as FunctionSymbol, and
FieldSymbol as VariableSymbol. Furthermore,
warnings about not deserializing
CDAssociationSymbol and CDRoleSymbol will be
ignored.
-d,--dev Specifies whether developer level logging should
be used (default is false)
-fs,--functionSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
FunctionSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
-h,--help Prints this help dialog
-i,--input <files> Processes the list of OCL input artifacts.
Argument list is space separated. CoCos are not
checked automatically (see -c).
-is,--ignoreSymKind <fqns> Takes the fully qualified name of one or more
symbol kind(s) for which no warnings about not
being able to deserialize them shall be printed.
Allows cleaner outputs. Multiple symbol kinds
should be separated by spaces.
-p,--path <directory> Sets the artifact path for imported symbols.
Directory will be searched recursively for files
with the ending ".*sym" (for example ".cdsym" or
".sym"). Defaults to the current folder.
-pp,--prettyprint <files> Prints the OCL model to stdout or the specified
file(s) (optional). Multiple files should be
separated by spaces and will be used in the same
order in which the input files (-i option) are
provided.
-s,--symboltable <files> Stores the symbol tables of the input OCL
artifacts in the specified files. For each input
OCL artifact (-i option) please provide one
output symbol file (using same order in which the
input artifacts are provided) to store its
symbols in. For example, -i x.ocl y.ocl -s
a.oclsym b.oclsym will store the symbols of x.ocl
to a.oclsym and the symbols of y.ocl to b.oclsym.
Arguments are separated by spaces. If no
arguments are given, output is stored to
'target/symbols/{packageName}/{artifactName}.ocls
ym'.
-ts,--typeSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
TypeSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
-vs,--variableSymbol <fqns> Takes the fully qualified name of one or more
symbol kind(s) that should be treated as
VariableSymbol when deserializing symbol files.
Multiple symbol kinds should be separated by
spaces.
للعمل بشكل صحيح ، تحتاج الأداة إلى الوسيطة الإلزامية -i,--input <file>
، والتي تأخذ مسارات الملف لملف إدخال واحد على الأقل يحتوي على نماذج SD. إذا لم يتم تحديد وسيطات أخرى ، فإن الأداة تخيل فقط النموذج (S).
لمحاولة ذلك ، انسخ MCOCL.jar
إلى دليل من اختيارك. بعد ذلك ، قم بإنشاء يحتوي على OCL البسيط التالي:
ocl Example {
}
احفظ الملف النصي Example.ocl
MCOCL.jar
الآن تنفيذ الأمر التالي:
java -jar MCOCL.jar -i Example.ocl
قد تلاحظ أن الأداة لا تطبع أي إخراج إلى وحدة التحكم. هذا يعني أن الأداة قد قامت بتحليل الملف Example.ocl
بنجاح.
توفر الأداة طبقة جميلة للغة OCL. يمكن استخدام طبقة جميلة ، على سبيل المثال ، لإصلاح تنسيق الملفات التي تحتوي على OCL. لتنفيذ Pretty-Printer ، يمكن استخدام خيار -pp,--prettyprint
. باستخدام الخيار دون أي وسيطات طباعة النماذج الواردة في ملفات الإدخال إلى وحدة التحكم.
قم بتنفيذ الأمر التالي لمحاولة ذلك:
java -jar MCOCL.jar -i Example.ocl -pp
يطبع الأمر النموذج المطبوع الجميل الموجود في ملف الإدخال إلى وحدة التحكم:
ocl Example {
}
من الممكن طباعة النماذج الموجودة في ملفات الإدخال لإخراج الملفات. بالنسبة لهذه المهمة ، من الممكن توفير أسماء ملفات الإخراج كوسائط إلى خيار -pp,--prettyprint
. إذا تم توفير وسيط لملفات الإخراج ، فيجب أن يكون عدد ملفات الإخراج مساوية لعدد ملفات الإدخال. يتم طباعة ملف الإدخال I-TH في ملف الإخراج I-TH.
قم بتنفيذ الأمر التالي لمحاولة ذلك:
java -jar MCOCL.jar -i Example.ocl -pp Output.ocl
يطبع الأمر النموذج المطبوع الجميل الموجود في ملف الإدخال في ملف File Output.ocl
.
للتحقق من شروط السياق ، يمكن استخدام خيار -c,--coco <arg>
. يؤدي استخدام هذا الخيار دون أي وسيطات إلى التحقق مما إذا كان النموذج يستوفي جميع شروط السياق.
إذا كنت مهتمًا فقط بالتحقق مما إذا كان النموذج ما يفي بمجموعة فرعية فقط من شروط السياق أو ترغب في توضيح أنه ينبغي فحص جميع شروط السياق ، فيمكنك القيام بذلك من خلال توفير واحدة من الحجج الثلاث intra
inter
type
.
intra
فقط ينفذ ظروف السياق فيما يتعلق بانتهاكات شروط السياق داخل النموذج. شروط السياق هذه ، على سبيل المثال ، تحقق من اتفاقيات التسمية.inter
، ينفذ جميع شروط السياق داخل النموذج ويتحقق بالإضافة إلى ذلك ما إذا كانت الأسماء ذات النوع في توقيعات المنشئ محددة.type
الوسيطة ينفذ جميع السياق coniditions. تتضمن شروط السياق هذه التحقق مما إذا كانت الأنواع والطرق المستخدمة موجودة. السلوك عند استخدام type
الوسيطة يساوي السلوك الافتراضي عند استخدام أي وسيط.قم بتنفيذ الأمر التالي لتجربة مثال بسيط:
java -jar MCOCL.jar -i Example.ocl -c -cd4c
قد تلاحظ أن الأداة لا تطبع أي شيء إلى وحدة التحكم عند تنفيذ هذا الأمر. هذا يعني أن النموذج يفي بجميع توصيلات السياق.
دعونا الآن نفكر في مثال أكثر تعقيدًا. أذكر Bookshop
OCL من قسم An Example Model
أعلاه. للاستمرار ، انسخ التمثيل النصي Bookshop
OCL وحفظه في ملفات ملفات Bookshop.ocl
في الدليل حيث يوجد ملف MCOCL.jar
. لهذا ستحتاج إلى ملف رمز يحتوي على رموز رسم تخطيطي في الفصل يتوافق مع Bookshop.ocl
. سيتم شرح ذلك بمزيد من التفصيل في القسم التالي. في الوقت الحالي ، ما عليك سوى إضافة -p src/test/resources/docs/Bookshop/ -cd4c
إلى الأمر لاستخدام أخبر الأداة أين يمكن العثور على ملف الرمز الذي تم إعداده لهذا المثال وكيفية معالجته.
يمكنك التحقق من الأنواع المختلفة من شروط السياق ، باستخدام الخيار -c,--coco <arg>
:
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c intra
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c inter
java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c type
لا ينبغي أن ينتج أي من هذه الأوامر الإخراج.
لرؤية خطأ يتيح إضافة خطأ إلى النموذج. استبدل هذا الخط في Bookshop.ocl
{ book | Book book in booksInStock, book.iban == iban }
بواسطة
{ book2 | Book book in booksInStock, book.iban == iban }
نظرًا لأن book2
غير محدد ، يجب أن تقوم الأداة الآن بطباعة رسالة خطأ عند التحقق من Cocos:
$ java -jar MCOCL.jar -i Bookshop.ocl -p src/test/resources/docs/Bookshop/ -cd4c -c
[INFO] DeriveSymTypeOfExpression package suspected
[ERROR] 0xA0309 Bookshop.ocl:<13,12> Could not calculate type of expression "book2" on the left side of SetComprehension
يرجى تذكر التراجع عن "الخطأ".
في هذا القسم ، نستخدم مسار الرمز ونزود الأداة بملف رمز (جدول رمز مخزن) لنموذج آخر ، والذي يحتوي على معلومات النوع اللازمة.
قم بإنشاء mytypes
جديد في الدليل حيث توجد أداة MCOCL.jar
. على سبيل المثال ، يتطلب مثال Bookshop.ocl
من القسم الأول مخططًا للفصل الذي حدد أنواع البيانات الخاصة به. يمكنك العثور على ملف مخطط الفئة هذا ضمن SRC/Test/Resources/Docs/Bookshop/Bookshop.cd.
لاستخدامه في OCL ، تحتاج أولاً إلى تحويل ملف رمز. يوفر Symbor File Bookshop.sym
من مخطط الفئة جميع معلومات النوع اللازمة لاستخدام أنواعها في OCL. إذا كنت لا ترغب في المشاركة في أداة القرص المضغوط في هذه المرحلة ، فيمكنك أيضًا العثور على ملف جاهز للاستخدام ضمن SRC/Test/Resources/Docs/Bookshop/Bookshop.sym. فقط نسخه إلى مجلد mytypes
الخاص بك. خلاف ذلك ، لتحويل مخطط الفئة إلى ملف رمز ، تحتاج إلى استخدام MCCD.jar
من مشروع CD4Analysis وتحويل ملف مخطط الفئة باستخدام الأمر التالي:
java -jar MCCD.jar -d false --fieldfromrole navigable -i src/test/resources/docs/Bookshop/Bookshop.cd -s mytypes/Bookshop.sym
محتويات ملف الرمز لها أهمية طفيفة بالنسبة لك كمستخدم لغة. في حال كنت فضوليًا وأنظر إلى ملف الرمز: يحتوي ملف الرمز على تمثيل JSON للرموز المحددة في نموذج. في هذه الحالة ، يحتوي ملف الرمز على معلومات حول الأنواع المحددة. عادةً ما تقوم أدوات لغات Monticore بإنشاء محتويات هذه الملفات تلقائيًا ، ويجب ألا تهتم بمستخدم اللغة بمحتوياتها.
يسمى المسار الذي يحتوي على بنية الدليل التي تحتوي على ملف الرمز "مسار الرمز". إذا قدمنا مسار الرمز للأداة ، فسيبحث عن الرموز في ملفات الرموز ، والتي يتم تخزينها في الدلائل الموجودة في مسار الرمز. لذلك ، إذا كنا نريد أن تجد الأداة ملف الرمز الخاص بنا ، فيجب علينا توفير مسار النموذج للأداة عبر خيار --path <directory>
. يمكنك تجربة ذلك باستخدام مجلد mytypes
الذي قمت بإنشائه للتو:
java -jar MCOCL.jar -i Bookshop.ocl --path <SYMBOLPATH> -c type -cd4c
حيث <SYMBOLPATH>
هو المسار الذي قمت بتخزين ملف الرمز الذي تم تنزيله. في مثالنا ، في حالة تخزين النموذج في mytypes
، قم بتنفيذ الأمر التالي:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
لاحظ أن هذا الأمر يستخدم أيضًا علامة -cd4c
. لتفسير الرموز المقدمة إلى أداة OCL ، يحتاج إلى فهم كيفية تفسير الرموز المخزنة بواسطة أداة القرص المضغوط. علامة -cd4c
هي اختصار للقيام بذلك من أجل CD4Code. يمكنك أيضًا القيام بذلك يدويًا عن طريق استخدام الأعلاف --typeSymbol
، --functionSymbol
، و --variableSymbol
متبوعة بأنواع الرموز التي يجب تفسيرها على أنها TypeSymbol
، FunctionSymbol
، VariableSymbol
:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol <TYPE_SYMBOL_KINDS> --variableSymbol <VAR_SYMBOL_KINDS> --functionSymbol <FUNC_SYMBOL_KINDS>
حيث <TYPE_SYMBOL_KINDS>
و <VAR_SYMBOL_KINDS>
و <FUNC_SYMBOL_KINDS>
هي الأسماء المؤهلة تمامًا للرموز. في حال كنت ترغب في توفير أنواع الرموز المتعددة ، ما عليك سوى إضافتها مفصولة بمساحة. في مثالنا ، فإن إعلان الرموز من CD4Analysis سيبدو هكذا:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol de.monticore.cdbasis._symboltable.CDTypeSymbol --variableSymbol de.monticore.symbols.oosymbols._symboltable.FieldSymbol --functionSymbol de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol
لاحظ أن الأداة تنتج الآن الكثير من التحذيرات على الرموز التي لا يمكن تفسيرها. ليس كل رمز للغة المختلفة قد يكون مثيرًا للاهتمام في OCL. لقمع هذه التحذيرات غير المقصودة ، يمكنك معرفة أداة OCL التي لا ترغب في استلامها باستخدام --ignoreSymKind <SYM_KINDS_TO_IGNORE>
. في مثالنا ، سيبدو هذا هكذا:
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type --typeSymbol de.monticore.cdbasis._symboltable.CDTypeSymbol --variableSymbol de.monticore.symbols.oosymbols._symboltable.FieldSymbol --functionSymbol de.monticore.cd4codebasis._symboltable.CDMethodSignatureSymbol --ignoreSymKind de.monticore.cdassociation._symboltable.CDAssociationSymbol de.monticore.cdassociation._symboltable.CDRoleSymbol
للاستخدام اليومي ، هذا معقد بعض الشيء. لذا تذكر أن علامة -cd4c
يمكنها تقليل هذا إلى فقط
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -c type -cd4c
يصف القسم السابق كيفية تحميل الرموز من ملف رمز موجود. الآن ، سوف نستخدم الأداة لتخزين ملف رمز لطراز Bookshop.ocl
الخاص بنا. سيحتوي ملف الرمز المخزن على معلومات حول الكائنات المحددة في ملف OCL. يمكن استيراده بواسطة نماذج أخرى لاستخدام الرموز التي تم تقديمها بواسطة تعريفات الكائنات هذه ، على غرار كيفية تغيير Bookshop.ocl
الملفات Bookshop.sym
باستخدام خيار -s,-symboltable <file>
يقوم بإنشاء جداول الرموز لنماذج الإدخال وتخزينها في مسارات الملف المعطاة كوسائط. إما أنه لا يجب توفير مسارات ملف أو يجب توفير مسار ملف واحد بالضبط لكل نموذج إدخال. يتم تخزين ملف الرمز لنموذج الإدخال I-TH في الملف المحدد بواسطة مسار الملف I-TH. إذا لم تقم بتوفير أي مسارات للملف ، فإن الأداة تخزن جدول الرمز لكل نموذج إدخال في target/symbols/{packageName}/{fileName}.oclsym
حيث يكون packageName
هو اسم الحزمة كما هو محدد في الملف الذي يحتوي على الملف النموذج واسم fileName
هو اسم الملف الذي يحتوي على النموذج. يتم تخزين الملف بالنسبة إلى دليل العمل ، أي الدليل الذي تقوم فيه بتنفيذ الأمر لتخزين ملفات الرمز. علاوة على ذلك ، يرجى ملاحظة أنه من أجل تخزين الرموز بشكل صحيح ، يجب أن يكون النموذج جيدًا في جميع التحيات ، وبالتالي يتم فحص جميع شروط السياق مسبقًا.
لتخزين ملف الرمز الخاص بـ Bookshop.ocl
، قم بتنفيذ الأمر التالي (تتطلب فحص حالة السياق الضمني باستخدام خيار مسار الرمز):
java -jar MCOCL.jar -i Bookshop.ocl --path mytypes -cd4c -s
تنتج الأداة target/symbols/docs/Bookshop.oclsym
، والتي يمكن الآن استيرادها بواسطة نماذج أخرى ، على سبيل المثال ، من خلال النماذج التي تحتاج إلى استخدام بعض الكائنات المحددة في Bookshop
ملفات OCL.
لتخزين ملف الرمز لـ Bookshop.ocl
في الملف syms/Bookshop.oclsym
، على سبيل المثال ، قم بتنفيذ الأمر التالي (مرة أخرى ، تتطلب شيكات حالة السياق الضمنية استخدام خيار مسار الرمز):
java -jar MCOCL.jar -i Bookshop.ocl -path mytypes -cd4c -s syms/Bookshop.oclsym
تهانينا ، لقد انتهيت للتو من البرنامج التعليمي حول حفظ ملفات SD Symbol!