مقاله فرزند 5 - NewsID: 2467 - گروه: 10 - محدوده منبع: صفحات 147-182 PDFفروش یا انتشار این ترجمه منوط به داشتن مجوز لازم از صاحب حقوق اثر است.
ادامه 11.5.1 Constraint
Associationها
specification: ValueSpecification - Property متناظر در Abstractions را بازتعریف میکند و زیرمجموعه Element::ownedElement است.
Constraintها
Constraint اضافی ندارد.
معناشناسی
معناشناسی اضافی ندارد.
نمادگذاری
نمادگذاری اضافی ندارد.
11.5.2 Namespace
یادداشت - Propertyهای اضافی؛ بخش Namespace در صفحه 146 را ببینید.
توصیف
Constructs::Namespace در نمودار Namespaces تعریف میشود. نمودار Constraints، Association میان Namespace و Constraint را نشان میدهد که مالکیت Constraint توسط Namespace را نمایش میدهد.
Generalizationها
Attributeها
Attribute اضافی ندارد.
Associationها
ownedRule: Constraint[*] - Property متناظر در Abstractions را بازتعریف میکند و زیرمجموعه Namespace::ownedMember است.
Constraintها
Constraint اضافی ندارد.
معناشناسی
معناشناسی اضافی ندارد.
11.6 نمودار DataTypes
نمودار DataTypes از Package Constructs سازههای DataType، Enumeration، EnumerationLiteral و PrimitiveType را مشخص میکند و Featureهایی به سازههای Property و Operation میافزاید. این سازهها برای تعریف primitive data typeها، مانند Integer و String، و enumeration data typeهای تعریفشده توسط کاربر به کار میروند. Data typeها معمولاً برای اعلان Type مربوط به attributeهای Class استفاده میشوند.
شکل 11.18 - Classهای تعریفشده در نمودار DataTypes
11.6.1 DataType
توصیف
Data type نوعی Type است که instanceهای آن فقط با value خود شناسایی میشوند. یک DataType میتواند Attributeهایی داشته باشد تا مدلسازی structured data typeها را پشتیبانی کند.
یکی از کاربردهای معمول DataTypeها نمایش primitive typeهای زبانهای برنامهنویسی یا basic typeهای CORBA است. برای مثال Typeهای Integer و String اغلب بهعنوان DataType در نظر گرفته میشوند.
Generalizationها
Attributeها
Attribute اضافی ندارد.
Associationها
ownedAttribute: Property[*] - Attributeهایی که DataType مالک آنهاست. این یک collection مرتبشده است و زیرمجموعه Classifier::attribute و Element::ownedMember محسوب میشود.
ownedOperation: Operation[*] - Operationهایی که DataType مالک آنهاست. این یک collection مرتبشده است و زیرمجموعه Classifier::feature و Element::ownedMember محسوب میشود.
Constraintها
Constraint اضافی ندارد.
معناشناسی
Data type نوع ویژهای از Classifier و مشابه Class است. تفاوت آن با Class این است که instanceهای DataType فقط از طریق value خود شناسایی میشوند.
همه copyهای یک instance از DataType، و هر instance دیگری از همان DataType که value یکسانی داشته باشد، یک instance واحد در نظر گرفته میشوند. instanceهای DataTypeای که Attribute دارد، یعنی structured data type است، وقتی یکسان در نظر گرفته میشوند که structure آنها یکسان و valueهای Attributeهای متناظر نیز یکسان باشند.
اگر DataType دارای Attribute باشد، instanceهای آن DataType شامل Attribute valueهای متناظر با همان Attributeها خواهند بود.
نقاط تغییرپذیری معناشناختی
هرگونه محدودیت بر قابلیتهای DataTypeها، مانند محدودکردن Type مربوط به Attributeهای آنها، یک semantic variation point محسوب میشود.
نمادگذاری
DataType با symbol مربوط به Classifier و keyword «dataType» نمایش داده میشود؛ یا هنگامی که مثلاً توسط یک Attribute به آن reference میشود، بهصورت String شامل نام DataType نشان داده میشود.
مثالها
شکل 11.19 - نمادگذاری DataType:
در سمت چپ icon مربوط به یک DataType و در سمت راست reference به DataTypeای که در یک Attribute استفاده شده است نشان داده میشود.
11.6.2 Enumeration
Enumeration یک DataType است که valueهای آن در Model بهصورت EnumerationLiteralها فهرست شدهاند.
توصیف
Constructs::Enumeration تعریف Enumeration از Basic را بازاستفاده میکند و یک specialization به Constructs::DataType میافزاید.
Enumeration نوعی DataType است که instanceهای آن میتوانند هر یک از چند EnumerationLiteral ازپیشتعریفشده باشند.
مجموعه EnumerationLiteralهای قابل استفاده را میتوان در Packageها یا Profileهای دیگر توسعه داد.
Generalizationها
Attributeها
Attribute اضافی ندارد.
Associationها
ownedLiteral: EnumerationLiteral[*] - مجموعه مرتبشده Literalهای این Enumeration را مشخص میکند و زیرمجموعه Element::ownedMember است.
Constraintها
Constraint اضافی ندارد.
معناشناسی
instanceهای زمان اجرا برای Enumeration، data value هستند. هر یک از این valueها دقیقاً متناظر با یک EnumerationLiteral است.
نمادگذاری
Enumeration را میتوان با notation مربوط به Classifier، یعنی یک مستطیل، همراه با keyword «enumeration» نشان داد. نام Enumeration در compartment بالایی قرار میگیرد. compartmentی برای فهرست Attributeها زیر نام و compartmentی برای فهرست Operationها زیر Attributeها قرار میگیرد. فهرست EnumerationLiteralها میتواند در پایینترین compartment و هر Literal در یک خط نمایش داده شود. compartmentهای Attribute و Operation را میتوان حذف کرد و معمولاً وقتی خالی باشند حذف میشوند.
مثالها
شکل 11.20 - نمونهای از یک Enumeration
11.6.3 EnumerationLiteral
EnumerationLiteral یک data value تعریفشده توسط کاربر برای یک Enumeration است.
توصیف
Constructs::EnumerationLiteral تعریف Enumeration از Basic را بازاستفاده میکند و یک specialization به Constructs::NamedElement میافزاید.
Generalizationها
Attributeها
Attribute اضافی ندارد.
Associationها
enumeration: Enumeration[0..1] - Enumerationای را مشخص میکند که این EnumerationLiteral عضو آن است. زیرمجموعه NamedElement::namespace است.
Constraintها
Constraint اضافی ندارد.
معناشناسی
EnumerationLiteral یک Element از extension زمان اجرای یک Enumeration DataType را تعریف میکند.
EnumerationLiteral نامی دارد که میتوان از آن برای شناساییاش در Enumeration خود استفاده کرد. نام EnumerationLiteral در محدوده همان Enumeration scope میشود و باید در همان Enumeration یکتا باشد. نامهای EnumerationLiteral سراسری نیستند و برای استفاده عمومی باید qualified شوند.
valueهای زمان اجرا که با EnumerationLiteralها متناظرند را میتوان از نظر equality با یکدیگر مقایسه کرد.
نمادگذاری
EnumerationLiteral معمولاً بهصورت یک نام و هر مورد در یک خط، در compartment مربوط به Enumeration نمایش داده میشود. بخش Enumeration را ببینید.
مثالها
بخش Enumeration را ببینید.
11.6.4 Operation
یادداشت - Propertyهای اضافی؛ بخش Operation در صفحه 151 را ببینید.
توصیف
Constructs::Operation در نمودار Operations تعریف میشود. نمودار DataTypes، Association میان Operation و DataType را نشان میدهد که مالکیت Operation توسط DataType را نمایش میدهد.
Generalizationها
BehavioralFeature، صفحه 150
Attributeها
Attribute اضافی ندارد.
Associationها
datatype: DataType[0..1] - DataType مالک این Operation را مشخص میکند. زیرمجموعه NamedElement::namespace، Feature::featuringClassifier و RedefinableElement::redefinitionContext است.
Constraintها
Constraint اضافی ندارد.
معناشناسی
یک Operation میتواند تحت مالکیت و در Namespace یک DataType قرار داشته باشد؛ این DataType context مربوط به redefinition احتمالی Operation را فراهم میکند.
11.6.5 PrimitiveType
PrimitiveType یک DataType ازپیشتعریفشده را بدون substructure مرتبط تعریف میکند؛ یعنی در context مربوط به UML هیچ partی ندارد. Primitive DataType ممکن است algebra و Operationهایی داشته باشد که خارج از UML، برای مثال بهصورت ریاضی، تعریف شدهاند.
توصیف
Constructs::PrimitiveType تعریف PrimitiveType از Basic را بازاستفاده میکند و یک specialization به Constructs::DataType میافزاید.
instanceهای PrimitiveType که در خود UML استفاده میشوند شامل Boolean، Integer، UnlimitedNatural و String هستند؛ بخش 12، Core::PrimitiveTypes را ببینید.
Generalizationها
Attributeها
Attribute اضافی ندارد.
Associationها
Association اضافی ندارد.
Constraintها
Constraint اضافی ندارد.
معناشناسی
instanceهای زمان اجرای PrimitiveType، data value هستند. این valueها با Elementهای ریاضی تعریفشده خارج از UML رابطه چندبهیک دارند؛ برای مثال integerهای مختلف.
instanceهای PrimitiveType identity ندارند. اگر دو instance representation یکسانی داشته باشند، از یکدیگر قابل تشخیص نیستند.
نمادگذاری
PrimitiveType با keyword «primitive» در بالا یا پیش از نام PrimitiveType نمایش داده میشود.
ادامه 11.6.5 PrimitiveType
Instanceهای PrimitiveTypeهای ازپیشتعریفشده - بخش 12، Core::PrimitiveTypes - میتوانند با همان نمادگذاریای نشان داده شوند که برای reference به آن instanceها ارائه شده است؛ به subtypeهای ValueSpecification مراجعه کنید.
Examples
برای نمونهها به بخش 12، Core::PrimitiveTypes مراجعه کنید.
11.6.6 Property
یادداشت - Propertyهای اضافی؛ بخش Property در صفحه 124 را ببینید.
Description
Constructs::Property در نمودار Classes تعریف میشود. نمودار DataTypes Association میان Property و DataType را نشان میدهد که مالکیت Property توسط DataType را نمایش میدهد.
Generalizations
StructuralFeature، صفحه 132
Attributes
Attribute اضافی ندارد.
Associations
datatype: DataType[0..1] - DataType مالک این Property را مشخص میکند. زیرمجموعه NamedElement::namespace، Feature::featuringClassifier و Property::classifier است.
Constraints
Constraint اضافی ندارد.
Semantics
یک Property میتواند تحت مالکیت و در Namespace یک DataType باشد.
11.7 نمودار Namespaces
نمودار Namespaces از Package Constructs، Namespace و سازههای مرتبط با آن را مشخص میکند. این نمودار مشخص میکند NamedElementها چگونه بهعنوان memberهای Namespace تعریف میشوند و نیز قابلیت عمومی هر Namespace را برای import همه memberها یا memberهای منفرد یک Package مشخص میکند.
شکل 11.21 - نمودار Namespaces از Package Constructs
11.7.1 ElementImport
ElementImport یک Element را در Package دیگر شناسایی میکند و اجازه میدهد بدون qualifier و فقط با نامش به آن Element ارجاع داده شود.
Description
ElementImport بهعنوان DirectedRelationship میان یک importing Namespace و یک PackageableElement تعریف میشود. نام PackageableElement یا alias آن به Namespace مربوط به importing Namespace اضافه میشود. همچنین میتوان کنترل کرد آیا Element importشده خود میتواند دوباره import شود یا خیر.
Generalizations
DirectedRelationship، صفحه 106
Attributes
visibility: VisibilityKind - visibility مربوط به PackageableElement importشده را در importing Package مشخص میکند. Visibility پیشفرض همان visibility Element importشده است. اگر Element importشده visibility نداشته باشد، میتوان به ElementImport visibility افزود؛ مقدار پیشفرض public است.
alias: String[0..1] - نامی را مشخص میکند که باید بهجای نام PackageableElement importشده به Namespace مربوط به importing Package اضافه شود. نام alias نباید با نام member دیگری در importing Package تداخل داشته باشد. بهطور پیشفرض alias استفاده نمیشود.
Associations
importedElement: PackageableElement[1] - PackageableElementی را مشخص میکند که نام آن باید به Namespace اضافه شود. زیرمجموعه DirectedRelationship::target است.
importingNamespace: Namespace[1] - Namespaceی را مشخص میکند که یک PackageableElement را از Package دیگری import میکند. زیرمجموعه DirectedRelationship::source و Element::owner است.
Constraints
[1] Visibility یک ElementImport فقط میتواند public یا private باشد.
self.visibility = #public or self.visibility = #private
[2] importedElement یا public visibility دارد یا اصلاً visibility ندارد.
self.importedElement.visibility.notEmpty() implies self.importedElement.visibility = #public
Additional Operations
[1] Query getName() نامی را برمیگرداند که PackageableElement importشده با آن در importing Namespace شناخته خواهد شد.
ElementImport::getName(): String;
getName =
if self.alias->notEmpty() then
self.alias
else
self.importedElement.name
endif
Semantics
ElementImport نام یک PackageableElement از یک Package را به importing Namespace اضافه میکند. این کار از طریق reference انجام میشود؛ یعنی نمیتوان Featureهایی به خود ElementImport اضافه کرد، اما میتوان Element ارجاعشده را در Namespaceای که از آن import شده تغییر داد. ElementImport برای import گزینشی Elementهای منفرد، بدون اتکا به PackageImport، استفاده میشود.
در صورت name clash با یک outer name - Elementی که در Namespace دربرگیرنده تعریف شده و با نام بدون qualification در Namespaceهای داخلی قابل استفاده است - در importing Namespace، outer name توسط ElementImport پنهان میشود و نام بدون qualification به Element importشده ارجاع میدهد. Outer name همچنان با qualified name قابل دسترسی است.
اگر در نتیجه ElementImport یا PackageImport بیش از یک Element با نام یکسان قرار باشد به Namespace import شود، آن Elementها به importing Namespace اضافه نمیشوند و برای استفاده از آنها در آن Namespace باید نامها qualified شوند. اگر نام Element importشده با نام Elementی که importing Namespace مالک آن است یکسان باشد، Element importشده به importing Namespace اضافه نمیشود و برای استفاده باید qualified name آن نوشته شود. متن اصلی این قاعده را دوباره با تأکید بر qualified بودن نام Element importشده تکرار میکند.
Element importشده میتواند با ElementImport یا PackageImport توسط Namespaceهای دیگر دوباره import شود.
Visibility مربوط به ElementImport میتواند با visibility Element importشده یکسان یا محدودتر از آن باشد.
Notation
ElementImport با پیکان dashed دارای open arrowhead از importing Namespace به Element importشده نمایش داده میشود. اگر visibility عمومی باشد keyword «import» و در غیر این صورت برای visibility خصوصی keyword «access» نزدیک پیکان dashed قرار میگیرد.
اگر ElementImport alias داشته باشد، alias بهجای نام Element importشده استفاده میشود. نام alias را میتوان پس یا زیر keyword «import» نشان داد.
Presentation Options
اگر Element importشده یک Package باشد، میتوان بهطور اختیاری keyword را با واژه element پیشوند داد؛ یعنی «element import».
بهعنوان جایگزین پیکان dashed، میتوان ElementImport را با متنی که Element importشده را بهطور یکتا شناسایی میکند و داخل curly bracket زیر یا پس از نام Namespace قرار میگیرد نمایش داد:
'{element import ' <qualifiedName> '}' | '{element access ' <qualifiedName> '}'
بهطور اختیاری alias نیز قابل نمایش است:
'{element import ' <qualifiedName> 'as' <alias> '}' |
'{element access ' <qualifiedName> 'as' <alias> '}'
Examples
ElementImport در شکل 11.22 اجازه میدهد Elementهای Package Program بدون qualification به Type Time در Types ارجاع دهند. بااینحال برای Types::Integer همچنان باید qualification صریح استفاده شود، زیرا این Element import نشده است. Type String در Package Program قابل استفاده است اما نمیتوان آن را از Program به Packageهای دیگر دوباره import کرد.
شکل 11.22 - نمونه ElementImport
در شکل 11.23 ElementImport با aliasing ترکیب شده است؛ بنابراین Type Types::Real در Package Shapes با نام Double ارجاع داده میشود و Attribute Circle::radius از Type Double استفاده میکند.
شکل 11.23 - نمونه ElementImport همراه aliasing
11.7.2 NamedElement
Description
Constructs::NamedElement تعریف NamedElement را از Abstractions::Visibilitites دوباره استفاده میکند و specializationهایی از Constructs::Element و Basic::NamedElement اضافه میکند. املای Visibilitites مطابق متن اصلی است.
Generalizations
Attributes
name: String[0..1] - نام NamedElement.
Associations
namespace: NamedElement[0..1] - Namespace مالک این NamedElement. Property متناظر از Abstractions::Namespaces::NamedElement را بازتعریف میکند.
Constraints
Constraint اضافی ندارد.
Semantics
معناشناسی اضافی ندارد.
Notation
نمادگذاری اضافی ندارد.
11.7.3 Namespace
Description
Constructs::Namespace تعریف Abstractions::Constraints::Namespace را دوباره استفاده میکند.
Namespace میتواند memberهای منفرد یا همه memberهای یک Package را import کند؛ در نتیجه میتوان در importing Namespace بدون qualification به آن NamedElementها ارجاع داد. در صورت conflict برای رفع ابهام باید از qualified name یا alias استفاده شود.
Generalizations
Attributes
Attribute اضافی ندارد.
Associations
elementImport: ElementImport[*] - ElementImportهایی را که Namespace مالک آنهاست ارجاع میدهد. زیرمجموعه Element::ownedElement است.
/importedMember: PackageableElement[*] - PackageableElementهایی را ارجاع میدهد که در نتیجه PackageImport یا ElementImport member این Namespace هستند. زیرمجموعه Namespace::member است.
/member: NamedElement[*] - Property متناظر در Abstractions::Namespaces::Namespace را بازتعریف میکند.
/ownedMember: NamedElement[*] - Property متناظر در Abstractions::Namespaces::Namespace را بازتعریف میکند.
packageImport: PackageImport[*] - PackageImportهایی را که Namespace مالک آنهاست ارجاع میدهد. زیرمجموعه Element::ownedElement است.
Constraints
[1] Property importedMember از ElementImportها و PackageImportها مشتق میشود.
self.importedMember->includesAll(self.importMembers(self.elementImport.importedElement.asSet()->
union(self.packageImport.importedPackage->collect(p | p.visibleMembers()))))
Additional Operations
[1] Query getNamesOfMember() برای درنظرگرفتن import override میشود. این Query مجموعه نامهایی را برمیگرداند که یک Element در importing Namespace خواهد داشت: یا چون owned است، یا اگر owned نیست بهصورت منفرد import شده است، یا اگر منفرد import نشده از یک Package آمده است.
Namespace::getNamesOfMember(element: NamedElement): Set(String);
getNamesOfMember=
if self.ownedMember ->includes(element)
then Set{}->include(element.name)
else let elementImports: ElementImport = self.elementImport->select(ei | ei.importedElement = element) in
if elementImports->notEmpty()
then elementImports->collect(el | el.getName())
else
self.packageImport->select(pi | pi.importedPackage.visibleMembers()->includes(element))->
collect(pi | pi.importedPackage.getNamesOfMember(element))
endif
endif
[2] Query importMembers() تعیین میکند کدام PackageableElementها از یک مجموعه واقعاً به Namespace import میشوند. Elementهای hidden - یعنی آنهایی که نامشان با نام owned memberها conflict دارد - و همچنین Elementهایی که پس از import نام یکسان خواهند داشت حذف میشوند.
Namespace::importMembers(imps: Set(PackageableElement)): Set(PackageableElement);
importMembers = self.excludeCollisions(imps)->select(imp | self.ownedMember->forAll(mem |
mem.imp.isDistinguishableFrom(mem, self)))
[3] Query excludeCollisions() از یک مجموعه PackageableElement هر موردی را حذف میکند که در این Namespace از دیگری قابل تمایز نباشد.
Namespace::excludeCollisions(imps: Set(PackageableElements)): Set(PackageableElements);
excludeCollisions = imps->reject(imp1 | imps.exists(imp2 | not imp1.isDistinguishableFrom(imp2, self)))
Semantics
معناشناسی اضافی ندارد.
Notation
نمادگذاری اضافی ندارد.
11.7.4 PackageableElement
PackageableElement یک NamedElement را مشخص میکند که میتواند مستقیماً تحت مالکیت Package باشد.
Description
PackageableElement یک NamedElement را مشخص میکند که میتواند مستقیماً تحت مالکیت Package باشد.
Generalizations
Attributes
Attribute اضافی ندارد.
Associations
Association اضافی ندارد.
Constraints
Constraint اضافی ندارد.
Semantics
معناشناسی اضافی ندارد.
Notation
نمادگذاری اضافی ندارد.
11.7.5 PackageImport
PackageImport رابطهای است که اجازه میدهد با نامهای بدون qualification به memberهای Package از Namespaceهای دیگر ارجاع داده شود.
Description
PackageImport بهعنوان DirectedRelationshipی تعریف میشود که Packageای را شناسایی میکند که memberهای آن باید توسط یک Namespace import شوند.
Generalizations
DirectedRelationship، صفحه 106
Attributes
visibility: VisibilityKind - visibility مربوط به PackageableElementهای importشده را در importing Namespace مشخص میکند؛ یعنی تعیین میکند آیا Elementهای importشده بهنوبه خود برای Packageهای دیگری که importing Package را بهعنوان imported Package استفاده میکنند قابل مشاهده خواهند بود یا خیر. اگر PackageImport عمومی باشد Elementهای importشده بیرون Package قابل مشاهدهاند و اگر خصوصی باشد نیستند. مقدار پیشفرض visibility برابر public است.
Associations
importedPackage: Package[1] - Packageای را مشخص میکند که memberهای آن به Namespace import میشوند. زیرمجموعه DirectedRelationship::target است.
importingNamespace: Namespace[1] - Namespaceی را مشخص میکند که memberها را از Package import میکند. زیرمجموعه DirectedRelationship::source و Element::owner است.
Constraints
[1] Visibility مربوط به PackageImport فقط public یا private است.
self.visibility = #public or self.visibility = #private
Semantics
PackageImport رابطهای میان importing Namespace و Package است و نشان میدهد importing Namespace نام memberهای Package را به Namespace خودش اضافه میکند. از نظر مفهومی PackageImport معادل داشتن ElementImport جداگانه برای تکتک memberهای imported Namespace است، مگر اینکه ElementImport مستقلی از قبل تعریف شده باشد.
Notation
PackageImport با پیکان dashed دارای open arrowhead از importing Package به imported Package نمایش داده میشود. Keyword نزدیک پیکان dashed نوع PackageImport را مشخص میکند: «import» برای PackageImport عمومی و «access» برای PackageImport خصوصی.
Presentation Options
بهعنوان جایگزین پیکان dashed، متن داخل curly bracket زیر یا پس از نام Namespace میتواند imported Element را بهطور یکتا شناسایی کند. Syntax متن به این صورت است:
'{import ' <qualifiedName> '}' | '{access ' <qualifiedName> '}'
Examples
در شکل 11.24 چند PackageImport نشان داده شدهاند. Elementهای Types به ShoppingCart import شده و سپس بیشتر به WebShop import میشوند. اما Elementهای Auxiliary فقط از ShoppingCart access میشوند و از WebShop نمیتوان با نام بدون qualification به آنها ارجاع داد.
شکل 11.24 - نمونه PackageImportهای public و private
11.8 نمودار Operations
نمودار Operations از Package Constructs سازههای BehavioralFeature، Operation و Parameter را مشخص میکند.
شکل 11.25 - نمودار Operations از Package Constructs
11.8.1 BehavioralFeature
Description
Constructs::BehavioralFeature تعریف BehavioralFeature را از Abstractions::BehavioralFeatures دوباره استفاده میکند و specializationهایی به Constructs::Namespace و Constructs::Feature اضافه میکند.
Generalizations
Feature، صفحه 130
Namespace، صفحه 146
Attributes
Attribute اضافی ندارد.
Associations
ownedParameter: Parameter[*] - مجموعه مرتب formal parameterهای این BehavioralFeature را مشخص میکند. زیرمجموعه Namespace::ownedMember است.
raisedException: Type[*] - Typeهایی را ارجاع میدهد که Exceptionهای ممکن هنگام فراخوانی این Feature را نمایش میدهند.
Constraints
Constraint اضافی ندارد.
Additional Operations
[1] Query isDistinguishableFrom() تعیین میکند آیا دو BehavioralFeature میتوانند همزمان در یک Namespace وجود داشته باشند یا خیر. برای این کار signatureهای آنها باید متفاوت باشد.
BehavioralFeature::isDistinguishableFrom(n: NamedElement, ns: Namespace): Boolean;
isDistinguishableFrom =
if n.oclIsKindOf(BehavioralFeature)
then
if ns.getNamesOfMember(self)->intersection(ns.getNamesOfMember(n))->notEmpty()
then Set{}->include(self)->include(n)->isUnique( bf | bf.ownedParameter->collect(type))
else true
endif
else true
endif
Semantics
فهرست owned parameterها ترتیب، Type و direction آرگومانهایی را توصیف میکند که هنگام فراخوانی BehavioralFeature میتوان به آن داد یا هنگام پایان BehavioralFeature بازگرداند.
Owned parameterهایی با direction برابر in یا inout، Type و تعداد argumentهایی را تعریف میکنند که هنگام فراخوانی BehavioralFeature باید فراهم شوند. Owned parameter با direction برابر out، inout یا return Type argumentی را تعریف میکند که از فراخوانی موفق بازگردانده خواهد شد. BehavioralFeature ممکن است هنگام فراخوانی Exception ایجاد کند.
Notation
نمادگذاری اضافی ندارد.
11.8.2 Operation
Operation یک BehavioralFeature از Classifier است که نام، Type، Parameterها و Constraintهای فراخوانی یک Behavior مرتبط را مشخص میکند.
Description
Constructs::Operation تعریف Operation را از Basic دوباره استفاده میکند و specialization به Constructs::BehavioralFeature اضافه میکند.
Specification یک Operation مشخص میکند چه serviceای ارائه میدهد، نه اینکه آن service چگونه انجام میشود، و میتواند فهرستی از preconditionها و postconditionها را شامل شود.
Generalizations
BehavioralFeature، صفحه 150
Attributes
/isOrdered: Boolean - Property متناظر از Basic را بازتعریف میکند تا این اطلاعات از return result این Operation مشتق شود.
isQuery: Boolean - مشخص میکند آیا اجرای Operation state سیستم را بدون تغییر باقی میگذارد (isQuery=true) یا ممکن است side effect رخ دهد (isQuery=false). مقدار پیشفرض false است.
/isUnique: Boolean - Property متناظر از Basic را بازتعریف میکند تا این اطلاعات از return result این Operation مشتق شود.
/lower: Integer[0..1] - Property متناظر از Basic را بازتعریف میکند تا این اطلاعات از return result این Operation مشتق شود.
/upper: UnlimitedNatural[0..1] - Property متناظر از Basic را بازتعریف میکند تا این اطلاعات از return result این Operation مشتق شود.
Associations
bodyCondition: Constraint[0..1] - Constraint اختیاری بر result valueهای یک فراخوانی Operation. زیرمجموعه Namespace::ownedRule است.
postcondition: Constraint[*] - مجموعه اختیاری Constraintهایی که state سیستم را هنگام تکمیل Operation مشخص میکنند. زیرمجموعه Namespace::ownedRule است.
precondition: Constraint[*] - مجموعه اختیاری Constraintها بر state سیستم هنگام فراخوانی Operation. زیرمجموعه Namespace::ownedRule است.
raisedException: Type[*] - Typeهایی را ارجاع میدهد که Exceptionهای ممکن هنگام فراخوانی این Operation را نمایش میدهند. Basic::Operation::raisedException و BehavioralFeature::raisedException را بازتعریف میکند.
redefinedOperation: Operation[*] - Operationهایی را ارجاع میدهد که توسط این Operation بازتعریف شدهاند. زیرمجموعه RedefinableElement::redefinedElement است.
/type: Type[0..1] - Property متناظر از Basic را بازتعریف میکند تا این اطلاعات از return result این Operation مشتق شود.
Constraints
[1] یک Operation حداکثر میتواند یک return parameter داشته باشد؛ یعنی owned parameterی با direction برابر return.
ownedParameter->select(par | par.direction = #return)->size() <= 1
[2] اگر Operation return parameter داشته باشد، isOrdered برابر مقدار isOrdered همان Parameter است؛ در غیر این صورت false است.
isOrdered = if returnResult()->notEmpty() then returnResult()->any().isOrdered else false endif
[3] اگر Operation return parameter داشته باشد، isUnique برابر مقدار isUnique همان Parameter است؛ در غیر این صورت true است.
isUnique = if returnResult()->notEmpty() then returnResult()->any().isUnique else true endif
[4] اگر Operation return parameter داشته باشد، lower برابر مقدار lower همان Parameter است؛ در غیر این صورت تعریف نمیشود.
lower = if returnResult()->notEmpty() then returnResult()->any().lower else Set{} endif
[5] اگر Operation return parameter داشته باشد، upper برابر مقدار upper همان Parameter است؛ در غیر این صورت تعریف نمیشود.
upper = if returnResult()->notEmpty() then returnResult()->any().upper else Set{} endif
[6] اگر Operation return parameter داشته باشد، type برابر Type همان Parameter است؛ در غیر این صورت تعریف نمیشود.
type = if returnResult()->notEmpty() then returnResult()->any().type else Set{} endif
[7] bodyCondition فقط برای query Operation قابل مشخصشدن است.
bodyCondition->notEmpty() implies isQuery
Additional Operations
[1] Query isConsistentWith() برای هر دو Operation در contextی که redefinition ممکن است تعیین میکند آیا redefinition از نظر حفظ type covariance سازگار است یا خیر. ممکن است تعریفهای دیگری از consistency نیز لازم باشد؛ برای مثال برای تعیین سازگاری بر پایه contravariance. کاربران میتوانند Queryهای جایگزین را با نام متفاوت از isConsistentWith() تعریف کنند؛ برای مثال isContravariantWith().
Operation::isConsistentWith(redefinee: RedefinableElement): Boolean;
pre: redefinee.isRedefinitionContextValid(self)
isConsistentWith = (redefinee.oclIsKindOf(Operation) and
let op: Operation = redefinee.oclAsType(Operation) in
self.ownedParameter.size() = op.ownedParameter.size() and
forAll(i | op.ownedParameter[i].type.conformsTo(self.ownedParameter[i].type))
)
[2] Query returnResult() اگر return parameter وجود داشته باشد set شامل آن را برمیگرداند؛ در غیر این صورت set خالی میدهد.
Operation::returnResult() : Set(Parameter);
returnResult = ownedParameter->select (par | par.direction = #return)
Semantics
Operation روی instance Classifierی فراخوانی میشود که Operation Feature آن است. Static Operation روی Classifier مالک Operation فراخوانی میشود و بنابراین بدون instance قابل فراخوانی است.
Preconditionهای Operation شرایطی را تعریف میکنند که هنگام فراخوانی Operation باید true باشند. پیادهسازی Operation میتواند برقرار بودن این preconditionها را فرض کند.
Postconditionهای Operation شرایطی را تعریف میکنند که در صورت تکمیل موفق فراخوانی Operation و برقرار بودن preconditionها true خواهند بود. هر پیادهسازی Operation باید این postconditionها را برآورده کند.
bodyCondition مربوط به Operation return result را محدود میکند. تفاوت bodyCondition با postcondition این است که هنگام redefinition Operation میتوان bodyCondition را override کرد، درحالیکه در redefinition فقط میتوان postconditionهای بیشتری اضافه کرد.
Operation ممکن است هنگام فراخوانی Exception ایجاد کند. وقتی Exception رخ میدهد، نباید فرض کرد postconditionها یا bodyCondition مربوط به Operation برقرار هستند.
Operation میتواند در specialization Classifier دارای Feature بازتعریف شود. این redefinition میتواند Type formal parameterها یا return resultها را تخصصی کند، precondition یا postcondition جدید اضافه کند، raised exceptionهای جدید بیفزاید یا specification Operation را به شکل دیگری refine کند.
هر Operation اعلام میکند آیا اجرای آن state instance یا Element دیگری در Model را تغییر میدهد یا خیر؛ این موضوع با isQuery بیان میشود.
Semantic Variation Points
رفتار فراخوانی Operation در حالتی که precondition برقرار نباشد یک semantic variation point است.
وقتی Operationها در specialization بازتعریف میشوند، قواعد invariance، covariance یا contravariance مربوط به Typeها و preconditionها تعیین میکنند Classifier تخصصی میتواند جای Classifier parent عمومیتر خود قرار گیرد یا خیر. این قواعد در redefinition Operationها semantic variation point هستند.
Notation
اگر Operation در diagram نمایش داده شود، بهصورت رشتهای با فرم زیر است:
[<visibility>] <name> '(' [<parameter-list>] ')' [':' [<return-type>]
['{' <oper-property> [',' <oper-property>]* '}']]
که در آن:
<visibility> visibility Operation است؛ بخش VisibilityKind صفحه 88 را ببینید.
<visibility> ::= '+' | '-'
<name> نام Operation است.
<return-type> Type مربوط به return result parameter است، اگر Operation چنین Parameterی داشته باشد.
<oper-property> Propertyهای Operation را نشان میدهد:
<oper-property> ::= 'redefines' <oper-name> | 'query' | 'ordered' | 'unique' | <oper-constraint>
معانی آنها:
redefines <oper-name> یعنی Operation، Operation بهارثرسیده مشخصشده با <oper-name> را بازتعریف میکند.
query یعنی Operation state سیستم را تغییر نمیدهد.
ordered یعنی valueهای return parameter مرتباند.
unique یعنی valueهای برگشتی توسط Parameter duplicate ندارند.
<oper-constraint> Constraintی است که بر Operation اعمال میشود.
<parameter-list> فهرست Parameterهای Operation با قالب زیر است:
<parameter-list> ::= <parameter> [',' <parameter>]*
<parameter> ::= [<direction>] <parameter-name> ':' <type-expression>
['[' <multiplicity> ']'] ['=' <default>]
['{' <parm-property> [',' <parm-property>]* '}']
که در آن:
<direction> ::= 'in' | 'out' | 'inout'؛ در صورت حذف، مقدار پیشفرض in است.
<parameter-name> نام Parameter است.
<type-expression> expressionی است که Type Parameter را مشخص میکند.
<multiplicity> multiplicity Parameter است؛ بخش MultiplicityElement صفحه 65 را ببینید.
<default> expressionی است که value specification مربوط به default value Parameter را تعریف میکند.
<parm-property> مقدارهای Property اضافی را که بر Parameter اعمال میشوند مشخص میکند.
Presentation Options
Parameter list میتواند پنهان شود. Return result مربوط به Operation را میتوان بهصورت return parameter یا Type خود Operation بیان کرد. برای مثال:
toString(return : String)
همان معنا را دارد که:
toString() : String
Style Guidelines
نام Operation معمولاً با حرف کوچک آغاز میشود.
Examples
display ()
-hide ()
+createWindow (location: Coordinates, container: Container [0..1]): Window
+toString (): String
11.8.3 Parameter
Parameter مشخصه یک argument است که برای انتقال اطلاعات به داخل یا خارج یک فراخوانی BehavioralFeature استفاده میشود.
Description
Constructs::Parameter تعریفهای Parameter از Basic و Abstractions::BehavioralFeatures را ادغام میکند و specializationهایی به TypedElement و MultiplicityElement اضافه میکند.
Parameter نوعی TypedElement است تا بتوان multiplicity اختیاری برای Parameterها مشخص کرد. افزون بر این، از default value اختیاری پشتیبانی میکند.
Generalizations
TypedElement، صفحه 133
MultiplicityElement، صفحه 131
Attributes
default: String[0..1] - رشتهای را مشخص میکند که value مورد استفاده در صورت ارائهنشدن argument برای Parameter را نمایش میدهد.
direction: ParameterDirectionKind[1] - مشخص میکند Parameter به داخل یا خارج BehavioralElement فرستاده میشود. مقدار پیشفرض in است.
Associations
/operation: Operation[0..1] - Operationی را ارجاع میدهد که این Parameter formal parameter آن است. زیرمجموعه NamedElement::namespace است و Basic::Parameter::operation را بازتعریف میکند.
Constraints
Constraint اضافی ندارد.
Semantics
Parameter مشخص میکند argumentها چگونه به داخل یا خارج فراخوانی یک BehavioralFeature مانند Operation منتقل میشوند. Type و multiplicity Parameter محدود میکنند چه valueهایی، با چه تعداد و با چه وضعیت ordered بودن قابل انتقالاند.
اگر برای Parameter default مشخص شده باشد، در زمان فراخوانی ارزیابی میشود و اگر و تنها اگر در فراخوانی BehavioralFeature هیچ argumentی برای آن ارائه نشده باشد بهعنوان argument همان Parameter استفاده میشود.
Notation
به بخش Operation مراجعه کنید.
11.8.4 ParameterDirectionKind
ParameterDirectionKind یک Enumeration Type است که literalهای مورد استفاده برای مشخصکردن direction Parameterها را تعریف میکند.
Generalizations
Description
ParameterDirectionKind شامل literalهای زیر است:
in - valueهای Parameter توسط caller به داخل BehavioralElement فرستاده میشوند.
inout - valueهای Parameter توسط caller به داخل BehavioralElement فرستاده شده و سپس از BehavioralElement به caller بازگردانده میشوند.
out - valueهای Parameter از BehavioralElement به caller فرستاده میشوند.
return - valueهای Parameter بهعنوان return value از BehavioralElement به caller بازگردانده میشوند.
11.9 نمودار Packages
نمودار Packages از Package Constructs سازههای Package و PackageMerge را مشخص میکند.
شکل 11.26 - نمودار Packages از Package Constructs
11.9.1 Type
یادداشت - Propertyهای اضافی؛ بخش Type در صفحه 133 را ببینید.
Description
Constructs::Type در نمودار Classifiers تعریف میشود. نمودار Packages Association میان Type و Package را اضافه میکند که مالکیت Type توسط Package را نمایش میدهد.
Generalizations
NamedElement، صفحه 145
PackageableElement، صفحه 147
Attributes
Attribute اضافی ندارد.
Associations
package: Package[0..1] - در صورت وجود، Package مالک این Classifier را مشخص میکند. زیرمجموعه NamedElement::namespace است و Basic::Type::package را بازتعریف میکند.
Constraints
Constraint اضافی ندارد.
Semantics
معناشناسی اضافی ندارد.
11.9.2 Package
Package برای گروهبندی Elementها استفاده میشود و Namespaceی برای Elementهای گروهبندیشده فراهم میکند.
Description
Package یک Namespace برای memberهای خود است و میتواند Packageهای دیگری را دربر بگیرد. فقط PackageableElementها میتوانند owned member مستقیم یک Package باشند. از آنجا که Package یک Namespace است، میتواند memberهای منفرد Packageهای دیگر یا همه memberهای آنها را import کند.
افزون بر این، Package میتواند با Packageهای دیگر merge شود.
Generalizations
PackageableElement، صفحه 147
Namespace، صفحه 146
Attributes
Attribute اضافی ندارد.
Associations
/nestedPackage: Package[*] - owned memberهایی را ارجاع میدهد که Package هستند. زیرمجموعه Package::ownedMember است و Basic::Package::nestedPackage را بازتعریف میکند.
ownedMember: PackageableElement[*] - memberهایی را مشخص میکند که این Package مالک آنهاست. Namespace::ownedMember را بازتعریف میکند.
ownedType: Type[*] - owned memberهایی را ارجاع میدهد که Type هستند. زیرمجموعه Package::ownedMember است و Basic::Package::ownedType را بازتعریف میکند.
package: Package[0..1] - Package مالک یک Package را ارجاع میدهد. زیرمجموعه NamedElement::namespace است و Basic::Package::nestingPackage را بازتعریف میکند.
packageMerge: Package[*] - PackageMergeهایی را ارجاع میدهد که این Package مالک آنهاست. زیرمجموعه Element::ownedElement است.
Constraints
[1] اگر Elementی تحت مالکیت Package visibility داشته باشد، visibility آن public یا private است.
self.ownedElements->forAll(e | e.visibility->notEmpty() implies e.visibility = #public or e.visibility = #private)
Additional Operations
[1] Query mustBeOwned() مشخص میکند آیا Elementهای این Type باید مالک داشته باشند یا خیر.
Package::mustBeOwned() : Boolean
mustBeOwned = false
[2] Query visibleMembers() مشخص میکند کدام memberهای Package از بیرون قابل دسترسیاند.
Package::visibleMembers() : Set(PackageableElement);
visibleMembers = member->select( m | self.makesVisible(m))
[3] Query makesVisible() تعیین میکند Package یک Element را بیرون از خودش visible میکند یا خیر. Elementهای بدون visibility و Elementهای public visible میشوند.
Package::makesVisible(el: Namespaces::NamedElement) : Boolean;
pre: self.member->includes(el)
makesVisible =
-- the element is in the package
(ownedMember->includes(el)) or
-- it is imported individually with public visibility
(elementImport->
select(ei|ei.visibility = #public)->
collect(ei|ei.importedElement)->includes(el)) or
-- it is imported through a package with public visibility
(packageImport->
select(pi|pi.visibility = #public)->
collect(pi|
pi.importedPackage.member->includes(el))->notEmpty())
Semantics
Package یک Namespace و همزمان یک PackageableElement است که میتواند درون Packageهای دیگر قرار گیرد.
Elementهایی که با نام غیرqualified درون Package قابل ارجاعاند شامل owned elementها، imported elementها و Elementهای Namespaceهای دربرگیرنده یا outer هستند. Owned elementها و imported elementها هرکدام میتوانند visibility داشته باشند که تعیین میکند بیرون Package قابل دسترسیاند یا خیر.
Package مالک owned memberهای خود است؛ بنابراین اگر Package از Model حذف شود، Elementهایی که Package مالک آنهاست نیز حذف میشوند.
محتوای public یک Package همیشه از بیرون Package با استفاده از qualified name قابل دسترسی است.
Notation
Package بهصورت rectangle بزرگ با rectangle کوچکی - یک «tab» - متصل به سمت چپ بالای rectangle بزرگ نمایش داده میشود. Memberهای Package میتوانند داخل rectangle بزرگ نمایش داده شوند. همچنین میتوان memberها را با خطوط شاخهای به Elementهای member که بیرون Package رسم شدهاند نشان داد. در انتهای متصل به Namespace - Package - علامت plus داخل circle قرار میگیرد.
- اگر memberهای Package داخل rectangle بزرگ نشان داده نشوند، نام Package باید داخل rectangle بزرگ قرار گیرد.
- اگر memberهای Package داخل rectangle بزرگ نشان داده شوند، نام Package باید داخل tab قرار گیرد.
Visibility مربوط به Package Element را میتوان با قرار دادن visibility symbol پیش از نام Element نشان داد: + برای public و - برای private. Package elementهایی با visibility تعریفشده نمیتوانند protected یا package visibility داشته باشند.
Presentation Options
ابزار میتواند visibility را با marker گرافیکی مانند رنگ یا font نمایش دهد. همچنین میتواند فقط Elementهایی را که یک visibility level مشخص را برآورده میکنند نمایش دهد؛ برای مثال فقط publicها. Diagramی که Package و محتوای آن را نشان میدهد لازم نیست حتماً همه محتوا را نمایش دهد و میتواند بر اساس یک معیار فقط subsetی از Elementهای موجود را نشان دهد.
Elementهایی که در نتیجه PackageImport یا ElementImport برای استفاده در importing Package در دسترس میشوند، میتوانند رنگ متمایز داشته باشند یا dim شوند تا نشان داده شود قابل تغییر نیستند.
Examples
شکل 11.27 سه نمایش متفاوت از یک Package به نام Types را نشان میدهد. سمت چپ فقط Package را بدون نمایش memberها نشان میدهد؛ نمایش میانی برخی memberها را داخل مرز Package و نمایش سمت راست برخی memberها را با نمادگذاری جایگزین membership نشان میدهد.
شکل 11.27 - نمونههای یک Package همراه memberها
11.9.3 PackageMerge
PackageMerge مشخص میکند محتوای یک Package چگونه با محتوای Package دیگر توسعه مییابد.
Generalizations
DirectedRelationship، صفحه 106
Description
PackageMerge یک DirectedRelationship میان دو Package است که نشان میدهد محتوای آن دو Package باید با یکدیگر ترکیب شود. این سازوکار از این نظر بسیار شبیه Generalization است که source element از نظر مفهومی ویژگیهای target element را به ویژگیهای خودش میافزاید و نتیجه Elementی است که ویژگیهای هر دو را ترکیب میکند.
این سازوکار باید زمانی استفاده شود که Elementهای تعریفشده در Packageهای مختلف نام یکسان دارند و قرار است یک مفهوم واحد را نمایش دهند. معمولاً برای ارائه تعریفهای متفاوت از یک مفهوم مشخص برای اهداف مختلف و با شروع از یک base definition مشترک استفاده میشود. Base concept در incrementهای مختلف توسعه مییابد و هر increment در merged Package جداگانه تعریف میشود. با انتخاب اینکه کدام incrementها merge شوند، میتوان تعریف سفارشی یک مفهوم برای یک هدف مشخص بهدست آورد. PackageMerge بهویژه در meta-modeling مفید است و در تعریف UML metamodel بهطور گسترده استفاده میشود.
از نظر مفهومی PackageMerge را میتوان Operationی دانست که محتوای دو Package را میگیرد و Package جدیدی تولید میکند که محتوای Packageهای درگیر در merge را ترکیب کرده است. از نظر معناشناسی Model، میان مدلی با PackageMergeهای صریح و مدلی که همه mergeها در آن انجام شدهاند تفاوتی وجود ندارد.
Attributes
Attribute اضافی ندارد.
Associations
mergedPackage: Package[1] - Packageای را ارجاع میدهد که باید با receiving Package مربوط به PackageMerge merge شود. زیرمجموعه DirectedRelationship::target است.
receivingPackage: Package[1] - Packageای را ارجاع میدهد که با محتوای merged Package مربوط به PackageMerge توسعه مییابد. زیرمجموعه Element::owner و DirectedRelationship::source است.
Constraints
Constraint اضافی ندارد.
Semantics
PackageMerge میان دو Package مجموعهای از transformationها را ایجاب میکند که در آن محتوای Package مورد merge با محتوای receiving Package ترکیب میشود. در مواردی که Elementهای مشخصی در دو Package یک entity واحد را نمایش میدهند، محتوای آنها مطابق قواعد رسمی PackageMerge که در ادامه میآید بهطور مفهومی در یک resulting Element واحد merge میشود.
همانند Generalization، PackageMerge میان دو Package در Model فقط این transformationها را ایجاب میکند و خود نتیجهها بهصورت Elementهای جداگانه داخل Model درج نمیشوند. با این حال receiving Package و محتوای آن نماینده نتیجه merge در نظر گرفته میشوند؛ همانطور که Subclass یک Class نماینده aggregation Featureهای همه superclassهای خود است و نه صرفاً increment اضافهشده توسط خود Class. بنابراین در Model، هر reference به ModelElement موجود در receiving Package در واقع به نتیجه merge اشاره دارد، نه فقط increment فیزیکی داخل آن Package.
شکل 11.28 این موضوع را نشان میدهد. Packageهای P1 و P2 هر دو incrementهای متفاوتی از Class A را تعریف میکنند که بهترتیب P1::A و P2::A هستند. Package P2 محتوای P1 را merge میکند و در نتیجه increment P1::A در P2::A merge میشود. Package P3 محتوای P2 را import میکند تا Subclassی از A به نام SubA تعریف کند. در این حالت Element A در P3، یعنی P3::A، نتیجه merge P1::A در P2::A را نمایش میدهد، نه فقط increment P2::A. اگر Package دیگری P1 را import کند، reference به A در آن Package importکننده فقط increment P1::A را نمایش خواهد داد و نه A حاصل از merge.
شکل 11.28 - نمایش معنای PackageMerge
برای درک قواعد PackageMerge باید میان سه entity متمایز تفکیک روشن برقرار شود: merged increment - مانند P1::A در شکل 11.28 - receiving increment - مانند P2::A - و نتیجه transformationهای merge. دشواری اصلی این است که receiving Package و محتوای آن بسته به context هم operand و هم نتیجه PackageMerge را نمایش میدهند. برای مثال در شکل 11.28، از دید PackageMerge، P2 incrementی است که operand merge محسوب میشود، اما از دید Operation import، P2 نتیجه merge را نمایش میدهد. برای کاهش ابهام، اصطلاحات زیر استفاده میشوند:
- merged package - operand اول merge؛ Packageای که قرار است در receiving Package merge شود و در diagram target پیکان merge است.
- receiving package - operand دوم merge؛ Packageای که از نظر مفهومی نتایج merge را دربر میگیرد و در diagram source پیکان merge است. این اصطلاح برای Package و محتوای آن پیش از اجرای transformationهای merge استفاده میشود.
- resulting package - Packageای که از نظر مفهومی نتایج merge را دربر میگیرد. در Model همان receiving Package است، اما این اصطلاح برای Package و محتوای آن پس از اجرای merge بهکار میرود.
- merged element - ModelElementی که در merged Package وجود دارد.
- receiving element - ModelElementی در receiving Package. اگر matching merged element وجود داشته باشد، این دو برای تولید resulting element ترکیب میشوند. این اصطلاح به Element پیش از اجرای merge، یعنی خود increment، اشاره دارد.
- resulting element - ModelElementی در resulting Package پس از اجرای merge. برای receiving elementهایی که matching merged element دارند، همان receiving element است اما در state پس از merge. برای merged elementهایی که matching receiving element ندارند، همان merged element است. برای receiving elementهایی که matching merged element ندارند، همان receiving element است.
- element type - Type هر نوع TypedElement، مانند Type یک Parameter یا StructuralFeature.
- element metatype - Type مربوط به MOF برای یک ModelElement، مانند Classifier، Association یا Feature.
این terminology بر دیدگاه مفهومی PackageMerge استوار است که شکل شماتیک 11.29 آن را نشان میدهد؛ این شکل UML diagram نیست. Owned Elementهای Packageهای A و B همگی وارد Namespace Package B میشوند. با این حال این دیدگاه صرفاً وسیلهای برای توضیح معناشناسی PackageMerge است و در repository model منعکس نمیشود؛ حضور PackageMerge باعث هیچ transformation فیزیکی در خود Model نمیشود.
شکل 11.29 - دیدگاه مفهومی معناشناسی PackageMerge
معناشناسی PackageMerge با مجموعهای از Constraintها و transformationها تعریف میشود. Constraintها preconditionهای یک PackageMerge معتبر را مشخص میکنند و transformationها اثرهای معنایی یا postconditionهای آن را توصیف میکنند. اگر هر Constraint نقض شود، PackageMerge ill-formed است و Model نتیجه که آن را دربر دارد نامعتبر خواهد بود. Metatypeهای مختلف معناشناسی متفاوتی دارند، اما اصل عمومی همیشه یکسان است: resulting element پس از merge از قبل توانایی کمتری نخواهد داشت. برای مثال navigability، multiplicity، visibility و ویژگیهای مشابه receiving ModelElement در نتیجه PackageMerge کاهش نمییابد.
یکی از پیامدهای مهم این اصل آن است که ModelElementهای resulting Package extensionهای سازگار Elementهای متناظر در receiving Package mergeنشده و همان Namespace هستند. این قابلیت برای تعریف levelهای compliance در metamodel بسیار مفید است، بهگونهای که هر level بعدی با level قبلی و representation متناظر XMI سازگار باقی بماند.
در این مشخصات، transformationهای صریح merge فقط برای برخی metatypeهای عمومی که بیشتر در metamodelها دیده میشوند تعریف شدهاند؛ مانند Package، Class، Association و Property. معناشناسی merge برای metatypeهایی مانند state machine و interaction پیچیده و domain-specific است. Elementهای سایر metatypeها طبق قاعده پیشفرض transformation میشوند: بهصورت deep copy در resulting Package قرار میگیرند. این قاعده میتواند برای metatypeهای خاص توسط Profile یا سایر language extensionها override شود.
قواعد عمومی PackageMerge
Merged element و receiving element زمانی match میشوند که قواعد matching مربوط به metatype خود را برآورده کنند.
Constraints
- در dependency graph مربوط به
«merge» نباید cycle وجود داشته باشد.
- Package نمیتواند Packageای را merge کند که خودش در آن قرار دارد.
- Package نمیتواند Packageای را merge کند که آن را دربر گرفته است.
- Merged elementی که metatype آن از انواع Package، Class، DataType، Property، Association، Operation، Constraint، Enumeration یا EnumerationLiteral نیست، نمیتواند receiving elementی با همان نام و metatype داشته باشد، مگر اینکه receiving element کپی دقیق merged element باشد؛ یعنی هر دو یکسان باشند.
- PackageMerge اگر و تنها اگر همه Constraintهای لازم برای اجرای merge برقرار باشند معتبر است.
- Typed elementهای matching - مانند Property و Parameter - باید Typeهای conform داشته باشند. برای Typeهایی که Class یا DataType هستند، Type conform یا همان Type یا یک supertype مشترک است. در همه موارد دیگر conformance یعنی Typeها باید یکسان باشند.
- Receiving element نمیتواند reference صریح به هیچ merged element داشته باشد.
Transformations
- قاعده پیشفرض: merged element یا receiving elementی که matching element ندارد، بهصورت deep copy در resulting Package قرار میگیرد.
- نتیجه merge دو Element با نام و metatype matching که کپی دقیق یکدیگرند همان receiving element است.
- Elementهای matching مطابق transformation ruleهای مخصوص metatype خود ترکیب میشوند و نتیجه در resulting Package قرار میگیرد.
- همه type referenceهای TypedElementهایی که وارد resulting Package میشوند به referenceهای TypedElement متناظر در resulting Package تبدیل میشوند، نه incrementهای مربوط به آنها.
- برای همه Elementهای matching، اگر هر دو private visibility داشته باشند resulting element private است؛ در غیر این صورت public است.
- برای همه Classifier elementهای matching، اگر هر دو abstract باشند resulting element abstract است؛ در غیر این صورت non-abstract است.
- برای همه Elementهای matching، اگر هر دو non-derived باشند resulting element نیز non-derived است؛ در غیر این صورت derived است.
- برای همه MultiplicityElementهای matching، lower bound مربوط به resulting multiplicity کوچکترِ lower boundهای دو Element matching است.
- برای همه MultiplicityElementهای matching، upper bound مربوط به resulting multiplicity بزرگترِ upper boundهای دو Element matching است.
- هر stereotype که به ModelElement در merged element یا receiving element اعمال شده باشد، به resulting element متناظر نیز اعمال میشود.
قواعد Package
Elementهای از نوع Package بر اساس نام و metatype match میشوند؛ برای مثال Profile با Profile و Package عادی با Package عادی match میشود.
Transformations
- Nested Package موجود در merged Package به Nested Package همنام در resulting Package تبدیل میشود، مگر اینکه receiving Package از قبل Nested Package matching داشته باشد. در حالت دوم، nested Package مربوط به merged Package بهصورت recursive با nested Package matching در receiving Package merge میشود.
- ElementImport تحت مالکیت receiving Package به ElementImport متناظر در resulting Package تبدیل میشود. Imported elementها merge نمیشوند، مگر اینکه PackageMerge دیگری نیز به Package مالک imported element یا alias آن وجود داشته باشد.
قواعد Class و DataType
Elementهای از نوع Class یا DataType بر اساس نام و metatype match میشوند.
Transformations
- همه Propertyهای merged Classifier مطابق قواعد transformation Property که در ادامه آمده با receiving Classifier merge میشوند تا resulting Classifier تولید شود.
- Nested Classifierها مطابق همین قواعد بهصورت recursive merge میشوند.
قواعد Property
Elementهای از نوع Property بر اساس نام و metatype match میشوند.
Constraints
- ویژگی static یا non-static Propertyهای matching باید یکسان باشد.
- ویژگی uniqueness مربوط به Propertyهای matching باید یکسان باشد.
- Constraintهای مرتبط با Propertyهای matching نباید conflict داشته باشند.
- Redefinitionهای مرتبط با Propertyهای matching نباید conflict داشته باشند.
Transformations
- برای merged Propertyهایی که matching receiving Property ندارند، resulting Property یک Property تازهساختهشده در resulting Classifier است که با merged Property یکسان است.
- برای merged Propertyهایی که matching receiving Property دارند، resulting Property نام و ویژگیهای یکسان دارد، مگر جایی که این ویژگیها متفاوت باشند. در موارد اختلاف، ویژگیهای resulting Property با transformation rule مناسب تعیین میشوند.
- برای Propertyهای matching، اگر هر دو read-only باشند resulting Property نیز read-only است؛ در غیر این صورت not read-only است.
- اگر هر دو Property unordered باشند، resulting Property نیز unordered است؛ در غیر این صورت ordered است.
- اگر هیچیک از دو Property بهعنوان subset یک derived union مشخص نشده باشند، resulting Property نیز subset نخواهد بود؛ در غیر این صورت resulting Property subset همان derived union خواهد بود.
- Redefinitionهای متفاوت Propertyهای matching بهصورت conjunctive ترکیب میشوند.
- Constraintهای متفاوت Propertyهای matching بهصورت conjunctive ترکیب میشوند.
- اگر merged element یا receiving element یا هر دو non-unique باشند، resulting element non-unique است؛ در غیر این صورت unique است.
- Type مربوط به resulting Property به reference مربوط به Type متناظر در resulting Package تبدیل میشود.
قواعد Association
Elementهای از نوع Association بر اساس نام - حتی در حالت بدون نام - و association endهای خود match میشوند، به شرط اینکه endها بر اساس نام و Type match باشند؛ یعنی همان قاعده Property. این قواعد علاوه بر قواعد عادی Property هستند.
Constraints
- این قواعد فقط برای Associationهای دودویی اعمال میشوند. برای merge کردن Associationهای n-ary از قاعده پیشفرض استفاده میشود.
- اگر matching merged association end از نوع composite باشد، receiving association end نیز باید composite باشد.
- اگر matching merged association end تحت مالکیت Association باشد، receiving association end نیز باید تحت مالکیت Association باشد.
Transformations
- Merge Associationهای matching با merge کردن Association Classifierها بر اساس قواعد Classifier و merge کردن owned end Propertyهای متناظر مطابق قواعد Property و association end انجام میشود.
- برای association endهای matching، اگر هیچیک قابل پیمایش نباشند resulting association end نیز non-navigable است؛ در همه حالتهای دیگر resulting association end navigable است.
قواعد Operation
Elementهای از نوع Operation بر اساس نام، ترتیب Parameterها و Type Parameterها match میشوند و return type در matching دخالت ندارد.
Constraints
- Parameterها و Typeهای Operation باید همان قواعد Type و multiplicity تعریفشده برای Propertyها را رعایت کنند.
- اگر matching merged Operation یک query باشد، receiving Operation نیز باید query باشد.
Transformations
- برای merged Operationهایی که matching receiving Operation ندارند، resulting Operation در resulting Classifier Operationی با همان نام و signature خواهد بود.
- برای merged Operationهایی که matching receiving Operation دارند، resulting Operation نتیجه merge merged Operation و receiving Operation matching است و transformation Parameterها مطابق transformationهای Property انجام میشود.
قواعد Enumeration
Elementهای از نوع EnumerationLiteral بر اساس owning Enumeration و نام literal match میشوند.
Constraints
- EnumerationLiteralهای matching باید در همان ترتیب باشند.
Transformations
- EnumerationLiteralهای non-matching از merged Enumeration به انتهای receiving Enumeration متصل میشوند.
قواعد Constraint
Constraints
- Constraintها باید بهصورت متقابل non-contradictory باشند.
Transformations
- Constraintهای merged ModelElement بهصورت conjunctive به Constraintهای matching receiving ModelElement اضافه میشوند.
Notation
PackageMerge با خط dashed دارای open arrowhead نمایش داده میشود که از receiving Package - source - به merged Package - target - اشاره میکند. Keyword «merge» نیز نزدیک خط dashed قرار میگیرد.
شکل 11.30 - نمادگذاری PackageMerge
Examples
در شکل 11.31 Packageهای P و Q توسط Package R merge میشوند، درحالیکه Package S فقط Package Q را merge میکند.
شکل 11.31 - نمونه ساده PackageMergeها
Packageهای transformed شده R و S در شکل 11.32 نشان داده شدهاند. Expressionهای داخل square bracket مشخص میکنند کدام incrementهای منفرد برای تولید نتیجه نهایی merge شدهاند و نویسه @ operator مربوط به merge را نشان میدهد. این expressionها بخشی از نمادگذاری استاندارد نیستند و فقط برای توضیح در شکل آمدهاند.
شکل 11.32 - نمونه ساده Packageهای transformed پس از mergeهای شکل 11.31
در شکل 11.33 PackageMergeهای بیشتری با Package T معرفی میشوند. T پیش از اجرای Operation merge خالی است و Packageهای R و S که پیشتر تعریف شدهاند را merge میکند.
شکل 11.33 - معرفی PackageMergeهای اضافی
در شکل 11.34 نسخه transformed مربوط به Package T نمایش داده شده است. در این Package تعریفهای جزئی A، B، C و D همگی کنار هم قرار گرفتهاند. توجه کنید Typeهای endهای Associationهایی که ابتدا در Packageهای Q و S بودند، همگی بهروزرسانی شدهاند تا به Elementهای مناسب در Package T ارجاع دهند.
شکل 11.34 - نتیجه PackageMergeهای اضافی شکل 11.33
اعتبار ترجمه: ترجمه با کمک هوش مصنوعی. فروش یا انتشار این ترجمه منوط به داشتن مجوز لازم از صاحب حقوق اثر است.