制限のオブゞェクト蚀語およびメタモデルに぀いお少し

画像



私たちの意芋では、オブゞェクト制玄蚀語OCLは、モデリングに携わっおいるか、モデル指向の開発に興味があるすべおの人に知られるべきです。 しかし、圌は䞍圓にネットワヌク党般に泚意を奪われおおり、実際、ロシア語の情報セグメントは悲惚なものにすぎたせん。 それがどのような蚀語であり、なぜ必芁なのかは、この蚘事で説明されおいたす。 この蚘事は、基本的なもの、完党な範囲、定矩の正確さなどを装うものではありたせん。 そのタスク1この蚀語を聞いたこずがない人にOCLを玹介する簡単な䟋を通しお、2それを聞いたこずがない人のために、それを䜿甚する新しい方法を発芋するこずが可胜です。



構造的および远加の制限



䟋からすぐに始めたしょう。 Jiraなどのプログラムを開発しお、プロゞェクトやタスクを考慮し、これらのタスクを埓業員に分配するずしたす。 このようなプログラムのデヌタモデルは、このように非垞に単玔化されおいるように芋えたす。



画像



このような図を描いた埌、サブゞェクト゚リアに制限を課したした。埓業員、タスク、およびプロゞェクトのみがそこに存圚し、それらがたさにそのような属性を持ち、そのような接続で正確に接続できるこずを修正したした。 たずえば、サブゞェクト゚リアでは、埓業員には氏名ず生幎月日が必芁です。 ただし、タスクたたはプロゞェクトにそのような属性を含めるこずはできたせん。 たたは、タスクの実行者は埓業員にしかなれたせんが、別のタスクたたはプロゞェクトは実行者にはなれたせん。 これらは明らかなこずですが、そのようなモデルを䜜成するずき、制限を策定するこずを理解するこずが重芁です。 このような制玄は、構造的制玄ず呌ばれるこずもありたす。



ただし、倚くの堎合、ドメむンをモデル化するずきの構造的な制限では䞍十分です。 たずえば、プロゞェクトマネヌゞャヌが同時にプロゞェクトの参加者になれないずいう制限が必芁になる堎合がありたす。 さお、この制限はこの図には埓いたせん。 远加の非構造的な制限の他の䟋をキャッチ;-)で瀺したす。

  1. 研修生はプロゞェクトを管理できたせん
  2. プログラマヌは1぀のプロゞェクトを管理できたすが、他のプロゞェクトに参加するこずはできたせん。
  3. リヌドプログラマは、䞀床に2぀たでのプロゞェクトを管理できたす
  4. プロゞェクトにはリヌダヌが1人しかいたせん
  5. 完党な同名の人が1぀のプロゞェクトに参加するこずはできたせん
  6. 閉じたプロゞェクトに開いおいるタスクを含めるこずはできたせん実際の実行時間がある堎合、タスクは閉じられおいるず芋なされたす
  7. タスクに゚グれキュヌタヌを割り圓おる前に、蚈画実行時間を決定する必芁がありたす
  8. 終了する前に、タスクのスケゞュヌルされた実行時間を決定する必芁がありたす。
  9. 1぀のプロゞェクトの埓業員は、開いおいるタスクを1぀だけ持぀こずができ、すべおのプロゞェクトに察しお5぀以䞋のタスクしか持぀こずができたせん。
  10. 埓業員は法定幎霢でなければなりたせん
  11. 埓業員の名前は、スペヌスで区切られた3぀の郚分姓、名、および埌揎者で構成する必芁がありたすスペヌスを2重、3重などにするこずはできたせん
  12. リヌドプログラマヌがSigmundに電話できない
  13. タスクの実際の䜜業時間は、蚈画より2回を超えるこずはできたせん
  14. タスクをそのサブタスクにするこずはできたせん。
  15. タスクを完了する予定時間は、サブタスクの予定時間以䞊でなければなりたせん。
  16. ...自分でいく぀かの制限を考え出す...


たずめ



さたざたなモデリング蚀語を䜿甚しお、サブゞェクト領域に課される構造的制玄を蚘述するこずができたす。

  • オブゞェクトのタむプオブゞェクトは察応するクラスのむンスタンスにしかなれたせん埓業員はプロゞェクトプロパティを持぀こずができず、タスクは埓業員ずずもにテヌブルに保存するこずはできたせん、など。
  • 蚱容されるプロパティず関連付け。
  • タむプに぀いおプロパティは特定のタむプの倀のみを取るこずができたす。
  • 倚重床必芁なプロパティ/関連付けの倀を指定する必芁がありたす。耇数の「1」を持぀プロパティ/関連付けに぀いおは、いく぀かの倀を指定できたせんなど。


OCLなどの远加蚀語を䜿甚しお、远加の制限を説明できたす。


Eclipseを構成する



これらすべおを実際に詊しおみたい堎合は、Eclipseが必芁です。 そうでない堎合は、次のセクションに進みたす。

  1. Eclipse できればEclipse Modeling Toolsをダりンロヌドしお解凍したす。 すでにRational Software Architect 9.0Eclipseベヌスを䜿甚しおいる堎合は、それを䜿甚できたす。
  2. 必芁なラむブラリをむンストヌルしたす。

    • Eclipseの堎合。 メニュヌから[ヘルプ]-> [モデリングコンポヌネントのむンストヌル]を遞択したす。 衚瀺されるりィンドりで、「Graphical Modeling Framework Tooling」、「OCL Tools」、および「Ecore Tools」が干枉しないこずを遞択したす。
    • RSA 9.0の堎合。 org.eclipse.gmf.tooling.runtime _ *。Jarおよびorg.eclipse.ocl.examples.interpreter _ *。JarファむルをC\ Program Files \ IBM \ SDP \ plugins \フォルダヌにコピヌしたすむンストヌル、フォルダヌによっお異なりたす倚分少し違う。
  3. テストメタモデルでpm * .jarプラグむンをむンストヌルしたす。

    • Eclipseの堎合。 これらのファむルを「$ ECLIPSE_HOME / dropins」フォルダヌにコピヌしたす
    • RSA 9.0の堎合。 これらのファむルをフォルダヌ「C\ Program Files \ IBM \ SDP \ plugins \」にコピヌしたすむンストヌルによっお、フォルダヌは若干異なる堎合がありたす。 いく぀かのバグのため、dropinsフォルダヌは掚奚されたせん。
  4. Eclipseを再起動したす。 メニュヌから[ファむル]-> [新芏]-> [その他]を遞択し、怜玢バヌに「pm」ず入力したす。 「Pm Model」ず「Pm Diagram」が衚瀺されたす。
  5. テストモデルを自分で䜜成するか、 完成したものを䜿甚できたす。
  6. コン゜ヌルを開きたすりィンドり->ビュヌを衚瀺->その他...リストで「コン゜ヌル」を芋぀けたす。
  7. コン゜ヌルりィンドりで、[コン゜ヌルを開く]ドロップダりンリストを開き、その䞭の[むンタラクティブOCL]を遞択したす䞋図を参照。
  8. ダむアグラム䞊の任意のオブゞェクトを遞択し、コン゜ヌルの䞋郚に「self」ず入力しお、「Enter」を抌したす。 すべおが正しく構成されおいる堎合、次のようなものが衚瀺されたす。






メタモデルを䜿甚したプラグむンが機胜しない堎合は、 ゜ヌスコヌドから自分でコンパむルできたす。 RSA 9.0では、比范的叀いバヌゞョンのGMFを䜿甚しお動䜜したす。



䟋1。タスクを実行する予定時間は、サブタスクの予定時間以䞊でなければなりたせん。



OCLに぀いお最初に知っおおくべきこずは、制玄が垞にオブゞェクトの特定のクラスに適甚されるこずです。 OCLルヌルを蚘述する前に、このクラスを遞択する必芁がありたす。 時々、この遞択はあたり明癜ではありたせんが、今ではすべおが単玔です。ルヌルはタスクに適甚されたす。 self倉数を䜿甚しお、タスクの特定のむンスタンスにアクセスできたす。 タスクのプロパティの倀を取埗する必芁がある堎合は、倉数名の埌にポむントを曞き、このプロパティの名前を曞きたす。 同様に、関連付けの名前を指定できたす。 Eclipseで詊しおみおください。



ご泚意



䞍芁な問題を回避するために、モデル内のすべおのクラス、プロパティなど。 ラテン文字を䜿甚しお名前が付けられたす。 オヌトコンプリヌトを䜿甚しお、このプロパティたたはそのプロパティがどのように呌び出されるかを正確に調べるこずができたすCtrl + Spaceを抌しお呌び出したす。


最終的な制埡芏則を図に瀺したす。







OCLの初心者にずっおそれほど重芁なこずは、文字「。」ず「->」の違いです。

ポむントの埌に来るものは、倀たたはオブゞェクトのコレクション内の各芁玠を指したす。

矢印が倀たたはオブゞェクトのコレクション党䜓に適甚された埌に来るもの。

衚は、ポむントず矢印の䜿甚䟋をいく぀か瀺しおいたす。

OCL匏 OCL匏の解釈
self.plan_time 「Plan_time」プロパティの倀を取埗したす
自己。サブタスク 倚くのサブタスクを取埗する
self。サブタスク。 セット内の各サブタスクに぀いお、「Plan_time」プロパティの倀を取埗し、最終的に倚くのそのような倀を取埗したす
self。サブタスクTime_plan-> sum 倀のセット党䜓の合蚈を蚈算する
self.time_plan-> sum タスクはPlan_timeプロパティに察しお最倧で1぀の倀を持぀こずができるずいう事実にもかかわらず、この倀は暗黙的に単䞀の芁玠を持぀セットに倉換されたす。 sum挔算は、結果セットに適甚されたす。
ご泚意



collectおよびoclAsSet操䜜の説明に぀いおは、OCL仕様を参照しおください。


䟋2。プロゞェクトマネヌゞャヌは、プロゞェクトの参加者であっおはなりたせん。



図は、このルヌルのいく぀かの同等の定匏化を瀺しおいたす。プロゞェクト参加者のリストを取埗し、リヌダヌがいないこずを確認したす。







自己倉数は省略できたすが、暗黙的に暗瀺されたす。 ただし、䞀郚の操䜜select、exists、forAll、...は、远加の暗黙的な倉数むテレヌタヌを䜿甚しお新しいスコヌプを䜜成するこずに泚意するこずが重芁です。 同時に、プロパティチェヌンがどの暗黙倉数に属しおいるかを理解するのはかなり困難です。 そのような状況では、すべおの倉数たたは1぀を陀くすべおを明瀺的に指定するこずを匷くお勧めしたす。



䟋3。リヌドプログラマヌは、䞀床に2぀たでのプロゞェクトを管理できたす。



このようなルヌルを蚘述する初心者は、通垞、たず最初にOCL if-then-elseであるかどうかを尋ねたす。 はい、ありたすが、ほずんどのルヌルでは、代わりに含意を䜿甚する方が適切です。







含意の前提が停である堎合、残りの条件をチェックするこずさえしたせん。 そしお、真である堎合、埓業員が管理するプロゞェクトのリストを取埗し、クロヌズされたプロゞェクトをそれらから陀倖し、そのようなプロゞェクトの数が2぀以䞋であれば、条件が満たされおいるず考えたす。



䟋4。完党な同名の人は1぀のプロゞェクトに参加できたせん



これがおそらく最初の重芁なルヌルです。 埓業員ずプロゞェクトの䞡方から始めお、定匏化を詊みるこずができたす。 正しいクラスで開始するこずが重芁です:-) isUniqueオペレヌションの存圚がわからない堎合は、このようなタスクに最初に出䌚ったずきのように、モノステロむド構造のフレヌミングを開始できたす。







明瀺的な反埩子宣蚀をルヌル「y」倉数から削陀し、ルヌルの解釈を詊みたす。 個人的に、私は䜕が起こるかを正確に芚えおいたせん。 どの名前がアドレス指定されおいるかを明確に刀断するこずができないのは間違いかもしれたせん。 たたは、むテレヌタがselfよりも優先される堎合がありたす。 仕様を確認する必芁がありたす。 いずれの堎合でも、そのような状況を回避し、倉数を明瀺的に指定するこずをお勧めしたす。



ご泚意



むテレヌタは耇数にするこずができたす。 OCL仕様を芋お、OCLコン゜ヌルで実隓しおください。 仕様が操䜜isUniqueをどのように定矩するかを参照しおください。


䟋5。1぀のプロゞェクトの埓業員は、1぀の開いおいるタスクのみを持ち、すべおのプロゞェクトに察しお5぀以䞋のタスクを持぀こずができたす。



このルヌルでは、最初に開いおいるタスクのリストで倉数を宣蚀したす。 次に、2぀の条件を確認したす。 実際の実行時間が瀺されおいない堎合、タスクは開いおいるず芋なされたす。







このルヌルを定矩するのに最適なクラスは䜕だず思いたすか 埓業員たたはタスクの堎合



䟋6。タスクはそのサブタスクにはできたせん



図に描かれおいるルヌルの本質をすぐに理解しなかった堎合、これは非垞に自然なこずです。 䞀方では、オブゞェクトのクラス「タスク」があり、他方では、タスクには芪タスクを瀺す関連付け「タスク」がありたす。 さたざたな方法でクラスおよびプロパティ/関連付けに名前を付けるこずをお勧めしたす。これにより、モデルの品質が向䞊し、OCLルヌルの理解が容易になりたす。







「額」ルヌルを実装するこずから始めたしょう。 特定のタスクの関連付け「問題」がタスク自䜓を瀺しおいるかどうかを確認したしょう「self。Task <> self」。 図では、自己倉数ぞの明瀺的な参照を削陀したした。 これは臎呜的ではないように思われたすが、OCL匏では、プロパティたたは関連付けだけでなく、クラスも参照できたす。 たずえば、次の匏を䜿甚するず、すべおのタスクのリスト「Task.allInstances」を取埗できたす。 この䟋では、OCLむンタヌプリタヌは、クラスではなく「タスク」ア゜シ゚ヌションであるず刀断する可胜性が高くなりたす。 しかし、繰り返したすが、このようなあいたいさを避けるこずをお勧めしたす。



この芏則の2番目の欠点は、サブタスクが独自のサブタスクを持぀こずができるこずを考慮しおいないこずです。 タスクは、そのサブタスクのサブタスクであるこずが簡単にわかりたす。 そうでないこずを確認するには、ルヌプたたは再垰関数が必芁になる堎合がありたす。 しかし、OCLにはルヌプはなく、関数を䜿甚するずすべおが非垞に単玔になるわけではありたせん。 しかし、玠晎らしいClosure操䜜がありたす。 この操䜜はコレクションに察しお定矩されおいるため、ドットではなく矢印を前に眮く必芁がありたす。 コレクションの各芁玠に぀いお、closureオペレヌションは匕数ずしお指定された匏を評䟡し、取埗した倀をコレクションに結合したす。その各芁玠に察しおこの匏を再床評䟡し、取埗した倀を結果のコレクションに远加したす。



self.->union(self..)->union(self...)->union(...)
      
      





図は、それぞれ芪タスクずサブタスクの再垰に基づいたルヌルの2぀のバヌゞョンを瀺しおいたす。 最良の遞択肢は䜕だず思いたすかトリックの質問。



ご泚意



確かに、遅かれ早かれサむクルが必芁になりたす。 ほずんどの堎合、代わりにコレクションに定矩された操䜜select、exists、...を䜿甚できたす。



それでもルヌプが必芁な堎合は、次のようなものを詊すこずができたす。



 Sequence{1..10}->collect(...)
      
      





iterate操䜜にも泚意しおください。



䟋No.7。埓業員の名前は、スペヌスで区切られた3぀の郚分姓、名、愛甚者で構成する必芁がありたすスペヌスを2重、3重などにするこずはできたせん



明らかに、このようなルヌルは正芏衚珟を䜿甚しお実装するのが最も簡単です。 ただし、 OCL仕様にはそれらを操䜜する操䜜はありたせん。 図では、正芏衚珟を䜿甚しないこのようなルヌルの実装䟋を瀺しおいたす。 幞いなこずに、暙準のOCLラむブラリは拡匵可胜であり、䞀郚の実装では、matches操䜜がただ存圚するか、自分で実装するこずができたす。







OCLコンストラクト



確認したすべおのOCL匏は、Basic OCLEssential OCLで蚘述されおいたす。 ずころで、それらはどのように違うず思いたすか私たちが䜿甚した䞻な構造をリストしたす



完党なOCLには、詳现に怜蚎しない远加の構造がいく぀かありたすが、仕様を読むこずでそれらに慣れるこずができたす。



宿題



OCL仕様を参照しおください。



プリミティブデヌタタむプ、コレクションのタむプ倚数、シヌケンスなどを理解したす。 OCLで日付ず時刻を操䜜するためのプリミティブ型がないのはなぜだず思いたすか ただ必芁な堎合はどうしたすか



Basic OCL、Essential OCL、Complete OCLの違いを理解したす。



他のOCLルヌルを自分で実装し、Eclipseでチェックしたす。



蚘事に蚘茉されおいるすべおのOCL匏は、trueたたはfalseの倀のみを取るこずができたす。 ずころで、あなたはこの声明に同意したすかあなたの意芋では、OCL匏は倀の数倀範囲、戻り文字列、倀のセットたたはオブゞェクトを持぀こずができたすか このような非ブヌルOCL匏はどのように䜿甚できたすか



あなたの意芋では、OCL匏の蚈算結果は別のOCL匏になりたすか



ボヌナス メタモデルに぀いお少し



以前に行ったこずは、モデルの制限を説明し、特定の埓業員、タスク、およびプロゞェクトに関するこれらの制限を確認するこずだけです。 たずえば、プロゞェクトマネヌゞャヌが同時にプロゞェクトの参加者になるこずはできないずいうルヌルを説明したした。 さらに、すべおのプロゞェクトず埓業員䞀般に察しおこのルヌルを説明したした。 そしお、圌らは特定のプロゞェクトず埓業員のためにそれをチェックしたした。



䟋No. 1.メタモデル「Employee-Task-Group」


それでは、1぀䞊のレベルに進みたしょう。 たずえば、タクシヌの泚文サヌビスのために、別のアプリケヌションを開発したす。 同様のデヌタモデルがありたす。 埓業員の代わりに、タスクの代わりにドラむバヌ、泚文、そしおプロゞェクトの代わりに郜垂がいるようにしたす。 もちろんこれは非垞に条件付きの䟋ですが、アむデアを実蚌するためにのみ必芁です。 たたは、たずえば、医垫に予玄するためのアプリケヌションを開発する必芁がありたす。 医垫、郚門、レセプションがありたす。



これらすべおのモデルを芋お、それらの䞀般的なパタヌンを芋るこずができたす。 プログラマヌ、ドラむバヌ、医垫は基本的に同じものであり、埓業員です。 オヌダヌ、レセプション-これは、芁玄するず、単なるタスクです。 さお、垂、支郚、プロゞェクトを芁玄したしょう。 それらを単なるグルヌプず呌びたす。 埓業員ずタスク間の接続は実行ず呌ばれたす。 埓業員ずグルヌプ間の぀ながりは参加ず呌ばれたす。







そのような絵を描いお、あなたず私は䞻題領域の新しいレベルの認識に達したした-私たちはメタモデルを開発したした、私たちはそのようなモデルを蚘述するこずができる蚀語です。



蚘事の最初の郚分で䜜成したモデルが、察象領域のオブゞェクトに関する情報に構造的および非構造的制限を課したこずを思い出しおください。



同様に、メタモデルは、このメタモデルに埓っお構築されたモデルに構造的および非構造的制玄を課したす。 たずえば、このメタモデルに察応するモデルでは、図で赀でマヌクされたメタクラスに基づいた芁玠のみが存圚できたす。 たずえば、クラス「Building」、「Road」、たたは埓業員、タスクなどではない類䌌のものは、モデルに衚瀺できたせん。



ご泚意



ずころで、メタモデルはメタメタモデルMOF、Ecoreなどに基づいお構築されたす。 興味がある堎合は、OMG MOF仕様をお読みください。 䞀般的なケヌスでは、シミュレヌションレベルの数は任意ですが、通垞は2〜3で十分です。



ずころで、MOF自䜓が構築されたメタメタモデルに基づいおどう思いたすか



脳の脱臌を恐れない堎合は、蚘事Dragan Djuric、DraganGaÅ¡evic、およびVladanDevedÅŸic「The Tao of Modeling Spaces」を読んでください私は個人的に圌らの苗字から脳の脱臌がありたす。 抂しお、゜フトりェアを開発するずき、すべおはモデルであり開発者の心の䞭の粟神的なむメヌゞから゜ヌスコヌド、ドキュメント、テストスクリプトなど、開発プロセスは䞀郚のモデルを他のモデルに倉換するこずです。 モデル倉換のトピックに぀いおは、埌続の蚘事で開瀺する予定です。


あなたの意芋では、䞊の図に瀺されおいるモデル緑の長方圢、青い線はメタモデル赀い長方圢に察応しおいたすか



明らかに、構造的制玄に加えお、メタモデルには非構造的制玄が含たれる堎合がありたす。 埌者に぀いおは、OCLで再び説明できたす。 このようなルヌルの䟋を図に瀺したす。







ご泚意



実際、この写真はあたり正確ではありたせん。 本栌的なメタモデルの代わりに、UMLプロファむルがここで䜿甚されたす。これは、厳密に蚀えば、UMLメタモデルに基づいお構築された通垞のUMLモデルですこれは、MOFメタメタモデルに基づいお構築されたす。 ただし、実際には、メタモデルは倚くの堎合れロからではなく、UMLプロファむルの圢匏で構築されたす。 たずえば、 ISO 20022暙準では、メタモデルは2぀の同等のバヌゞョンで実装されおいたす。1Ecoreに基づく本栌的なメタモデル、2UMLプロファむル。 この蚘事の目的の芳点から、これらのニュアンスはそれほど重芁ではないため、UMLプロファむルを「メタモデル」ず芋なしたす。


䟋2。メタモデル「Entity-Attribute-Link」


䞊蚘のメタモデルは少し人工的で䟡倀がないように芋えたす。 より適切なメタモデルを構築しおみたしょう。 リレヌショナルデヌタベヌスのデヌタ構造を蚘述できる蚀語を開発する必芁があるずしたす。 この堎合、参加者、タスク、プロゞェクトなどの違い。 それほど重芁ではありたせん。 これらはすべお、属性を持぀こずができ、関係によっお盞互接続される゚ンティティです。 この䟋では、1察倚、倚察倚の2皮類の関係がありたす。 このようなメタモデルのメタクラスは、図の赀い長方圢で説明されおいたす。 図に瀺されおいるモデル緑色の長方圢、青色の線はメタモデルに察応するず思いたすか このモデルの各芁玠は、メタクラスの1぀に属するこずができたすか







さお、最埌に緎習に移りたしょう。 このために、Rational Software Architectを䜿甚したす。適切なUML゚ディタヌを䜿甚できたす。 無料でむデオロギヌ的に正しいパピルスの䟋ですべおを衚瀺できたすが、残念ながら、あたり䟿利ではありたせん。



そのため、UML゚ディタヌで新しい空のプロゞェクトを䜜成したす。 以䞋のステレオタむプを䜿甚しおUMLプロファむルを䜜成したす。







ご泚意



Attributeステレオタむプのプロパティに泚意しおください。 これは、モデル内の任意の属性が持぀こずができるプロパティのリストです。


次に、次のUMLモデルを䜜成し、䜜成したばかりのプロファむルを適甚し、必芁なステレオタむプを適甚したす。 これをすべお䜜成するのが面倒な堎合は、 完成したプロゞェクトを取埗できたす。







倧たかに蚀えば、「メタモデル」に埓っおモデルを構築したした。 モデルの各芁玠は、「メタモデル」のメタクラスの「むンスタンス」です。



ご泚意



繰り返したすが、厳密に蚀えば、そうではありたせん。 そしお、プロファむル、ステレオタむプ、モデル、およびモデルのすべおの芁玠-䜜成したものはすべお、UMLメタモデルのメタクラスのむンスタンスです。 ぀たり プロファむルずそれを䜿甚するモデルの䞡方が同じレベルのモデリングにありたす。 しかし、実甚的な芳点からは、このプロファむルを「メタモデル」ず芋なすこずができ、それに埓っおモデルが䜜成されたした。 これが䜕であるかを理解し、メタモデルが䜕であるかを理解したら、もう1぀のステップがありたす-ダむアグラムの長方圢ず線が䜕であるかを理解し、モデリングの芳点からxmiファむルが䜕であるかを理解したす。 䞊蚘の蚘事はこれに圹立ちたす。


次に、OCLのメタモデルの远加の制限に぀いお説明したす。 たずえば、属性ぱンティティに属しおいる必芁がありたす。 プロファむルではなく、本栌的なメタモデルの圢でメタモデルを䜜成した堎合、このルヌルは非垞に単玔になりたす。



 owner.oclIsKindOf(Entity)
      
      





さらに、そのようなルヌルを蚘述する必芁さえありたせん。 AttributeずEntityの間に所有者の関連付けを䜜成するだけで、原則ずしお他のタむプの芁玠をバむンドするこずはできたせん。



ただし、メタモデルはUMLプロファむルずしお䜜成されたため、ルヌルが必芁であり、䞀芋したずころ、ささいなこずではありたせん。



 base_Property.class.getAppliedStereotype('PMProfile::Entity') <> null
      
      





このルヌルは、UMLメタクラス「プロパティ」を拡匵する属性ステレオタむプに適甚されたす。 これは、モデル内でAttrbiuteステレオタむプのむンスタンスを䜕らかのプロパティUMLメタクラス「Property」のむンスタンスにバむンドできるこずを意味したす。 埌者では、特定の倀minLength、maxLength、およびpatternを蚭定できたす。 䞊蚘で䜜成したOCLルヌルは、Attributeステレオタむプのこのむンスタンスのみをチェックしたす。



base_Propertyプロパティを䜿甚しお、ステレオタむプのむンスタンスからプロパティに移動したす。 次に、クラスの関連付けを介しお、プロパティが属するクラスに移動したす。 そしお最埌に、ステレオタむプ「Entity」がこのクラスに適甚されおいるかどうかを確認したす。



ご泚意



これが仕様にどの皋床察応するかはわかりたせんが、ステレオタむプのむンスタンスずUMLメタクラスこの堎合はbase_Propertyのむンスタンスずの関連付けを省略できる堎合がありたす。これは暗黙的にselfずしお暗瀺されたす。


ご泚意



質問がある堎合、クラスの関連付けを䜿甚する必芁があるこずをどのように芋぀けたしたか。2぀の方法がありたす。1EclipseでのオヌトコンプリヌトCtrl +スペヌスおよび2 OMG UML仕様 。


䞊蚘のルヌルでは、EclipseベヌスのUML゚ディタヌに暙準のトリックを䜿甚しおいたす。 ただし、getAppliedStereotype操䜜はOCLの非暙準の拡匵機胜であり、他のツヌルではサポヌトされおいない堎合がありたす。 同じルヌルを次のように曞くこずができたす。



 class.extension_Entity->notEmpty()
      
      





プロパティが属するクラスに、Entityステレオタむプに基づく拡匵機胜ずの接続extension_Entityア゜シ゚ヌションを介しおがあるかどうかを確認したす。



ご泚意



2番目のオプションは、理論的には暙準ずより敎合性がありたす。 ただし、Eclipseの叀いバヌゞョンでは問題が発生する可胜性があるため、最初のオプションを䜿甚するこずをお勧めしたす。






ご泚意



プロファむル内で、base_Property、extension_Entity、およびクラスの関連付けを芋぀けおください。


図は、さらに3぀のルヌルを瀺しおいたす。

  1. 属性にはタむプが必芁です。
  2. 1察倚の関係では、䞀方の端の倚重床は1以䞋で、もう䞀方の端の倚重床は1以䞋でなければなりたせん。
  3. ゚ンティティに属するすべおのプロパティは、通垞の属性たたは関係ロヌルのいずれかでなければなりたせん。


モデルをUMLプロファむルずしおではなく、MOFに基づくメタモデルずしお䜜成した堎合、これらのルヌルを通垞の構造䞊の制限に眮き換えるこずは可胜だず思いたすか



MOFずEcoreは互いに非垞に䌌おいたす。 根本的に異なるメタメタモデルを想像できたすか



メタモデルの制玄の䟋


以䞋は、䜜成した1぀の実際のメタモデルからの最も単玔で最も耇雑なルヌルの䟋です。 䞀方で、これはもちろんひどいコヌドの䟋ですが、他方では、いく぀かのOCL構成䜓のデモンストレヌションです:-)



ADTコンポヌネントの最倧再珟性は0より倧きい必芁がありたす。



 upper > 0
      
      





制玄関係を通じお継承されるADTコンポヌネントは、芪タむプの察応するコンポヌネントず同じ䜍眮にある必芁がありたす。



 datatype.generalization->exists( getAppliedStereotype('SomeProfile::restriction') <> null) implies ( let parent : DataType = datatype.general->any(true).oclAsType(DataType) in let props : OrderedSet(Property) = parent.ownedAttribute-> select(getAppliedStereotype('SomeProfile::Component') <> null) in let cur : Property = props->select(x|x.type=self.type)->any(true) in cur <> null implies ( let prevEnd : Integer = props->indexOf(cur) - 1 in prevEnd = 0 or ( let allPrev : OrderedSet(Property) = props->subOrderedSet(1, prevEnd) in let requiredPrev : OrderedSet(Property) = allPrev->select(lower > 0) in requiredPrev->isEmpty() or ( let prevStart : Integer = allPrev->indexOf(requiredPrev->last()) in let allowedPrev : OrderedSet(Property) = allPrev-> subOrderedSet(prevStart, allPrev->size()) in let index : Integer = datatype.ownedAttribute-> indexOf(self.oclAsType(Property)) in index > 1 and ( let selfAllPrev : OrderedSet(Property) = datatype.ownedAttribute-> subOrderedSet(1, index - 1)-> select(getAppliedStereotype('SomeProfile::Component') <> null) in selfAllPrev->isEmpty() or ( let prevType : Type = selfAllPrev->last().type in allowedPrev->exists(x|x.type=prevType)))))))
      
      





OCLが必芁な理由



プロファむルたたはメタモデルの制埡ルヌル-あなたはすでにこれに関するすべおを知っおいたす。



モデル内の制埡ルヌル-そしおそれも。



操䜜および蚈算されたプロパティの仕様-OCL仕様を読むこずで、これを自分で知るこずができたす。



モデル倉換 QVT 、 MOF M2T -これに぀いおは、以䞋の蚘事で説明したす。



存圚の意味の認識-このために、最初の絵を黙想しおください。 む゚スをどこに匕き寄せたすか そしおマトリックス



All Articles