JP2005530238A - 動的モデル/コード結合を提供するシステム、方法、および媒体 - Google Patents

動的モデル/コード結合を提供するシステム、方法、および媒体 Download PDF

Info

Publication number
JP2005530238A
JP2005530238A JP2004513930A JP2004513930A JP2005530238A JP 2005530238 A JP2005530238 A JP 2005530238A JP 2004513930 A JP2004513930 A JP 2004513930A JP 2004513930 A JP2004513930 A JP 2004513930A JP 2005530238 A JP2005530238 A JP 2005530238A
Authority
JP
Japan
Prior art keywords
code
model
source code
elements
modified
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2004513930A
Other languages
English (en)
Inventor
オータル,エイモス
シャレヴ,エイブラハム
Original Assignee
アイ−ロジックス・インコーポレイテッド
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by アイ−ロジックス・インコーポレイテッド filed Critical アイ−ロジックス・インコーポレイテッド
Publication of JP2005530238A publication Critical patent/JP2005530238A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/36Software reuse
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/20Software design
    • G06F8/24Object-oriented
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/34Graphical or visual programming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/35Creation or generation of source code model driven
    • G06F8/355Round-trip engineering

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Transition And Organic Metals Composition Catalysts For Addition Polymerization (AREA)
  • Devices For Executing Special Programs (AREA)
  • Dental Preparations (AREA)
  • Adhesives Or Adhesive Processes (AREA)
  • Auxiliary Devices For Music (AREA)

Abstract

ソース・コードを、そのソース・コードを表している、モデルの複数の要素に関連付けるシステム、方法、および媒体が提供される。コンピュータ・コードの部分が、1つまたは複数のモデル要素に関連付けられる。ソース・コードを修正して、1つまたは複数の修正されたモデル要素に対応させる。修正されたソース・コードの少なくとも一部分を、オプショナルで、表示することができる。

Description

本発明の実施形態は、主に、ソフトウェア・エンジニアリングに関し、より詳細には、ソフトウェア・コードをソフトウェア・コードのモデル・ビューに同期(または、実質的に同期)させる、かつ/または、ソフトウェア・コードのモデル・ビューをソフトウェア・コードに同期(または、実質的に同期)させるためのシステム、方法、および媒体に関する。
本出願は、参照により本明細書に組み込まれる米国特許仮出願第60/387581号明細書(2002年6月12日出願)を基礎とする優先権を主張する。
知られている従来のソフトウェア開発ツールは、一般に、コードに注釈(たとえば、コメント)を埋め込み、その注釈をモデルのリポジトリの一部としてコードに関連付けることによって、モデル/コード結合を達成する。本方法は、主に、モデルとコードとの整合をとるものであるが、クラス間のUML(商標)(統一モデリング言語)関係に対するアクセッサおよび/またはミューテータを生成するなどといった、複雑な実装スキームを使用する能力はない。UML(商標)は、Object Management Group(商標)(在マサチューセッツ州ニードハム(Needham、MA))で開発された仕様である。
周知のとおり、UML(商標)では、システムの構造(コンストラクト)やシステム間の関係を表現する複数のビューを提供することを目的として、様々なグラフィカル要素を使用してこれらを図にまとめる。この複数のビューがモデルを構成し、それによって、想定されるシステムの動作が記述される。このモデルは、システムを実装する方法を示すものではない。
UML(商標)モデルには、9つの図を含めることができる。即ち、クラス図、オブジェクト図、ユースケース図、状態図、シーケンス図、アクティビティ図、コラボレーション図、コンポーネント図、および配置図である。どのUML(商標)モデルでも必ずしもすべての図が必要というわけではない。また、これら9つの基本的な図から別のUML(商標)図を派生させることもできる(たとえば、2つ以上の図やこれらの一部を組み合わせて別の図を作成することができる)。
従来のシステムでは複雑な実装スキームを使用できない理由の1つは、コードの単一ブロックで、全タイプのUML(商標)モデル要素(たとえば、状態マシン)を実装したり、たとえば、クラス間のUML(商標)関係に対するアクセッサおよび/またはミューテータを生成したりできないという点にある。ツールの中には、たとえば、クラス上のマクロを呼び出して属性にgetter(ゲッタ)およびsetter(セッタ)を追加することにより、モデルを単純な構造(コンストラクト)(たとえば、属性、操作)で埋めるプロセスを自動化して、特定の制限を緩和することができるものもある。
しかしながら、本願発明者らは、これらの回避手法では別の制限や不備が生じることを確認した。特に、これらの手法では、追加コンストラクト(構造)のコンテキスト(文脈)が、全体としては、あるいは適切には維持されない。たとえば、属性名を変更したときにgetterとsetterのシグネチャ(署名)が更新されない可能性があり、結果として、コードとそれに関連付けられたモデルとの間の結合性、および/またはモデルとそれに関連付けられたコードとの間の結合性が低下することになる。
図1は、参照により本明細書に組み込まれる米国特許出願公開公報第2002/0108101号で開示された従来技術のソフトウェア開発ツールの概要を示す図である。図1に示すように、ソース・コード102は、グラフィカル形式104とテキスト形式106との両方の形式で表示されている。このソフトウェア開発ツールは、ソース・コード102の言語中立表現を記憶するトランジェント・メタモデル(TMM)100を生成する。ソース・コード102のグラフィカル表現104およびテキスト表現106は、TMM100における言語中立表現から生成される。あるいは、ソース・コードのテキスト・ビュー106を、ソース・コード・ファイルから直接取得することも可能である。表示104および106上で行われる修正は、表示104および106を修正するように見えるが、実際には、すべての修正が、インクリメンタル・コード・エディタ(ICE)108を介して、ソース・コード102に対して直接行われ、TMM100は、ソース・コード102に対する修正から、グラフィカル・ビュー104およびテキスト・ビュー106の両方での修正を生成するために使用される。
このソフトウェア開発ツールは、同時ラウンドトリップ(往復)・エンジニアリングを実現する。つまり、グラフィカル表現104はテキスト表現106と同期する。したがって、グラフィカル表現104を介してソース・コード102を変更すると、テキスト表現106が自動的に更新される。同様に、テキスト表現106を介してソース・コード102を変更すると、グラフィカル表現204が更新され、同期が維持される。
ただし、米国特許出願公開公報第2002/0108101号は、本願明細書で説明するコードおよびモデルの更新手続きを教示も提案もしていない。本願明細書では、たとえば、モード・ベース・アプローチを用いてモデル/コード結合を達成するコードおよびモデルの更新手続きを説明している。さらに、コードをリポジトリ(格納部、貯蔵庫)の一部として組み込み、たとえば、従来行われているようにコード内における注釈を使用して設計コンテキスト(文脈)を提供することによってモデル/コード結合を達成する代わりに、本発明の1つまたは複数の実施形態は、コード変更および/またはモデル変更の検出および管理を用いることによってモデル/コード結合を達成するシステム、方法、および媒体を提供する。
本発明の1つまたは複数の実施形態によれば、動的モデル/コード結合は、たとえば、ラプソディ(Rhapsody)のUML(商標)(統一モデリング言語)モデルとそれらの実装コードとを自動的に同期させるメカニズムを提供する。これにより、最新の実装コードを即座に表示でき、また、コードを手動で変更した場合にモデルがただちに更新されるようにすることができる。
本発明の少なくとも1つの実施形態では、標準的なブラウザと画面表示を使用できる。たとえば、画面の右側にUML(商標)シーケンス図を表示し、画面の左上にアクティブ・コード・ビューを表示することができる。本願明細書において用いられているように、アクティブ・コード・ビューは、選択されたモデル要素に対応するコードを表示するために用い得る表示領域である。たとえば、ユーザがメソッド(たとえば、setup())を選択すると、アクティブ・コード・ビューでは、(更新が必要な場合)メソッドsetup()の実装が自動的に更新され、当該メソッドの実行が表示される。逆に、ユーザがシーケンス図内のメソッドsetup()の名前を、たとえばmySetup()に変更すると、シーケンス図では(そのモデルの他の部分とともに)当該変更が自動的に反映される。
動的モデル/コード結合は、Rhapsody(登録商標)(商標権者:マサチューセッツ州アンドーヴァ所在のアイ−ロジックス社(I−Logix Inc., Andover, MA))のモデル・ベース・アプローチの実施可能な機能の1つである。「Rhapsody(登録商標)ユーザ・ガイド、リリース4.2」(2003年)の第15章(15−1〜15−53ページ)を、付属書類Aとして本願明細書に添付した。このアプローチでは、モデルは、ツールが、一連の作業成果物(実装ソース・コード、各種ドキュメント、テスト・スクリプト、UIフロント・エンドなど)を生成し、タイミング解析やテスト・ドライブなど、様々な目的のために外部ツールと対話するもとになる、システムの完結した(または、実質的に完結した)仕様を構成する。さらに、モデル・ベース・ツールは、ステートチャート図やアクティビティ図などの振る舞い図を含む、可及的多数をUML(商標)仕様から実装することをねらいとした綿密な実装スキームによって特徴付けられる。これにより、UML(商標)仕様とその実装の間の不整合性が最小化(または除去)されるとともに、生産性および製品品質が大幅に向上する。
エンド・ユーザがプログラミング言語とそれをサポートする技術プラットフォームの優位性を最大限に享受できるようにするには、モデルとコードとの間の高い(または十分な)レベルの相乗効果が必要である。これを実現するために、実装言語がモデリング言語を補強する。つまり、モデルは、コード・フラグメントをモデルの仕様の一部として含む。さらに、ユーザは、生成されたコードを高いレベルで制御して、その製造品質要件を満たすようにしなければならない。この相乗効果的アプローチの別の主要成功因子は、生成されたコードに対してユーザが直接実行した変更をラウンドトリップ(往復)させて、その変更がモデルの不可欠な部分になるようにすることができることである。このため、手動で実行したコード変更が、コードの再生成によって失われることがないことが保証される。DMCAにより、ユーザは、標準的なコード生成機能およびラウンドトリップ機能を利用してシステムの実装を即座に表示し直接に制御することができるようになるので、動的モデル/コード結合は、前述のアプローチの優位性を押し進める重要な要素の1つである。
現在あるツールは、コードに注釈を埋め込み、その注釈をモデルのリポジトリの一部としてコードに関連付けることによってモデル/コード結合を達成する。この方法では、モデルとコードとの間の整合性は確保されるが、複雑な実装スキームを使用することができない。こうした制限がある理由は、本願発明者らが確認したところによれば、コードの単一ブロックで、全タイプのUML(商標)モデル要素(たとえば、状態マシン)や、クラス間のUML(商標)関係生成アクセッサ及びミューテータを実装できないという事実である。それらのツールの中には、たとえば、クラスのマクロを呼び出して属性にgetterおよびsetterを追加することにより、モデルを単純なコンストラクト(たとえば、属性、操作など)で埋めるプロセスを自動化して、これらの制限を回避するものもある。しかし、本願発明者らが確認したところ、そのような回避策では、通常、追加コンストラクトのコンテキスト(文脈)が維持されない(たとえば、属性名を変更しても、そのgetterおよびsetterのシグネチャは変わらない)ため、別の制限が生じることになる。
これから説明するように、本発明の少なくとも1つの実施形態における本願発明者らの動的モデル/コード結合のアプローチは、モデルまたはコードにおける変更を検出して、必要な更新を自動的に(または、実質的に自動的に)行うという、これまでと異なる切り口をとることによって、現行技術の限界を克服するものである。これにより、モデルとその実装を切り離したままで両者間の高レベルの相乗効果を確保して、本願発明者らのモデル・ベース・アプローチを維持および拡張(強化)することができる。代替的実施態様では、このモデルは、更新を要する変更のタイプに関係なく、所定のアクティビティおよび/または時間間隔に基づいて自動的に更新される。
本願明細書で説明するように、本発明の少なくとも1つの実施形態による動的モデル/コード結合では、関連するモデル要素を変更すると表示されているコードが更新され、逆に、コードを変更すると、モデルがDMCAによって更新される。
本発明の少なくとも1つの実施形態による動的モデル/コード結合を実装できる高レベルのアーキテクチャは、モデルのリポジトリ内または生成されたファイル内の関連する変更を検出する役割を担い、必要な更新に適したツールを呼び出すことのできるDMCAマネージャ(Manager)を含むことができる。利用できるツールは3つある。モデル要素の実装コードを生成するコード・ジェネレータ、コードに従ってリポジトリを更新できるラウンドトリップ(RoundTrip)要素、およびコード内に存在する特定モデル要素の実装場所を見つけて、アクティブ・コード・ビューが関連のコード・フラグメントを表示するようにできる要素位置ファインダである。
本発明の一実施形態では、コードに対して、関連する2つのビューが存在しうる。コード・ビューとアクティブ・コード・ビューである。いずれのビューでもテキスト・ファイルの編集が可能であり、いずれのビューからも、DMCAマネージャ(Manager)に通知を送信して、コードとモデルが同期しているかどうかをチェックさせることができる(後述)。アクティブ・コード・ビューは、コード・ビューを特化したものである。コード・ビューでは、ユーザが、クラスのコードおよび/または選択したパッケージのコードを編集できる。したがって、コード・ビューを使用すると、ユーザは、たとえば、1つまたは複数のクラスを選択して、そのコード・ファイル(単数もしくは複数)をテキスト・エディタで編集することができる。アクティブ・コード・ビューには、現在選択しているモデル要素の実装が反映される。たとえば、UML(商標)ビューの1つ(図示せず)に含まれる一要素をユーザが選択すると、その実装がただちにアクティブ・コード・ビュー・ウィンドウに表示される。1つのファイルに複数の要素の実装を含めることができるので、要素位置ファインダがアクティブ・コード・ビューに指示して、選択された要素の実装が視認されるようにコード内の当該行までスクロールさせることができる。また、追加的な(より多くの)ビューを使用したり、より少ないビューを使用したり、及び/または、それらを結合したりできる。たとえば、任意選択で、コード・ビューとアクティブ・コード・ビューを結合して、新たなビューまたは代替実施形態にすることができる。
一般に、リポジトリはモデル要素からなる。モデル要素の1つのタイプは、標準的なラプソディ(Rhapsody)コンポーネント((マサチューセッツ州アンドーヴァ所在のアイ−ロジックス社(I−Logix Inc., Andover, MA)))である。これは、モデル要素とその実装ファイルとの間のマッピング、生成されたバイナリ・ファイルのタイプ(実行可能、静的ライブラリ、DLLなど)、メイクファイル情報などの実装情報を保持できる。好ましい実施形態では、1つのモデリング・セッションの全体を通して、コード・ジェネレータ、ラウンドトリップ・ツール、DMCAマネージャ(Manager)、およびオプショナルで他のラプソディ(Rhapsody)ツールの現在の実装コンテキスト(文脈)を示す「アクティブ」なコンポーネントが厳密に1つ存在する。1つまたは複数の代替的実施形態では、アクティブ・コンポーネントの数を複数にすることができる。
動的モデル/コード結合は、コード生成を不必要に実行しないことが好ましい。これは、モデル要素の再生成が必要かどうかを調べるのに用い得るIMCA(インクリメンタル・モデル/コード結合)サブシステムを使用して達成できる。ここでは完璧を期すためにIMCAについて言及したが、モデル要素の変更を検出することは他の代替メカニズムを用いることで可能になるため、IMCAの構造および機能について言及することは、DMCAに関しては無関係である。
DMCAマネージャ(Manager)は、以下のアルゴリズムを用いて、モデル要素の変更の結果として生成されたファイルを更新できる。
1.ファイルの生成が必要かもしれないという通知を、DMCAマネージャ(Manager)が取得する。この通知は、
1.1.コード・ビューがフォーカスを取得したか、コード・ビューが開いた場合は、コード・ビューが実行する。
1.2.モデル要素の新しい選択がアクティブ・コード・ビューによって遮られた場合は、アクティブ・コード・ビューが実行する。次にDMCAマネージャ(Manager)に通知する。
2.DMCAマネージャ(Manager)が、ファイル内の実装されているすべての要素をアクティブ・コンポーネントに照会する。このコンポーネントは、実装ファイルとモデル要素との間のマッピングを保持している。
3.DMCAマネージャ(Manager)がIMCAを使用して、ファイル内の実装されている要素の中に修正されたものがないかどうかを調べる。
4.修正された要素がある場合は、DMCAマネージャ(Manager)がコード・ジェネレータに指示して、そのファイルを再生成させる。
5.ファイルが再生成されたら、DMCAマネージャ(Manager)がコード・ビューに、コード・ビューを更新するよう通知する。アクティブ・コード・ビューの場合は、アクティブ・コード・ビューが、コード内の要素の行番号を位置ファインダに照会して、当該行までスクロールする(CおよびC++では、アクティブ・コードはヘッダ・ファイルおよび.c\.cppファイルを表示するので、複数の行が呼び出される場合がある)。
DMCAマネージャ(Manager)は、以下のアルゴリズムにより、コードの変更をモデルにラウンドトリップできる。
1.コード・ビューがフォーカスを失ったか、ユーザが修正後にその内容を保存した場合は、DMCAマネージャ(Manager)がコード・ビューから通知を受け取る場合がある。コード・ビューがフォーカスを失い、そのビューの内容が修正された場合、コード・ビューはそのファイルを保存し、DMCAマネージャ(Manager)に通知する。
2.そのファイルの内容が変更された場合は、そのファイルに対してリポジトリ更新(RoundTrip)を実行し、関連する要素を更新する。
3.コード生成マッピングは複雑な場合があるので(たとえば、getterおよびsetterを含む属性)、DMCAマネージャ(Manager)は、コードがコード生成規則に適合するように、修正された要素に対してコード生成を実行する(本願発明者らの例では、属性を実装しているデータ・メンバの名前を変更すると、getterおよびsetterの名前も同様に変更される)。
さらに、本発明の代替的実施形態は、以下のうちの1つまたは複数を含む。
a.DMCAマネージャ(Manager)が、オプショナルで、ファイルの生成が必要かもしれないという通知を、コード・ビューまたはアクティブ・コード・ビュー以外のモジュールから取得できる。
b.オプショナルで、DMCAマネージャ(Manager)が任意のタイプのメカニズムを用いてモデル要素の再生成が必要かどうかを決定できるようにしたり、或いはオプショナルで常にファイルを再生成するようにしたりできる。
c.DMCAマネージャ(Manager)が、オプショナルで、ファイル内の実装されているすべて(または、実質的にすべて)の要素の保存場所へのポインタまたは参照をアクティブ・コンポーネントに照会できる。
d.アクティブ・コンポーネントが、オプショナルで、実装ファイルとモデル要素との間のマッピングの保存場所へのインデックスまたは参照を保存する。
e.ビューがフォーカスを失い、ビューの内容が修正された場合でも、DMCAマネージャ(Manager)がオプショナルでそのファイルを保存できる。
f.ファイルの内容が変更されたかどうかを判断する代わりに、ファイル用のリポジトリ更新がオプショナルで自動的に呼び出され、さらに(もしあった場合には)関連要素を更新する。
g.コードがコード生成規則に適合するように、DMCAマネージャ(Manager)が、オプショナルで、(主として修正された要素を更新するために)すべて(または、実質的にすべて)の要素のコード生成を実行する。
上記に代わる他の実施形態は、本発明の範囲内であると見なされる。たとえば、DCMAの全体的な機能を本願明細書で説明するように実行する限り、前述した具体的なシーケンスは適宜修正可能である。
さらに、本発明の1つまたは複数の実施形態の使用例を以下に示す。
1.ユーザが、クラスに属性を追加し、クラスのコード・ビューにフォーカスを置く:
a.ユーザが、モデル内でクラスを選択し、そのクラスに属性を追加する。
b.ユーザが、コード・ビューにフォーカスを置いて、このクラスのコードを表示する。
c.コード・ビューのコード・エディタが、コード・ビューが選択されたことをDMCAマネージャ(Manager)に通知する。
d.そのクラスに対してコードが生成された後にそのクラスのモデル要素が変更されたためにファイルの再生成が必要であると、DMCAマネージャ(Manager)が判断する。
e.DMCAマネージャ(Manager)がコード・ジェネレータを起動し、ファイルの再生成を指示する。
f.DMCAマネージャ(Manager)が、コード・ビューにファイルをリロードさせる更新メッセージをコード・ビューに送る。
2.ユーザが、クラスの名前を変更し、変更したクラスと関係があるクラスのビューにフォーカスを置く:
a.ユーザが、モデル内のクラスを選択し、その名前を変更する。
b.ユーザが、コード・ビューにフォーカスを置いて、依存クラスのコードを表示する。
c.コード・ビューのコード・エディタが、コード・ビューが選択されたことをDMCAマネージャ(Manager)に通知する。
d.直接の関連がある要素に大きな変更が発生したためにそのファイルの再生成が必要であることを、DMCAマネージャ(Manager)が認識する。
e.DMCAマネージャ(Manager)がコード・ジェネレータを起動し、ファイルの再生成を指示する。
f.DMCAマネージャ(Manager)が更新メッセージをコード・ビューに送る。コード・ビューは、返報として、ファイルをリロードする。
3.アクティブ・コード・ビューが表示されている間にユーザがモデル要素を選択する:
a.ユーザがモデル要素を選択する。
b.アクティブ・コード・ビューが、選択されたことを通知される。
c.アクティブ・コード・ビューがファイルをロードする(ファイルは既に存在すると仮定)。
d.アクティブ・コード・ビューがDMCAマネージャ(Manager)に、ファイルの再生成が必要であることを通知する。
e.DMCAマネージャ(Manager)が、ファイルの再生成が必要かどうかを調べ、それに基づいて処理を行う。
4.ユーザがクラスのコード・ビューを開く:
a.ユーザがクラスを選択し、「Edit Class(クラスを編集)」を選択する。
b.そのファイルが存在しない場合は、生成する。ファイルが存在する場合は、コード・ビューがDMCAマネージャ(Manager)に、そのファイルが開いていることを通知する。
c.DMCAマネージャ(Manager)が、そのファイルの再生成が必要であることを認識し、適切なコード生成を指示する。必要であれば、ビューに対し、ファイルをリロードさせる。
5.ユーザが、たとえば、コード内のクラスの名前、またはそのコードのネストされたクラスの名前を変更し、コード・ビューから離れる:
a.コード・ビューが、そのファイルを保存し、そのファイルを保存したことをDMCAマネージャ(Manager)に通知する。
b.DMCAマネージャ(Manager)がラウンドトリップ(RoundTrip)を起動してファイルをラウンドトリップする。
c.ラウンドトリップ(RoundTrip)が、そのクラスの名前がモデルで指定されている名前と異なることを検出し、モデル内のクラスの名前を変更する。
d.ユーザがクラスの名前を手動で変更したかのように、リポジトリが依存要素を更新する。
e.コード・ジェネレータが起動され、コードをモデルと再同期させる。たとえば、コンストラクタとデストラクタの名前が正しく変更される。
このように、本発明は、少なくとも1つの実施形態において、有利なことに、ソフトウェア・モデルをそのコード実装と切り離したまま、両者間の結合を維持する。本発明の少なくとも1つの実施形態による、動的モデル/コード結合(DMCA)のシステム、メソッド、および媒体により、モデルは、コード・ジェネレータが、たとえば、実装ソース・コード、各種ドキュメント、テスト・スクリプト、ユーザ・インターフェース・フロント・エンドなどを生成し、かつ/または、タイミング解析および/またはテスト・ドライブなどの様々な目的のために外部ツールと対話するもとになる、システムの完結した(または、実質的に完結した)仕様を構成する。さらに、本発明の少なくとも1つの実施形態は、UML(商標)(統一モデリング言語)を利用して、UML(商標)モデルとコードとの間の高い(または十分な)レベルの相乗効果をもたらすことができる。さらに、実装言語(たとえば、C++、Java)がモデリング言語を補強することができる。たとえば、一実施形態では、モデルは、コード・フラグメントをモデルの仕様の一部として含むことができる。
本発明の一実施形態は、有利なことに、ユーザが、生成されたコードを高いレベルで制御して、たとえば、製造品質要件を満たすことを可能にする。たとえば、本発明の少なくとも1つの実施形態はさらに、生成されたコードに対して直接行われた変更をモデルにラウンドトリップして、コードに対するそれらの変更がモデルの不可欠な部分になるようにできる。これにより、有利なことに、たとえば、コードの再生成に応答してモデルが必ず更新される。したがって、本発明の1つまたは複数の実施形態により、ユーザは、標準的なコード生成機能およびラウンドトリップ機能を利用して、システムの実装を素早く表示したり、直接制御および/または編集したりできる。
したがって、本発明の1つまたは複数の実施形態を利用して、ソフトウェア・モデルおよび/またはソフトウェア・コードにおける変更(または、ソフトウェア・モデルおよび/またはソフトウェア・コードに対する変更)を検出し、そのモデルおよび/またはコードを自動的に(または、実質的に自動的に)更新することができる。代替的実施態様では、このソフトウェア・モデルを、たとえば、所定のアクティビティおよび/または時間間隔に基づいて自動的に更新することが可能であり、オプショナルでは、これを、更新を要する変更のタイプに任意選択で依存せずに行うことも可能である。
したがって、本発明の少なくとも1つの実施形態は、たとえば、モード・ベース・アプローチを用いてモデル/コード結合を達成し、コードの変更および/またはモデルの変更を検出および管理することによりモデル/コード結合を達成するシステム、方法、および媒体を提供する。
本発明はさらに、有利なことに、複雑なコード生成スキームおよびラウンドトリップ・スキームのモデル/コード結合を可能にする。したがって、本発明は、ユーザが、実装コードに対する十分なレベルの可視性ならびに制御性と併せ、(たとえば、UML(商標)を利用して)モデル・ベース開発の強みを有利に利用することを可能にすることができる。
本発明の一実施形態によれば、コンピュータに実装され、ソース・コードを、そのソース・コードを表しているモデルの複数の要素に関連付ける方法が提供される。この方法は、ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成するステップと、当該モデルの複数の要素に対応するソフトウェア・ソース・コードを生成するステップと、当該ソフトウェア・ソース・コードの部分を該モデルの複数の要素の少なくとも1つに関連付けるステップと、当該複数の要素の少なくとも1つが修正されていることを確認するステップと、ソフトウェア・ソース・コードを修正して、修正されている当該複数の要素の少なくとも1つまたは複数に対応させるステップとを含むことができる。
この方法はさらに、オプショナルで、ソフトウェア・ソース・コードの、修正されている少なくとも一部分を表示するステップを含むことができる。モデル要素の少なくとも一部分をブラウザの第1の表示領域に表示でき、当該修正されたソフトウェア・ソース・コードの少なくとも一部分をブラウザの第2の表示領域に表示できる。第1および第2の表示領域としては、オプショナルで、通常のブラウザ・フレームをあててもよい。
さらに、ソース・コードの特定の行番号を、そのモデル要素(UML(商標)(統一モデリング言語))モデル要素など)に関連付けることができる。UML(商標)要素として、クラス図、オブジェクト図、ユースケース図、状態図、シーケンス図、アクティビティ図、コラボレーション図、コンポーネント図、および/または配置図のうちの少なくとも1つを用いることができる。
本発明の一実施形態による別の方法は、ソース・コードを、そのソース・コードを表している、モデルの複数の要素に関連付けることができる。この方法は、ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成するステップと、当該モデルの複数の要素に対応するソフトウェア・ソース・コードを生成するステップと、当該ソフトウェア・ソース・コードの部分を、モデルの複数の要素の少なくとも1つに関連付けるステップと、ソフトウェア・ソース・コードの少なくとも一部分が修正されていることを確認するステップと、複数のモデル要素の少なくとも1つを修正して、当該修正されているソフトウェア・ソース・コードに対応させるステップと、ソフトウェア・ソース・コードが、当該修正されたモデルと合致するように、所定の規則に従ってソフトウェア・ソース・コードを再生成するステップとを含むことができる。
この方法はさらに、修正されているソフトウェア・ソース・コードの少なくとも一部分を表示するステップ、および/または、修正されているモデルの複数の要素の少なくとも1つを表示するステップを含むことができる。
複数のモデル要素の少なくとも1つをブラウザの第1の表示領域に表示でき、当該修正されたソフトウェア・ソース・コードの少なくとも一部分をブラウザの第2の表示領域に表示できる。第1および第2の表示領域として、通常のウェブ(Web)ブラウザ・フレームを用いることができる。
さらに、ソフトウェア・ソース・コードの特定の行番号を、複数のモデル要素の少なくとも1つに関連付けることができる。モデル要素として、クラス図、オブジェクト図、ユースケース図、状態図、シーケンス図、アクティビティ図、コラボレーション図、コンポーネント図、および/または配置図を含むUML(商標)(統一モデリング言語)モデル要素を用いることができる。
コンピュータ可読媒体に存在する、本発明による一コンピュータ・プログラム製品は、ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成することと、当該モデルの複数の要素に対応するソフトウェア・ソース・コードを生成することと、当該ソフトウェア・ソース・コードの部分を、モデルの複数の要素の少なくとも1つに関連付けることと、モデルの複数の要素の少なくとも1つが修正されていることを確認することと、当該ソース・コードを修正して、当該1つまたは複数の修正されたモデル要素に対応させることとを、コンピュータに実行させる命令を含むことができる。この媒体はさらに、ソース・コードの、当該修正されている少なくとも一部分をコンピュータに表示させる命令を含むことができる。
コンピュータ可読媒体に存在する、本発明による別のコンピュータ・プログラム製品は、ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成することと、当該モデルの複数の要素に対応するソフトウェア・ソース・コードを生成することと、当該ソフトウェア・ソース・コードの部分を、モデルの複数の要素の少なくとも1つに関連付けることと、当該ソフトウェア・ソース・コードの少なくとも一部分が修正されていることを確認することと、複数のモデル要素の少なくとも1つを修正して、該修正されているソース・コードに対応させることと、ソフトウェア・ソース・コードが、修正されたモデルと合致するように、所定の規則に従ってソフトウェア・ソース・コードを再生成することとを、コンピュータに実行させる命令を含むことができる。さらに、このコンピュータ・プログラム製品は、ソフトウェア・ソース・コードの、当該修正されている少なくとも一部分をコンピュータに表示させる命令を含むこともできる。
本発明によるソフトウェア・プロジェクトにおいて、ソース・コードのドキュメントを生成するデータ処理システムは、ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成する手段と、当該モデルの複数の要素に対応するソフトウェア・ソース・コードを生成する手段と、当該ソフトウェア・ソース・コードの部分を、モデルの複数の要素の少なくとも1つに関連付ける手段と、モデルの複数の要素の少なくとも1つが修正されていることを確認する手段と、ソフトウェア・ソース・コードを修正して、1つまたは複数の当該修正されたモデル要素に対応させる手段とを含むことができる。さらに、このデータ処理システムは、ソフトウェア・ソース・コードの当該修正されている少なくとも一部分を表示する手段を含むこともできる。
本発明の少なくとも1つの実施形態に係る、コンピュータに実装される方法であって、ソース・コードを、そのソース・コードを表しているモデルの複数の要素に関連付ける方法は、ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成するステップと、当該モデルの複数の要素に対応するソフトウェア・ソース・コードを生成するステップと、当該ソフトウェア・ソース・コードの部分を、当該モデルの複数の要素の少なくとも1つに関連付けるステップと、当該ソフトウェア・ソース・コードの少なくとも一部分が修正されていることを確認するステップと、複数のモデル要素の少なくとも1つを修正して、当該修正されているソフトウェア・ソース・コードに対応させるステップと、当該ソース・コードが、当該修正されたモデルと合致するように、所定の規則に従ってソフトウェア・ソース・コードを再生成するステップとを含むことができる。コンピュータに実装される当該方法はさらに、ソース・コードの当該修正されている少なくとも一部分を表示するステップを含むことができる。
以上のとおりなので、いわゆる当業者であれば、本発明の様々な目的を実行する他の構造、方法、およびシステムを設計するためのベースとして、本開示の基盤をなす概念を容易に利用できることが理解されよう。したがって、そのような等価な構築物は、本発明の趣旨(精神)および範囲から逸脱しない限り、本特許請求項に含まれると見なすことが重要である。
また、添付の要約書は、米国特許商標庁、ならびに広くは公衆、特に特許や法律の用語または言い回しに不慣れな当該分野の科学者、技術者、および実務家が、本出願の技術的開示の性質及び本質を一目でわかるようにすることを目的としている。この要約書は、本出願の発明を規定することを意図したものではなく(本発明は特許請求項で規定される)、いかなる形でも本発明の範囲に関する限定を意図したものでもない。
本発明を特徴付ける種々の新規な機能は、本開示に添付され、本開示の一部をなす特許請求項によって具体的に示される。本発明、本発明の運用上の優位性、ならびにその使用によって達成される具体的な目標についてよりよく理解するために、本発明の好ましい実施形態を例示した添付図面および記載事項を参照されたい。
表記と用語
以下では、たとえばスタンドアロン・コンピューティング・マシン、コンピュータ、またはコンピュータ・ネットワークなどのコンピューティング・システムや処理システムで実行されるプログラム手順の点で詳細を説明する場合がある。そうした手順上の説明および表現は、いわゆる当業者が成果の内容を他の当業者に最も効率的に伝えるために用いる手段である。
手続きは、ここでは、および一般に、所望の結果につながる一連のステップであると考えられる。それらのステップは、物理量の物理的操作(たとえば、何種類かの医薬品をパッケージにまとめる操作)を必要とする場合がある。常にそうとは限らないが、通常、それらの量は、記憶、転送、結合、比較、その他の操作が可能な電気信号、光信号、または磁気信号の形をとる。主として一般的な使い方であることから、これらの信号をビット、値、要素、記号、文字、用語、番号、その他で表すことが便利である場合がある。ただし、これらの用語および同様の用語はすべて、しかるべき物理量に関連付けられるべきものであると共に、それらの量に適用される便利なラベルに過ぎないことに注意されたい。
さらに、実行される操作を、追加や比較など、人間の操作者が実行する知的操作に共通に関連付けられる用語で表す場合が多い。本発明の一部をなす、本願明細書で説明するいかなる操作においても、そのような人間の操作者の能力は不要である(あるいは、ほとんどの場合は望ましくない)。つまり、それらの操作は機械操作である。本発明の操作を実行するマシンとして有効なものには、マイクロプロセッサを内蔵するが、それに限定されない汎用デジタル・コンピュータや同様の装置が含まれる。
種々の特徴を示す本出願の詳細説明については、添付図面を関連させて読むことにより、最大限に理解できよう。
本発明の1つまたは複数の実施形態によれば、動的モデル/コード結合は、たとえば、ラプソディ(Rhapsody)のUML(商標)(統一モデリング言語)モデルとそれらの実装コードとを自動的に同期するメカニズムを提供する。これにより、最新の実装コードを即座に表示でき、また、コードを手動で変更した場合にモデルがただちに更新されるようにできる。
このアプローチでは、モデルは、ツールが、一連の作業成果物(実装ソース・コード、各種ドキュメント、テスト・スクリプト、UIフロント・エンドなど)を生成し、タイミング解析やテスト・ドライブなど、様々な目的のために外部ツールと対話するもとになる、システムの完結した(または、ほぼ完結した)仕様を構成する。さらに、モデル・ベース・ツールは、ステートチャート図やアクティビティ図などの振る舞い図を含む、できるだけ多くをUML(商標)仕様から実装することをねらいとした綿密な実装スキームによって特徴付けられる。これにより、UML(商標)仕様とその実装の間の不整合性が最小化(または除去)されるとともに、生産性および製品品質が大幅に向上する。
エンド・ユーザがプログラミング言語とそれをサポートする技術プラットフォームの優位性を最大限に享受できるようにするには、モデルとコードの高い(または十分な)レベルの相乗効果が必要である。これを実現するために、実装言語がモデリング言語を補強する。つまり、モデルは、コード・フラグメントをモデルの仕様の一部として含む。さらに、ユーザは、生成されたコードを高いレベルで制御して、その製造品質要件を満たすようにしなければならない。この相乗効果的アプローチの別の主要成功因子は、生成されたコードに対してユーザが直接実行した変更を、その変更がモデルの不可欠な部分になるように
ラウンドトリップできることである。このため、手動で実行したコード変更が、コードの再生成によって失われることがない。DMCAにより、ユーザは、標準的なコード生成機能およびラウンドトリップ機能を利用してシステムの実装を即座に表示し、直接制御することができるので、動的モデル/コード結合は、前述のアプローチの優位性を押し進める重要な要素の1つである。
本発明の少なくとも1つの実施形態における本願発明者らの動的モデル/コード結合のアプローチは、モデルまたはコードにおける変更を検出して、必要な更新を自動的に(または、ほぼ自動的に)行うという、これまでと異なる切り口をとることによって、現行技術の制限を克服するものである。これにより、モデルとその実装を切り離したままで両者間の高レベルの相乗効果を確保して、本願発明者らのモデル・ベース・アプローチを維持および拡張することができる。代替実施態様では、このモデルは、更新を要する変更のタイプに関係なく、所定のアクティビティおよび/または時間間隔に基づいて自動的に更新される。
本発明の少なくとも1つの実施形態による動的モデル/コード結合では、関連するモデル要素を変更すると、表示されているコードが更新され、逆に、コードを変更すると、モデルが更新される。
DMCAManagerは、モデル要素の変更の結果として生成されたファイルを更新でき、コードの変更をモデルにラウンドトリップできる。
さらに、本発明の代替実施形態によれば、以下のうちの1つまたは複数が達成される。
a.DMCAManagerが、任意選択で、ファイルの生成が必要らしいという通知を、コード・ビューまたはアクティブ・コード・ビュー以外のモジュールから取得できる。
b.任意選択で、DMCAManagerが任意のタイプのメカニズムを用いてモデル要素の再生成が必要かどうかを決定できるようにしたり、常にファイルを再生成するようにしたりできる。
c.DMCAManagerが、任意選択で、ファイル内の実装されているすべて(または、ほぼすべて)の要素の保存場所へのポインタまたは参照をアクティブ・コンポーネントに照会できる。
d.アクティブ・コンポーネントが、任意選択で、実装ファイルとモデル要素の間のマッピングの保存場所へのインデックスまたは参照を保存する。
e.ビューがフォーカスを失い、ビューの内容が修正された場合でも、DMCAManagerが任意選択でそのファイルを保存できる。
f.ファイルの内容が変更されたかどうかを判断する代わりに、ファイルおよび関連要素が更新されている場合には、それらについて任意選択でリポジトリ更新を自動的に実行する。
g.コードがコード生成規則に適合するように、DMCAManagerが、任意選択で、(修正された要素を更新する前に)すべて(または、ほぼすべて)の要素のコード生成を実行する。
また、本発明の少なくとも1つの実施形態は、UML(商標)(統一モデリング言語)を利用して、UML(商標)モデルとコードの高い(または十分な)レベルの相乗効果をもたらすことができる。
本発明の一実施形態は、有利なことに、ユーザが、生成されたコードを高いレベルで制御して、たとえば、製造品質要件を満たすことを可能にする。たとえば、本発明の少なくとも1つの実施形態はさらに、生成されたコードに対して直接行われた変更をモデルにラウンドトリップして、コードに対するそれらの変更がモデルの不可欠な部分になるようにできる。これにより、有利なことに、たとえば、コードの再生成に応答してモデルが必ず更新される。したがって、本発明の1つまたは複数の実施形態により、ユーザは、標準的なコード生成機能およびラウンドトリップ機能を利用して、システムの実装を素早く表示したり、直接制御および/または編集したりできる。
したがって、本発明の1つまたは複数の実施形態を利用して、ソフトウェア・モデルおよび/またはソフトウェア・コードの変更を検出し、そのモデルおよび/またはコードを自動的に(または、ほぼ自動的に)更新することができる。代替実施態様では、このソフトウェア・モデルを、たとえば、更新を要する変更のタイプに任意選択で依存せず、所定のアクティビティおよび/または時間間隔に基づいて自動的に更新することが可能である。
本発明はさらに、有利なことに、複雑なコード生成スキームおよびラウンドトリップ・スキームのモデル/コード結合を可能にする。したがって、本発明は、ユーザが、実装コードに対する十分なレベルの可視性ならびに制御性と併せ、(たとえば、UML(商標)を利用して)モデル・ベース開発の強みを有利に利用することを可能にすることができる。
以下、本発明の、現時点で好ましい実施形態を詳細に説明する。これらの実施形態は、本発明の説明のために提示するものであり、本発明をこれらに限定することを意図したものではない。実際、いわゆる当業者が本明細書を読み、添付図面を見れば、様々な修正や変形が可能であることが理解されよう。
たとえば、一実施形態の一部として図示または説明した機能を他の実施形態に使用して、さらに別の実施形態を与えることができる。また、特定の機能を、同一または同等の働きをする未言及の同等の装置または機能と交換することが可能である。したがって、そのような修正や変形は本発明の全体に含まれるものと意図される。
本発明に係る動的モデル/コード結合のシステム、方法、および媒体は、好ましい一実施形態によれば、ソース・コードのモデルとそのソース・コード自体との同期を実現する。したがって、少なくとも1つの実施形態では、本発明で有利に提供され、もしくは促進されるところによれば、最新の実装コードおよび/または1つもしくは複数の関連付けられたモデルをほぼ瞬時に表示することができる。
図2および3は、本発明の一実施形態に係る動的モデル/コード結合を示す。206に示すように、ブラウザまたは他の標準的な表示手段でUML(商標)(統一モデリング言語)シーケンス図を表示することができる。本発明はさらに、クラス図、オブジェクト図、ユースケース図、状態図、アクティビティ図、コラボレーション図、コンポーネント図、および/または配置図、および/またはこれらの変形および/または組み合わせなどのUML(商標)図を利用および表示できることも理解されたい。ユーザは、本発明と組み合わせて使用できるユーザ・インターフェース(たとえば、ブラウザ)により、上述の任意のUML(商標)図を作成、編集、および/または削除できる。208には、アクティブ・コード・ビューが表示される。本願明細書において用いられているように、アクティブ・コード・ビュー208は、選択されたモデル要素に対応するコードを表示するために使用することができる表示領域である。ユーザがメソッドsetup() 202を選択すると、アクティブ・コード・ビュー208でメソッドsetup() 204が(必要に応じて)自動的に更新され、メソッドsetup() 204の実装が表示される。
さらに、図3に示すように、ユーザがメソッドsetup()の名前をmySetup() 302に変更すると、シーケンス図(および、好ましくは、上述の、このモデルの他のすべてのビュー)が、その変更を反映するように自動的に更新される。結果として、304にmySetup()が表示される。
図4は、本発明の一実施形態の例示的なハイレベル・アーキテクチャを示している。モデル・コード・マネージャ401が、モデル・リポジトリ407および/またはコード・ジェネレータ409で、関連した変更を検出または特定する。モデル・コード・マネージャ401は、モデルおよび/またはファイルへの変更を特定すると、ただちに、たとえば3つのツールのうちの1つまたは複数を起動して、必要な更新を実行することができる。詳細には、モデル・コード・マネージャ401は、コード・ジェネレータ402を起動して、たとえば、モデル要素405に記憶されている要素および/またはモデル要素405に関連付けられた要素に対応する実装コードを生成することができる。モデル・コード・マネージャ401はさらに、オプショナルで、(主に修正された要素を更新するために)モデル要素405に記憶されているか関連付けられているすべての(または、実質的にすべての)要素に対してコード・ジェネレータ402を起動して、ファイル412、413、414、415にあるコードがコード生成規則に適合するようにできる。
モデル・コード・マネージャ401はさらに、オプショナルで、リポジトリ更新403を起動して、たとえば、リポジトリ407を、コードと合致するように更新することができる。モデル・コード・マネージャ401はさらに、オプショナルで、要素ファインダ404を起動して、たとえば、モデル要素405に記憶されているか、かつ/またはモデル要素405に関連付けられている特定モデル要素の実装が当該コード内のどこにあるかを突き止めることができる。モデル要素が見つかったら、アクティブ・コード・ビュー410を起動して、関連するコード・フラグメントを(たとえば、図2の208で示すように)表示することができる。
コード・ビュー411を使用して、個々の実装ファイル412を表示できる。これには、既存のソース・コード・ファイル413、メイクファイル414(たとえば、1つまたは複数の新規に作成したソース・コード・ファイル)、および/またはスクリプト・ファイル415などが含まれる。
アクティブ・コード・ビュー410でも、コード・ビュー411でも、テキスト・ファイル412の編集(たとえば、ソース・ファイル413、メイクファイル414、および/またはスクリプト・ファイル415の編集)およびモデル・コード・マネージャ401への通知を行うことができる。
コード・ビュー411の特定の実装をアクティブ・コード・ビュー410にすることができる。本発明の一実施形態では、モデル・コード・マネージャ401は、オプショナルで、ファイル412、413、414、415の生成が必要らしいという通知を、コード・ビュー411もしくはアクティブ・コード・ビュー410以外のモジュールから受け取ることができる。コード・ビュー411およびアクティブ・コード・ビュー412を、オプショナルで、結合して別のビューまたは代替的実施形態にすることができる。
アクティブ・コード・ビュー410は、現在選択されているモデル要素405の実装を反映する。たとえば、ユーザがいずれかのUML(商標)ビューで要素(たとえば、図3のmySetup 304)を選択した場合に、その実装を、たとえば、アクティブ・コード・ビュー・ウィンドウ208に表示することができる。1つのファイルに1つまたは複数の要素の実装を含めることができるので、要素位置ファインダ404からアクティブ・コード・ビュー410に指示を出して、たとえば、選択された要素の実装が、たとえば、アクティブ・コード・ビュー・ウィンドウ208に表示されるように、コード内の正規の行までスクロールさせることができる。
リポジトリ407の一実施形態には、モデル要素405を含めることができる。モデル要素405の1つのタイプは、標準的なラプソディ(Rhapsody)コンポーネント((マサチューセッツ州アンドーヴァ所在のアイ−ロジックス社(I−Logix Inc., Andover, MA)))であることができる。これは、モデル要素405とその対応する実装ファイル(単数、複数)との間のマッピング、生成されたバイナリ・ファイルのタイプ(実行可能、静的ライブラリ、動的リンク・ライブラリなど)、メイクファイル414情報などの実装情報を保持できる。本発明の一実施形態では、1つのモデリング・セッションの全体を通して、コード・ジェネレータ402、リポジトリ更新403、モデル・コード・マネージャ401、およびオプショナルで他のツールの現在の実装文脈(コンテキスト)を示す「アクティブ(活性)」なコンポーネントが1つ存在する。一代替的実施形態では、アクティブ・コンポーネントの数を複数にすることができる。
一実施形態では、モデル・コード・マネージャ401は、IMCA(インクリメンタル・モデル/コード結合)408と通信するか、またはこれにアクセスして、モデル要素405に記憶されているか関連付けられている要素について、たとえば最終更新以来、この要素における変更もしくはこの要素に対する変更がないかどうかを調べることができる。モデル要素405に記憶されているか関連付けられている要素に変更があった場合は、モデル・コード・マネージャ401が、リポジトリ更新403を起動してファイル(単数もしくは複数)412を更新または作成することができる。本発明の一実施形態では、ファイル412、413、414、415の内容が変更されているかどうかを調べる代わりに、オプショナルで、リポジトリ更新403をファイル412、413、414、415に対して自動的に起動し、関連する(もしくは関連付けられた)要素がモデル要素405に記憶されているか関連付けられていれば、それらを更新する。
モデル・コード・マネージャ401は、オプショナルで、任意のタイプのメカニズムを用いて、モデル要素405に記憶されているか関連付けられている要素の再生成が必要或いは必須かどうかを調べることができ、または、オプショナルで、モデル要素405を常に再生成するようにできる。さらにモデル・コード・マネージャ401は、オプショナルで、たとえば、モデル要素405に実装されている、すべての要素、または実質的にすべての要素の記憶場所を示すポインタもしくは参照を、コンポーネント406に照会できる。さらに、コンポーネント406は、オプショナルで、たとえば、ファイル412、413、414、415と、モデル要素405に記憶されているか関連付けられている要素との間のマッピングを示すインデックス(索引)もしくは参照を記憶できる。
図5は、モデル要素405に記憶されているか関連付けられている1つまたは複数のモデル要素への変更に関連するコード・ファイル更新手続きの例示的なフロー図である。ステップ502では、モデル・コード・マネージャ401が、ファイル412、413、414、415の更新または生成が必要かもしれないという通知を受け取ることができる。モデル・コード・マネージャ401は、たとえば、コード・ビュー411がフォーカスを取得したとき(たとえば、ファイルを開いたとき)に、コード・ビュー411から通知を受け取ることができる。また、モデル・コード・マネージャ401は、アクティブ・コード・ビュー410が、たとえば、モデル要素405の新たな選択を検出したときに通知を受け取ることができる。
ステップ504では、モデル・コード・マネージャ401が、個々のファイル412、413、414、415に実装された要素をコンポーネント406に照会できる。コンポーネント406は、ファイル412、413、414、415と、モデル要素405に記憶されているか関連付けられている、関連または対応するモデル要素との間のマッピングを保持または記憶する。
判断ステップ506では、モデル・コード・マネージャ401が、IMCA 408を起動するか、これにアクセスして、ファイル412、413、414、415に実装されている要素のうち、修正されているものがあるかどうかを調べることができる。修正されている要素がない場合は、プロセスが終了する。修正されている要素がある場合は、ステップ508でコード・ジェネレータ402を使用して、ファイル412、413、414、415を再生成することができる。一実施形態では、モデル・コード・マネージャ401が、コード・ジェネレータ402にコードを生成するよう指示するか、生成させることができる。さらに、モデル・コード・マネージャ401は、コード・ビュー411が自身を更新するよう通知するか、更新させるか、更新するよう指示することができる。アクティブ・コード・ビュー410の場合は、アクティブ・コード・ビュー410が、たとえば、コード内の特定要素の行番号を要素位置ファインダ404に照会して、図2の208に示すように、当該(正規)行までスクロールすることができる。
図6は、ファイル412、413、414、415への変更に関連するモデル更新手続きの例示的なフロー図である。本発明の一実施形態では、モデル・コード・マネージャ401が以下の例示的アルゴリズムを用いて、モデル要素405によって保持または記憶されているモデル要素を更新することができる。
判断ステップ602では、コード・ビュー411がファイル412、413、414、415のフォーカスを失っていないかどうか(たとえば、ファイルが閉じていないかどうか、あるいはさもなくばファイルを編集する権限が失われていないかどうか)を調べる。フォーカスが失われている場合は、コード・ビュー411が判断ステップ606で、ファイル412、413、414、415の内容が変更されているかどうかを調べることができる。ファイルの内容が変更されている場合は、ステップ608でそのファイルを保存する。ステップ610では、モデル・コード・マネージャ401が、たとえば、ファイル412、413、414、415の内容が変更されているという通知をコード・ビュー411から受けることができる。ステップ612では、ステップ608で保存したコード内容と対応するように、モデル要素405を更新する。ステップ614では、モデル・コード・マネージャ401がコード・ジェネレータ402を起動して、コードをコード生成規則に適合させる。たとえば、Java言語においては、コード・ジェネレータ402は、コードに対する他の変更と併せてgetterおよびsetterの名前を変更することができる。判断ステップ606で、ファイル412、413、414、415の内容が変更されていないことが判明した場合は、プロセスが終了する。
判断ステップ602で、コード・ビュー411のフォーカスが失われていないことが判明した場合は、判断ステップ604で、ファイル412、413、414、415が保存されているかどうかを調べる。ファイルが保存されていないことが判明した場合は、ステップ608でファイルを保存し、ステップ610、612、および614を上述のとおりに実行する。判断ステップ602で、ファイルが保存されていることが判明した場合は、ステップ610、612、および614を上述のとおりに実行する。
以下は、本発明の例示的な使用法である。第1に、ユーザが、クラスに属性を追加し、クラスのコード・ビューにフォーカスを置くことを望んでいるとする。ユーザは、これを行うために、モデル要素405に記憶されているか関連付けられているモデル中のクラスを選択し、それに、たとえば、属性を追加することができる。ユーザは、コード・ビューにフォーカスを置いて、そのクラスのコードを表示することができる。コード・ビュー411のコード・エディタは、コード・ビュー411が選択されたことをモデル・コード・マネージャ401に通知できる。次に、モデル・コード・マネージャ401は、たとえば、図5を参照して説明した方法を用いて、そのクラスの、モデル要素405に記憶されているか関連付けられている1つまたは複数のモデル要素が、そのクラスのコードをコード・ジェネレータ402が生成した後に変更されているかどうか、およびファイル412、413、414、415の再生成が必要かどうかを調べることができる。変更されたモデル要素がある場合は、モデル・コード・マネージャ401がコード・ジェネレータ402を起動し、これに指示して、当該モデルに関連付けられた1つまたは複数のファイル412、413、414、415を再生成させることができる。モデル・コード・マネージャ401はさらに、コード・ビュー411にファイル412、413、414、415をリロードさせる更新メッセージをコード・ビュー411に送ることができる
第2の例として、ユーザは、たとえば、クラスの名前を変更し、修正したクラスとの関連があるクラスのビューにフォーカスを置くことができる。特に、ユーザは、モデル要素405に記憶されているか関連付けられているクラスをモデルから選択し、そのクラスの名前を変更することができる。ユーザは、コード・ビュー411にフォーカスを置いて、依存クラスのコードを表示することができる。コード・ビュー411との組み合わせで使用できるコード・エディタは、コード・ビュー411が選択されていることをモデル・コード・マネージャ401に通知できる。モデル・コード・マネージャ401は、たとえば、図5に関連して説明し示した方法を用いて、直接の関連がある要素に大きな変更(たとえば、承認された変更や、他のモデル要素またはコード・オブジェクトに影響を与えそうな変更)が発生したこと、およびファイル412、413、414、415の再生成が必要であることを確認できる。モデル・コード・マネージャ401は、コード・ジェネレータ402を起動して、コード・ジェネレータ402にファイル412、413、414、415を再生成させるか、再生成するよう指示することができる。モデル・コード・マネージャ401は、ファイル412、413、414、415をリロードするよう指示するかリロードさせる更新メッセージをコード・ビュー411に送ることができる。リロードしたファイルは、オプショナルで、表示させることができる。
第3の例として、ユーザは、図2のように、アクティブ・コード・ビュー410が表示されている間に、アクティブ・コード・ビュー208で、モデル要素405に記憶されているか関連付けられている要素を選択できる。特に、ユーザがモデル要素を選択すると、アクティブ・コード・ビュー405が、その選択の通知を受け、1つまたは複数のファイル412、413、414、415をロードするか、オプショナルで作成することが可能になる。アクティブ・コード・ビュー410は、ファイル412、413、414、415の再生成が必要かもしれないということをモデル・コード・マネージャ401に通知できる。モデル・コード・マネージャ401は、ファイル412、413、414、415の再生成が必要かどうかを調べ、1つまたは複数のファイル412、413、414、415を、オプショナルで、図5を参照して説明した方法を用いて、再生成することができる。
第4の例として、ユーザはクラスのコード・ビュー411を開くことができる。具体的には、ユーザは、編集するクラスを選択できる。そのクラスのファイル412、413、414、415が存在しない場合は、コード・ジェネレータ402がファイル412、413、414、415を生成できる。そのクラスのファイル412、413、414、415が1つまたは複数存在する場合は、コード・ビュー411がモデル・コード・マネージャ401に、ファイル412、413、414、415が開いていることを通知できる。たとえば、図5で説明した方法によれば、モデル・コード・マネージャ401は、ファイル412、413、414、415の再生成が必要かどうかを調べ、その結果に適した処理をコード・ジェネレータ402に指示することができる。モデル・コード・マネージャ401はさらに、オプショナルで、コード・ビュー411および/またはアクティブ・コード・ビュー410に、そのファイルをリロードさせ、つづいて、再生成されたコードを表示させることができる。
第5の例として、ユーザは、コード内のクラスの名前を変更し、コード・ビュー411を終了することができる。具体的には、コード・ビュー411は、ファイル412、413、414、415を保存し、モデル・コード・マネージャ401に、ファイル412、413、414、415を修正および保存したことを通知することができる。モデル・コード・マネージャ401はリポジトリ更新403を起動でき、リポジトリ更新403は、クラスの名前が、モデル要素405で指定されている名前と異なることを検出し、モデル要素405内でクラスの名前を変更することができる。リポジトリ更新403は、コード・ジェネレータ402がコードを生成した後と、生成されたコードにユーザが変更を加えた後とに起動できる。リポジトリ407は、任意の依存要素を、オプショナルで、ユーザがクラスの名前を手動で変更したかのように更新できる。コード・ジェネレータ402は、ファイル412、413、414、415内のコードと、モデル要素405に記憶されているか関連付けられているモデル要素とを再同期させるために起動できる。たとえば、Javaプログラミング言語では、コンストラクタとファイナライザの名前を正しく変更できる。たとえば、C++プログラミング言語では、コンストラクタとデストラクタの名前を正しく変更できる。
図7は、本発明の、コンピュータに実装される実施形態に係るコンピュータ処理を実装するためのコンピュータ700を例示した図である。前述した手続きは、たとえば、コンピュータまたはコンピュータ・ネットワーク上で実行されるプログラム手続き(手順)の形で表すことができる。
図8では外部的に示しているが、コンピュータ700は、ディスク・ドライブ704、706を有するCPU(中央処理ユニット)702を有する。ディスク・ドライブ704、706は、コンピュータ700に収容できるいくつかのディスク・ドライブの単なる象徴である。通常、それらのディスク・ドライブは、フロッピーディスク・ドライブ704、および706においてスロットで示されるCD−ROMディスクおよびデジタル・ビデオ・ディスクの1つまたは複数である。ドライブの数と種類は、通常、コンピュータの構成によって異なる。ドライブ704、706は、実際にはオプション(任意選択)であり、スペースの条件により、本願明細書で説明している処理に関係して使用されるコンピュータ・システムから省くことが可能である。
コンピュータ700はさらに、情報を表示できるディスプレイ708を有する。このディスプレイは、本願明細書で説明しているシステムに関連して使用されるコンピュータに対してオプション(任意選択)である。キーボード710および/またはポインティング・デバイス712(マウス712、タッチ・パッド制御装置、トラック・ボール装置、またはその他のポインティング・デバイスなど)を、中央処理ユニット702とインターフェースするための入力装置として備えることができる。入力の効率を高めるために、スキャナ、カード・リーダ、またはその他のデータ入力装置をキーボード710の補助として追加したり、或いはそれらの装置でキーボード710を置き換えたりできる。
図8は、図7のコンピュータの内部ハードウェアのブロック図である。バス804は、コンピュータの他のコンポーネントを相互接続する主要情報ハイウェイとして動作する。これは、インターフェース806によってコンピュータ700に接続される。これにより、キーボード710またはポインティング・デバイス(マウス712など)を使用するデータ入力が可能である。
CPU702は、システムの中央処理ユニットであり、プログラムの実行に必要な計算および論理演算を行う。ROM(読み出し専用メモリ)812およびRAM(ランダム・アクセス・メモリ)814は、コンピュータのメイン・メモリを構成する。
ディスク・コントローラ816は、1つまたは複数のディスク・ドライブをシステム・バス804にインターフェースする。それらのディスク・ドライブとして、704などのフロッピーディスク・ドライブ、706として示されるCD−ROMドライブまたはDVD(デジタル・ビデオ/多用途ディスク)ドライブ、または、内蔵または外付けのハードディスク・ドライブ(単数もしくは複数)818を使用できる。既述のとおり、これらの各種ディスク・ドライブおよびディスク・コントローラは、オプショナル(任意選択)の装置である。
ディスプレイ・インターフェース820は、バス804からの情報をディスプレイ708上に表示することを可能にする。既述のとおり、ディスプレイ708はオプショナルな(任意選択)アクセサリであり、たとえば、赤外線レシーバおよびトランスミッタ(図示せず)を使用できる。外部装置との通信は、通信ポート822を使用して行うことができる。
従来の処理システムのアーキテクチャについては、「コンピュータ組織と構成(Computer Organization and Architecture)」(ウィリアム・スターリングス(William Stallings)著、マクミラン出版社(MacMillan Publishing Co.)刊(第3版、1993年))に詳細に説明されている。従来の処理システムのネットワーク設計については、「データ・ネットワーク設計(Data Network Design)」(ダレン・エル・スポーン(Darren L. Spohn)著、マグローヒル社(McGraw−Hill,Inc.)刊(1993年))に詳細に説明されている。従来のデータ通信については、「データ通信原理(Data Communications Principles)」(アール・デー・ギトリン(R.D.Gitlin)、ジェイ・エフ・ハイエス(J.F.Hayes)、エス・ビー・ワインシュタイン(S.B.Weinstain)ら著、プレナム出版社(Plenum Press)刊(1992年))および「イルウィンの通信ハンドブック(The Irwin Handbook of Telecommunications)」(ジェイムズ・ハリー・グリーン(James Harry Green)著、イルウィン専門書出版社(Irwin Professional Publishing)刊(第2版、1992年))により詳細に説明されている。上記の各出版物は、参照により本明細書に組み込まれる。
上述の詳細説明は、具体的な詳細を多く含んでいる。そのような詳細を含むことの目的は、例示することのみであり、本発明を限定することではないことを理解されたい。また、一実施形態における特徴は、本発明の他の実施形態における特徴と組み合わせることができる。添付の特許請求項で定義される本発明の範囲から逸脱することなく、様々な変更が可能である。
一例として、パーソナル・コンピュータ、汎用コンピュータ、特別にプログラムされた特定用途コンピュータなどを、ユーザのコンピュータとして使用できる。同様に、装置アプリケーションは、埋め込みシステムのほか、その装置と密に接続され、かつ/またはその装置を制御する、汎用コンピュータ或いは特別にプログラムされた専用コンピュータ上でも実行できる。これらはいずれも、単一コンピュータではなく分散コンピュータ・システムとして実装できる。同様に、本発明は、インターネット、イントラネット、ワールド・ワイド・ウェブ(World Wide Web)、POTS回線経由のモデム、および/または他の任意の、コンピュータ間および/または装置間の通信手段方法などのネットワークにおいて使用できる。さらに、この処理を、1つまたは複数のコンピュータ・システムまたはプロセッサ上のソフトウェア・プログラムで制御したり、或いはこの処理を部分的に、または全面的にハードウェアに実装したり、一部の処理を種々の装置に埋め込んだりすることもできる。
本発明は、たとえば、埋め込みシステムを有する特定タイプの装置と関連しての使用に限定されない。さらに本発明は、特定の通信プロトコルに限定されない。適切であればどのようなプロトコルでも、この計測装置で使用できる。
ユーザ表示は、HTML表示フォーマットで開発できる。HTMLは好ましい表示フォーマットであるが、別の表示フォーマットを利用して、レポートを表示したり、ユーザ命令を取得したりすることも可能である。本発明については、特定の例との関連で説明した。しかし、その原理は、他の例にも等しく当てはまる。当然ながら、関連するデータは適宜異なる。
さらに、本発明については、単一サイトを有する単一カスタマに対してプロバイダが提供し得るかのような形の例で説明した。本発明は、もしそれが好ましいのであれば、多数のカスタマで使用できる。また、本発明は、複数のサイトおよび/またはユーザを擁するカスタマも使用できる。さらに、上記に代わる他の実施形態は、本発明の範囲内であると見なされる。たとえば、モデル・コード・マネージャ401および関連コンポーネントの全体的な機能が本願明細書での説明のとおりに(または、実質的にそのとおりに)実行される限り、前述した具体的なシーケンスを適宜変更することができる。
本発明に関連して用いられるシステムは、ハードウェア・サーバおよびソフトウェア・サーバ、アプリケーション・ソフトウェア、データベース・エンジン、ファイアウォール、セキュリティ、本番バックアップ・システム、および/またはアプリケーション・インターフェース・ソフトウェアを適宜および/または必要に応じて含む種々のコンポーネントの組み合わせになる。構成はネットワーク・ベースにすることができ、オプショナル(任意選択)でインターネットを、情報配信のための、カスタマとの例示的主要インターフェースとして利用することができる。
ユーザの視点で言えば、いくつかの実施形態では、ユーザは、インターネットへのアクセス権や他の適切なアクセス権を有する限り、公共のインターネットや他の適切なネットワークにアクセスして、いつでもどこからでも、個々に必要な具体的な情報を参照することができる。
付属書類
ユーザ・ガイド
アイ−ロジックス(I−Logix)
ラプソディ(Rhapsody(登録商標))
ユーザ・ガイド
リリース4.2
アイ−ロジックス(I−Logix)
第15章 コード生成
ラプソディ(Rhapsody)は、UMLモデルから実装コードを生成する。コンフィグレーション全体に対しても、選択したクラスに対しても、コードを生成することができる。コード・ジェネレータへの入力は、モデルと、コード生成(<lang>_CGおよびCG)プロパティである。コード・ジェネレータからの出力は、ターゲット言語でのソース・ファイル(仕様ファイル、実装ファイル、およびメイクファイル)である。
この章では、ラプソディ(Rhapsody)がUMLモデルからコードを生成する動作について説明する。この章は、以下のトピックについての情報を含む。
・概要 15−2頁
・コードを生成する 15−4頁
・ターゲットを樹立(ビルド)する 15−6頁
・実行可能ファイルを実行する 15−7頁
・個々の要素のコードを生成する 15−8頁
・コード生成の結果 15−9頁
・コードを表示および編集する 15−10頁
・ラウンドトリップ 15−12頁
・重複したコード・ファイルを削除する 15−22頁
・アクタのコードを生成する 15−22頁
・コンポーネント図のコードを生成する 15−23頁
・クロスパッケージの初期設定 15−25頁
・クラス・コード構造 15−26頁
・#ifdef−#endifでコードをラップする 15−36頁
・演算子をオーバーロードする 15−36頁
・匿名インスタンスを使用する 15−41頁
・関係を使用する 15−43頁
・静的アーキテクチャのサポート 15−45頁
・標準操作を用いる 15−48頁
概要
ラプソディ(Rhapsody)は、コード・ジェネレータと、1組のライブラリとして提供されるリアルタイムOXF(オブジェクト実行フレームワーク(Object Execution Framework))との間に、最低レベルの設計判断をユーザに代わって実装できる。この判断には、関連、関係オブジェクトの多重度、スレッド、状態マシンなどの設計要素の実装方法が含まれる。
コードを生成するには、以下の2つの方法がある。
・精緻的(elaborative)方法 関係、状態マシン生成、その他のすべてを無効にした状態で、ラプソディ(Rhapsody)を単にコード・ブラウザとして使用することができる。インスタンスの初期設定やリンクは生成されない。すべてを手動で行う。
・変換的(translative)方法 コンポーネント、リンク、および状態マシンを有するコンポジットを描き、ボタンをクリックして、アプリケーションを実行することができる。作成するコードは最小限でよい(少なくともいくつかのアクションをステートチャートに書く必要がある)。
ラプソディ(Rhapsody)コード・ジェネレータは、様々なレベルで精緻的にも変換的にもなることができる。ラプソディ(Rhapsody)は変換を強制しないが、ラプソディ(Rhapsody)を使用すれば、コード生成プロセスを、必要なレベルまで洗練させることができる。ラプソディ(Rhapsody)はいずれのモードでも実行でき、また、これら2つのモードの間の任意の中間的な状態でも実行できる。
注記:マイクロソフト(Microsoft)は、ラプソディ(Rhapsody)のデフォルト作業環境である。コンフィグレーションの環境設定で、他の「即時利用可能な」環境を指定することもできる。詳細については、第12章の「ブラウザ中のコンポーネント・フィグレーションの設定(Setting Component Configurations in the Browser)」の項を参照されたい。
図15.1は、ラプソディ(Rhapsody)でのコードの生成およびコンポーネントの樹立(ビルド)に関与する要素を示している。依存性矢印は、どのファイルがコード・ジェネレータによって生成され、どのファイルがコンパイラによって包含されるかを表す。コード・ジェネレータおよびコンパイラを囲む太い枠線は、これらがアクティブ・クラスであることを表す。
Figure 2005530238
コードを生成する
コードを生成する前に、アクティブ・コンフィグレーションを設定しなければならない(詳細については、第12章の「アクティブ・コンフィグレーションの設定(Setting the Active Configuration)」の項を参照されたい)。コード・ジェネレータは、自動的にチェッカを実行して、コードの生成やコンパイルにおいて問題を引き起こすおそれのある不整合性がないかどうかをチェックする。チェッカが実行するチェックのうちのいくつかは、コード生成前に修正されていないとコード生成が中断されるおそれのある潜在的に致命的な状況を検出する。実行するチェックの選択については、第14章「チェック(Checks)」を参照されたい。
アクティブ・コンフィグレーションのコードを生成するには、次のいずれかを行う。
・Code > Generate > <アクティブ・コンフィグレーション>を選択する。
・Ctrl+F7キーを押す。
タスク間通信およびラプソディ(Rhapsody)からのイベント・ディスパッチを行わなくてもコードを生成することは可能だが、その場合は、アニメーション機能や可視デバッグ機能が無効になることに注意されたい。この影響は、インハウスのタスク間通信およびイベント・ディスパッチのルーチンを、モデル内で定義された操作の中にラップすることによって軽減できる。この場合は、その操作が、「実際の」タスク間通信およびイベント・ディスパッチの代わりに可視化される。
コード生成を中断する
長いコード生成セッションを終了するには、Code > Stop Xを選択する。たとえば、コードをビルドしている途中の場合のオプション名はStop Buildである。
コード生成を中断する別の方法は、コンフィグレーションのルート生成ディレクトリにabort_code_gen(拡張子なし)というファイルを作成することである。ラプソディ(Rhapsody)は、コード生成中にそのファイルがないかどうかチェックする。そのファイルが見つかった場合、ラプソディ(Rhapsody)はそのファイルを削除してコード生成を中断する。
インクリメンタル・コード生成
ラプソディ(Rhapsody)は、コンフィグレーションのための初期コード生成の後、最後に生成された後に変更された要素についてのみコードを生成する。これにより、コード生成に要する時間が減り、性能が大幅に向上する。
インクリメンタル・コード生成のサポートのために、ラプソディ(Rhapsody)は、<コンフィグレーション(configuration)>.cg_infoというファイルをコンフィグレーション・ディレクトリに作成する。このファイルは、ラプソディ(Rhapsody)の内部用であり、コンフィグレーション管理下に置く必要はない。
全コード生成を強制する
場合によっては、変更した要素だけでなく、モデル全体の生成が必要になる。
モデルの完全な再生成を強制するには、Code > Re Generate > <コンフィグレーション>を選択する。
コンフィグレーション・ファイルを再生成する
モデルからクラスまたはパッケージを削除したり、パッケージに第1グローバル・インスタンスを追加したりした場合は、コンフィグレーション・ファイル(メイン・ファイルとメイクファイル)を再生成する必要がある。
コンフィグレーション・ファイルの再生成を強制するには、次のいずれかを行う。
・Code > Re Generate > Configuration Filesを選択する。
・ブラウザでアクティブ・コンフィグレーションを右クリックし、ポップアップ・メニューからGenerate Configuration Main and Makefilesを選択する。
パッケージのスマートな生成
ラプソディ(Rhapsody)は、パッケージに意味のある情報(インスタンス、型、関数など)が含まれている場合のみ、そのパッケージのコードを生成する。この動作は、不要なパッケージ・ファイルを生成しないことによって、コード生成プロセスを合理化する。
この動作を変更するには、CG::Package::GeneratePackageCodeプロパティを使用する。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
意味のある情報を含まない既存のパッケージ・ファイルを除去するには、Code > Clean Redundant Filesを選択する。
コードを生成する際の考慮事項
コードを生成する際には、以下の点を考慮されたい。
・非リアクティブ・クラスから継承したリアクティブ・クラスは、インストルメンテーション・モードでコンパイル警告を発生させる可能性がある。この警告は無視してよい。
・トリガされる操作を自己(循環)起動することは、フラットな(再利用不可の)ステートチャートでのみ可能である。これを再利用可能なステートチャートで行うと、生成されたアプリケーションはそれらを無視する。コード・ジェネレータは、こうした状況をチェックしない。
・コンポーネントの範囲外にある別のクラスに依存するクラスがある場合、ラプソディ(Rhapsody)は、その外部クラスに対する#include文を自動生成しない。その依存クラスのSpecIncludeプロパティを<lang>_CG::Classの下に設定しなければならない。
自動コード生成
Code > Dynamic Model Code Associativity(BidirectionalまたはOnline Code Generation設定)を選択した場合は、要素が変更され、その再生成が必要になると、ラプソディ(Rhapsody)が自動的にコードを生成する。この変更には以下のものが含まれる。
・要素自体の変更(要素の名前やプロパティの変更、要素の一部の追加または削除による変更など)
・要素の所有者、関連する要素、プロジェクト、選択されたコンポーネント、またはコンフィグレーションの変更
・Add to Model機能による、モデルへの要素の追加
・CMツールによる要素のチェックアウト
・要素の編集中のUndoコマンドの使用
次のいずれかのことを行うと、要素のコードが自動的に生成される。
・内部テキスト・エディタまたは外部エディタを使用して、要素のCode Viewウィンドウを開く。「コードを表示および編集する」の項を参照されたい。
・その要素の既存のCode Viewウィンドウにフォーカスを置く。
動的モデル/コード結合をNoneまたはRoundtripに設定した場合は、CodeメニューのGenerateコマンドを使用して、変更した要素のコードを生成する必要がある。詳細については、「動的モデル/コード結合」の項を参照されたい。
メイクファイルを生成する
ラプソディ(Rhapsody)は、コンパイルおよびリンクするファイル、それらの依存、およびコンパイルとリンクのコマンドの、それぞれのリストを含む簡単(プレーン)なメイクファイルを生成する。
ラプソディ(Rhapsody)は、ターゲット・ファイルを生成するときにメイクファイルを生成する。<lang>_CG::<環境(Environment)>の下のInvokeMakeプロパティは、メイクファイルの実行方法を定義する。メイクファイルの内容は、<lang>_CG::<環境(Environment)>の下のMakeFileContentプロパティを変更することによってカスタマイズできる。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
ターゲットをビルド(樹立)する
コードが正しく生成されたら、ターゲット・コンポーネントをビルドできる。次のいずれかの方法を用いる。
・Code > Build <ターゲット名(targetname)>.exeを選択する。
・CodeツールバーのBuild Targetアイコンをクリックする。
ラプソディ(Rhapsody)がコードをコンパイルするにつれ、Outputウィンドウにコンパイラ・メッセージが表示される。コンパイルが完了すると、「Build Done」というメッセージが表示される。
アプリケーションをビルドする前に古いオブジェクトを削除する
場合によっては、リンカが古いオブジェクトを使用してアプリケーションをリンクする可能性がある。
古いオブジェクトを一掃するには、次のいずれかの方法を用いる。
・Code > Cleanコマンドを使用して、現在のコンフィグレーションに関するすべてのコンパイル済みオブジェクト・ファイルを削除する。推奨されるのは、この方法である。
・毎回、Code > Rebuildコマンドを使用する。複雑なシステムの場合は時間がかかる場合がある。
・etc/msmake.bat内でメイクの開始を変更し、/Iオプションを外す。これにより、最初にエラーがあったソースでビルドが中止される。
・site.prpファイル内で、CPPCompileCommandプロパティをStringからMultiLineに変更し、その内容を、ファイルがコンパイルされる前に既存の.objファイルが削除されるように変更する。
例:
CPPCompileCommandプロパティ
メタクラスMicrosoft:
Property CPPCompileCommand MultiLine
" if exist $OMFileObjPath
erase $0MfileObjPath
$ (CPP)
$OMFileCPPCompileSwitches
/Fo\"$OMFileObjPath\"
\"$OMFileImpPath\" "
Metaclass VxWorks:
Property CPPCompileCommand MultiLine
" @echo Compiling
$OMFileImpPath
@$(RM) $OMFileObjPath
@$(CXX) $ (C++FLAGS)
$OMFileCPPCompileSwitches-o
$OMFileObjPath
$OMFileImpPath"
実行可能ファイルを実行する
ターゲット・ファイルをビルドしたら、次のいずれかの方法で実行できる。
・Code > Run <コンフィギュレーション(config)>.exeを選択する。
・CodeツールバーのRunツールをクリックする。
デフォルトの実行可能アプリケーションは、コンソール・アプリケーションである。このアプリケーションが起動されると、そのインストルメンテーション・レベルに関係なく、コンソール・ウィンドウが表示される。アプリケーションがテキスト・メッセージを標準出力装置に送ると、それらがコンソール・ウィンドウに表示される。
実行可能ファイル作成用ショートカット
コードおよびメイクファイルを生成し、ターゲットをビルドし、そのすべてを1つのステップで実行するには、次のいずれかを行う。
・Code > Generate/Make/Runを選択する。
・CodeツールバーのGenerate/Make/Runツールをクリックする。
インストルメンテーション
コードにアニメーション・インストルメンテーションを含めた場合は、コードを実行すると、Animationツールバーが表示される。コードにトレース・インストルメンテーションを含めた場合は、コードを実行すると、Traceウィンドウが表示される。コンフィグレーションのパラメータを設定するときに、アニメーション・インストルメンテーションまたはトレース・インストルメンテーションを選択できる。第12章の「コンフィグレーション(Configurations)」の項を参照されたい。
インストルメンテーションの詳細については、第18章「アニメーション(Animation)」および第19章「トレーシング(Tracing)」を参照されたい。
モデル実行を中止する
進行中のモデル実行を中止するには、次のいずれかの方法を用いる。
・Code > Stopを選択する。
・CodeツールバーのStop Make/Executionツールをクリックする。
個々の要素のコードを生成する
パッケージとそのすべてのクラスのコード、またはパッケージ内の選択したクラスのコードを生成することができる。コードの生成は、Codeメニュー、ブラウザ、またはOMDから行うことができる。
クラスまたはパッケージのコードを生成する前に、モデル全体の実行可能ファイルを生成する場合とまったく同じように、アクティブ・コンフィグレーションを設定しなければならない。詳細については、第12章の「アクティブ・コンフィグレーションの設定(Setting the Active Configuration)」の項を参照されたい。
Codeメニューを使用する
Codeメニューを用いてコードを生成するには、以下を行う。
1.ブラウザからクラスを選択するか、OMDで1つまたは複数のクラスを選択する。
2.Code > Generate > Selected Classesを選択する。
モデル全体のコードを少なくとも一度生成したことがある場合は、Generateコマンドによって、最後のコード生成の後に変更された要素のコードだけが生成される。
変更されているかどうかに関係なく、選択したすべての要素のコードを生成するには、以下を行う。
1.ブラウザからクラスを選択するか、OMDで1つまたは複数のクラスを選択する。
2.Code > Re Generate > Selected Classesを選択する。
ブラウザを使用する
ブラウザからコードを生成するには、以下を行う。
1.ブラウザで、パッケージまたはクラスを右クリックする。
2.パッケージの場合は、ポップアップ・メニューからGenerate Packageを選択して、該パッケージ内のすべてのクラスのコードを生成する。
クラスの場合は、ポップアップ・メニューからGenerate Classを選択して、そのクラスのコードだけを生成する。
オブジェクト・モデル図を使用する
OMDでクラスのコードを生成するには、そのクラスを右クリックし、ポップアップ・メニューからGenerate Classを選択する。
コード生成の結果
コード生成が完了すると、ラプソディ(Rhapsody)が結果を表示する。コード生成メッセージがOutputウィンドウに表示される。メッセージをクリックすると、モデル内の該当位置が表示される。
出力メッセージ
コードを生成し、ターゲットをビルドすると、操作の正常終了を伝えるメッセージか、エラーを知らせるメッセージがOutputウィンドウに表示される。
モデリング・コンストラクトによっては、コード生成エラーが発生する可能性がある。こうしたエラーのほとんどは、コードを生成する前にモデルをチェックすれば、深刻な問題が発生する前に発見して修正することができる。
エラーの強調表示と修正
ラプソディ(Rhapsody)では、メイク処理中にコンパイル・エラーを表示できる。コンパイル・エラーの原因を知るには、そのエラー・メッセージをダブルクリックする。エラーの原因に応じて、次のいずれかの結果が発生する。
・ステートチャート・エディタが開き、遷移または状態が強調表示されている。これは、その遷移または状態に正しくない表現を入力したことを意味する。ステートチャート・エディタでエラーを修正する。
・ブラウザが開き、属性または操作が強調表示されている。これは、属性または操作の定義に正しくない表現を入力したことを意味する。ブラウザでエラーを修正する。
・ソース・ファイルが開き、ある行が強調表示されている。これは、修正する必要がある設計内のアイテムをラプソディが表示できなかったことを意味する。この場合は、手動開発サイクルの場合のように、以下に示す方法でエラーの原因を識別する必要がある。
−エラーの原因が、ラウンドトリップ可能な注釈セクション内で見つかった場合は、ソース・ファイルでエラーを修正し、それをラウンドトリップする。
−エラーの原因がラウンドトリップ不可である場合は、そのエラーを引き起こす、モデル内のコンストラクト(操作パラメータ定義など)を修正する。
−モデル内に明らかな問題が見あたらず、選択したクラスについてコードを生成していた場合は、Code/Cleanメニュー・コマンドを使用してコンフィグレーション全体をクリーンにする。様々なバージョンのモデルでファイルが生成されていると、コンパイル・エラーが発生する可能性がある。
−あまりないことだが、モデル内になんら悪いところがなく、なおもコード生成の問題によってエラーが発生する場合は、アイ−ロジックス(I−Logix)カスタマ・サポートに連絡されたい。
コードを表示および編集する
Code View機能により、クラスや選択したパッケージ(ただし、コンフィグレーションではない)のコードを編集できる。1つまたは複数のクラスを選択し、好みのテキスト・エディタを起動して、そのコード・ファイルを直接編集することができる。
コード・ビュー・エディタの範囲を設定する
コードを表示および編集するためには、コード・ビュー・エディタの範囲を設定しなければならない。以下を行う。
1.表示したいコードを有するパッケージまたはクラスを含むコンポーネントを右クリックする。
2.ポップアップ・メニューからSet as Active Component領域を選択する。
3.Current Configuration領域(フィールド)で、使用したいコンフィグレーションを選択する。
コードを編集する
生成されたコードを編集するには、次のいずれかを行う。
・要素を強調表示し、Code > Edit > Selected classesを選択する。
・要素を右クリックし、Edit <要素(element)>を選択する。
選択したクラスまたはパッケージの仕様ファイルと実装ファイルが別々のウィンドウで開く。ファイルの編集には、内部テキスト・エディタまたは外部エディタを使用できる。詳細については、「外部エディタを使用する」の項を参照されたい。
動的モデル/コード結合(DMCA)の設定に応じて、コードに加えた変更を、自動的にラウンドトリップされるようにしたり、モデルに組み込まれるようにしたりできる。詳細については、「自動ラウンドトリップと強制ラウンドトリップ」の項を参照されたい。
さらに、外部エディタまたはコード・ジェネレータによってコードが変更されたときに、開いているコード・ビューが更新されるかどうかも、DMCA設定で決まる。コード生成の場合、コードが大幅に変更されている可能性がある。そうなった場合は、次のようなメッセージが表示される。
<ファイル名(filename)>:このファイルはソース・エディタ以外で変更されています。リロードしますか?
Yesをクリックすると、コード・ビューが新しいファイル内容で更新される。実装ファイルが古い情報で置き換えられることはない。
エディタ内でコードを再生成する
エディタで現在開いているファイルのコードを再生成するには、Code > Re Generate > Focused Viewsを選択する。
ファイルをエディタに関連付ける
特定のエディタを、ソース・ファイルの拡張子に関連付けることができる。以下を行う。
1.(General::Modelの下の)ClassCodeEditorプロパティをAssociateに設定する。
2.OKをクリックして変更を適用し、ダイアログ・ボックスを消す。
3.OKをクリックして変更を適用し、ダイアログ・ボックスを消す。
注記:Microsoft Visual C++ 6.0は、*.cppファイルおよび*.hファイルに関連付けられた操作のリストに「Open with MSDEV(MSDEVでオープンする)」操作を含む。MVC++ 6.0がインストールされている場合、ラプソディ(Rhapsody)は、ソース・ファイルを、「Open」操作にではなく誤って「Open with MSDEV」操作に関連付ける可能性がある。
ラプソディ(Rhapsody)がMVC++の「Open」操作をソース・ファイルに確実に関連付けるようにするには、以下を行う。
1.Windowsエクスプローラから、View > Options > File Typesを選択する。
2.ファイル・タイプ(たとえば、ファイル拡張子Hに関連付けられたC Header File)を選択し、Editを選択する。
Edit File Typeダイアログが開く。通常、最初にリストされているアクションは「Open with MSDEV」である。
3.Newをクリックし、「Open」アクションを追加し、そのOpenアクションを好みのエディタ・アプリケーションに関連付ける。
4.「Open with MSDEV」アクションを削除する。
外部エディタを使用する
コードの編集の際に外部エディタを指定するには、以下を行う。
1.File > Project Propertiesを選択する。
2.Propertiesタブを選択する。
3.General::Model::EditorCommandLineプロパティに移動する。
4.右カラムのプロパティ値呼び出しをクリックしてそのフィールドをアクティブにし、省略符号(...)をクリックしてBrowse for Fileダイアログ・ボックスを開く。
5.使用したいエディタ(たとえば、Notepad)の場所まで移動し、そのエディタを選択する。OKをクリックしてダイアログ・ボックスを消す。ラプソディによりプロパティ値フィールドにそのパスが入る。
6.OKをクリックしてダイアログ・ボックスを消す。
生成された操作を表示する
ラプソディ(Rhapsody)は、モデルごとに、属性および関係に対するsetter操作とgetter操作、イニシャライザ操作とクリーンアップ操作、およびstartBehavior()と呼ばれる操作を提供する。ただし、ラプソディ(Rhapsody)がこれらの自動生成された操作をブラウザに表示するのは、(CG::CGGeneralの下の)GeneratedCodeInBrowserプロパティがTrueに設定されている場合だけである。このプロパティを変更し、コードを再生成すると、自動生成された操作をブラウザに表示することができる。
ラウンドトリップ
ラウンドトリップは、ラプソディ(Rhapsody)が以前に生成したUMLコードが変更されたときに、その変更に基づいてモデルを更新する処理である。ラウンドトリップをバッチ・モードでアクティブにするには、ファイル・システム内でコードを更新し、モデルを明示的に同期させる。また、ラウンドトリップをオンライン(オン・ザ・フライ)・モードでアクティブにするには、いずれかのラプソディ(Rhapsody)指定ビューの中でモデルを変更する。
動的モデル/コード結合
ラプソディ(Rhapsody) UIを介してモデルを変更すると、その変更に対応するように動的モデル/コード結合(DMCA)がモデルのコードを変更する。逆に、モデルのコードを直接編集すると、その編集結果に対応するようにDMCAがモデルを再描画する。このようにして、ラプソディ(Rhapsody)は、モデルとコードとの間の緊密な関係およびトレーサビリティ(追跡可能性)を維持する。つまり、コードはモデルの別の姿である。
DMCA機能を設定するには、Code > Dynamic model/code associativityを選択する。プルダウン・メニューから以下のいずれかのオプションを選択する。
・Bidirectional(双方向性)−変更が双方向で自動的に処理される。すなわち、モデルを変更すると、新しい、更新されたコードが生成され、コードを直接編集すると、その編集結果がラプソディ(Rhapsody)モデルに自動的に反映される。
・Code Generation(コード生成)−モデルを変更すると新しいコードが自動的に生成されるが、コードを編集してもモデルは自動的には変更されない。
・Roundtripping(ラウンドトリップ)−コードを直接変更するとその結果がラプソディ(Rhapsody)モデルに反映されるが、モデルを変更しても新しいコードが自動的には生成されない。ラウンドトリップできるのは、ラプソディ(Rhapsody)によって以前に生成されたコードだけである。すなわち、ラプソディ(Rhapsody)によって以前に生成されたコードに限り、そのコードを編集して、その変更をモデルに組み込むことができる。詳細については、「ラウンドトリップ処理」の項を参照されたい。
・None(否)−DMCAが無効である。
これらの設定は、以下のプロパティに格納される。
・rhapsody.iniファイルのModelCodeAssociativityMode
・General::Modelの下のModelCodeAssociativityFineTune
ラウンドトリップ処理
ソース・ファイルを直接変更し、Code > Generate Codeを選択すると、ラプソディにより、コードをラウンドトリップするよう求められる。このセクションでは、ラウンドトリップ手続きにおけるオプションについて説明する。
自動ラウンドトリップと強制ラウンドトリップ
自動ラウンドトリップ(Bidirectional設定またはRoundtripping設定)を選択した場合は、次のいずれかを行うと、コードの変更に合わせてモデルが自動的に更新される。
・フォーカスをCode Viewウィンドウから別のウィンドウに移す。
・編集中のファイルを保存する。
・Code Viewウィンドウを閉じる。
強制的にラウンドトリップする場合は、次のいずれかを行う。
・Code > Roundtripを選択する。変更した要素についてコードがラウンドトリップされる。
・Code > Force Roundtripを選択する。すべての要素についてコードがラウンドトリップされる。
強制ラウンドトリップはいつでも行うことができる。DMCAをNoneまたはCodeGenerationに設定している場合、変更したコードをモデルにラウンドトリップするには、強制ラウンドトリップによるのが唯一の方法である。
クラスをラウンドトリップする
コンフィグレーション内の変更されたすべてのクラスをラウンドトリップするには、Code > Roundtrip > <現在のコンフィグレーション(current_config)>を選択する。
変更の有無に関係なく、コンフィグレーション内のすべてのクラスをラウンドトリップするには、Code > Force Roundtrip > <現在のコンフィグレーション(current_config)>を選択する。
複数のクラスについて変更をラウンドトリップするには、以下を行う。
1.OMDで、それらのクラスを左クリックする。
2.Code > Roundtrip > Selected classesを選択するか、それらのクラスを右クリックして、ポップアップ・メニューからRoundtripを選択する。
現在のコード・ビューでコードを強制的にラウンドトリップするには、Code > Force Roundtrip > Focused Viewsを選択する。
ラプソディ(Rhapsody)からの応答として、ラウンドトリップしたすべてのクラスについて、「Roundtripping class x」という形式のメッセージがリストアップされる。コードが生成されていないクラス(または実装ファイルが消去されたクラス)をラウンドトリップしようとすると、ラプソディ(Rhapsody)からの応答として、しかるべきエラー・メッセージが返され、そのクラスは変更されないことに注意されたい。
ラウンドトリップのためにコード・セグメントを変更する
ステートチャートで操作およびアクションとして入力された手続き的な振る舞いであるラウンドトリップのために、コード・セグメントを変更することができる。
実装コード内のセグメントはすべて、次のフォーマットを有する。
... generated code
//#[ セグメント型 セグメント識別子
C++ code you entered
//#]
... generated code continues
これらのコード・セグメントはすべて、実装ファイル内にある。
ラウンドトリップが可能なままで変更できるセグメントは、以下のものだけである。
・静的リアクション
//#[ リアクション リアクションID
// このコードは修正可能
someReactionCode();
// //#] 記号の先は修正しない
//#]
・出口アクション
//#[ exitAction ROOT.idle.(入力)
someExitAction();
//#]
・入口アクション
//#[ entryAction ROOT.idle.(入力)
someEntryAction();
//#]
・遷移アクション
//#[ 遷移 遷移ID
someTransitionCode();
//#]
プリミティブ操作(手続き的な振る舞い)
//#[ operation doit()
someOperationCode();
someMoreOperationCode();
//#]
失われたラウンドトリップ注釈を復元する
ラプソディ(Rhapsody)では、コードをラウンドトリップするために、コード・ジェネレータが実装ファイルに挿入した特別な注釈を使用する。これらの注釈には、プレフィックス「//#」が含まれる。これらの注釈を編集または削除すると、ラプソディ(Rhapsody)はコードをトレースしてモデルに反映することができない。
損なわれたラウンドトリップ注釈を復元するには、以下を行う。
1.損なわれたファイルの名前を変更する。
2.このクラスのコードを再生成する。これにより、正しい注釈を有する新しいファイルが生成される。
3.損なわれたファイルから、新しく生成されたファイルに変更内容をコピーする。
4.ラウンドトリップを再試行する。
いずれかのファイルを変更すると、次のメッセージが表示される。
ファイル<ファイル名>が外部から変更されています。ラウンドトリップしますか?
ファイルの内容を変更した場合は、ラウンドトリップにより、修正内容をモデルに加えなければならない。Yesを選択すると、ラウンドトリップが確定される。モデルが更新され、生成されたコードは、手動の変更内容を反映したものになる。
Noを選択すると、変更したファイルが上書きされ、変更内容が失われる。
サポートされる要素
一般に、ラウンドトリップできるコンポーネントは以下のとおりである。
・クラスおよびクラスの集約(テンプレート・クラス、型、ネストされたクラス)
・クラス要素(属性、プリミティブ操作の本体、引数、型)
・クラス・メンバ関数(名前、戻り型、引数)
・グローバル要素(関数、変数、型、テンプレート関数)
・パッケージ
・遷移ラベル上に配置されたアクション
・状態内部に配置されたアクション:入口に、出口に、または静的リアクションとして)
・注釈内のコード
・あらかじめコンパイルされた命令、#define
依存、継承、ステレオタイプ、状態、遷移、あらかじめコンパイルされた命令(#pragma、マクロ)、ファイルのヘッダ情報及びフッタ情報、およびファイル・マッピングに対して行われた変更については、ラウンドトリップがサポートされない。また、ラプソディ(Rhapsody)識別子でサポートされていないデータ(たとえば、可変データや揮発性データ)に対して行われた変更についてもサポートされない。
注記:ラプソディ(Rhapsody)には、ラウンドトリップによるモデルの変更を制限または制御するプロパティがある。「ラウンドトリップ・プロパティ」の項を参照されたい。
Rhapsody in C++/Jでは、Rhapsody in Cより多くのラウンドトリップ機能を提供している。それらはプロパティによって制御される。
この後のセクションでは、Rhapsody in C++でラウンドトリップできる、クラスおよびパッケージへの変更について説明する。現時点でRhapsody in JおよびRhapsody in Cがサポートしているのは、この機能のサブセットだけである。
クラスをラウンドトリップする
次の表は、クラス実装ファイルでの、ラウンドトリップが可能な変更のリストである。
Figure 2005530238
アクションはコード中に複数回現れる場合があることに注意されたい。ラプソディ(Rhapsody)は、そのアクション・コードの最初のオカレンス(発生セグメント)をラウンドトリップする。2つ以上のオカレンス(発生セグメント)を変更した場合は、最初に変更したオカレンスがラウンドトリップされる。1つの手法は、状態、状態アクション、および遷移アクションにおいて操作を呼び出すことである。それによって、アクション・コードの重複や、ラウンドトリップがあいまいになる可能性を排除できる。
次の表は、クラス仕様ファイルでの、ラウンドトリップが可能な変更のリストである。
Figure 2005530238
Figure 2005530238
パッケージをラウンドトリップする
ラプソディ(Rhapsody)は、パッケージ実装ファイル内の関数の引数名の変更をラウンドトリップする。ただし、引数型の変更はラウンドトリップされない。この名前を変更すると、この引数の記述が失われる。
ラプソディ(Rhapsody)は、変数の初期値の変更をラウンドトリップしない。
次の表は、パッケージ仕様ファイルでの、ラウンドトリップが可能な変更のリストである。
Figure 2005530238
DMCAが有効の状態で、関数、変数、またはインスタンスを削除するには、以下を行う。
1..hファイルまたは.cppファイルからその要素を削除する。
2.<Shift>キーを押したまま、フォーカスを.cppファイルまたは.hファイルに切り替える。
3.2番目のファイルから要素を削除する。
<Shift>キーを押したままにすることで、2番目のファイルを変更し終えるまでDMCAの発効が抑えられる。
DMCAをNoneに設定した状態で、関数、変数、またはインスタンスを削除するには、以下を行う。
1..hファイルまたは.cppファイルからその要素を削除し、このファイルを保存する。
2..cppファイルまたは.hファイルからその要素を削除し、このファイルを保存する。
ラウンドトリップ・プロパティ
ラプソディ(Rhapsody)は、ラウンドトリップを制御するプロパティを多数含む。それらは、<lang>_Roundtripで指定される(<lang>はプログラミング言語)。
たとえば、Rhapsody in Cでは、これらのプロパティはC_Roundtripにある。Rhapsody in C++では、CPP_Roundtripにある。
これらのプロパティの詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
次の表は、ラウンドトリップを制御するプロパティのリストである。
Figure 2005530238
重複したコード・ファイルを削除する
以下の理由でファイルが重複する場合がある。
・ファイルにマッピングされた要素が削除されたか、名前変更された。
・コンポーネントの範囲内で変更が行われた。
・ファイルへの要素のマッピングが変更された。
変更はコンポーネント・レベルの要素(コンポーネント、コンフィグレーション、フォルダ、およびファイル)で行われる。
重複したソース・ファイルをアクティブ・コンフィグレーションから削除するには、Code > Clean Redundant Source Filesを選択する。
アクタのコードを生成する
コンフィグレーションの作成のときに、アクタのコードを生成するよう選択できる(第12章の「コンフィグレーションの機能の定義(Defining Features of a Configuration)」の項を参照されたい)。アクタのコードを生成するようアクティブ・コンフィグレーションを設定すると、ラプソディ(Rhapsody)がアクタ・コードを、システムの他の部分と同じライブラリまたは実行可能ファイルに生成、コンパイル、およびリンクする。これにより、システム・テストの間じゅうアクタを使用して、システムに対する入力および応答をシミュレートできるようになる。
アクタについて生成されたコードにはいくつかの制限がある。これについては、「制限」の項を参照されたい。
コンポーネント内でアクタを選択する
クラスには、ラプソディ(Rhapsody)がアクタとクラスとの間の関係および依存についてコードを生成すべきかどうかを決定するコード生成プロパティがある。
コンポーネント内でのアクタのコード生成を選択するには、以下を行う。
1.ブラウザでそのコンポーネントを右クリックし、ポップアップ・メニューからFeaturesを選択する。
2.Initializationタブを選択する。
3.Initial Instancesで、そのコンポーネントに関与させるアクタを選択する。
4.Generate Code for Actorsが選択されていることを確認する。
Generate Code for Actorsは、デフォルトでは選択されているが、下位互換性を確保するためにバージョン3.0より古いモデルをロードすると選択解除される。
デフォルトでは、アクタが生成された場合のみ、アクタとクラスとの間の関係が生成される。この点は、CG::Relationの下のGenerateRelationWithActorsプロパティにより、クラス内で微調整できる。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
制限
アクタの作成方法にはいくつかの制限があり、これがコード生成に影響を及ぼす。その制限は以下のとおりである。
・OMD上では、アクタをコンポジットとして指定できない。したがって、ラプソディ(Rhapsody)は、そのコンポーネント間の関係を初期設定するコードを生成しない。
・アクタのベースは別のアクタでなければならない。クラスのベースは別のクラスでなければならない。
・アクタは、ネストされたアクタだけを埋め込むことができる。クラスは、ネストされたクラスだけを埋め込むことができる。
・アクタの名前は、クラス名のコード標準に適合していなくてもよい。ただし、アクタ名が不正な場合(すなわち、コンパイル可能な名前でない場合)は、コード生成の際にエラーが生成される。
コンポーネント図のコードを生成する
コンポーネント図には、以下のコード生成セマンティクス(意味論)が適用される。
・コード生成は、ライブラリ・ビルド・タイプおよび実行可能ビルド・タイプのコンポーネントに対して行われる。
・コード生成は、フォルダ・コンポーネントおよびファイル・コンポーネントに関連するメタタイプに対して行われる。
・コードは、バイナリ・コンポーネント(ライブラリおよび実行可能ファイル)間の関係に関してのみ生成される。
・コンポーネント図の以下の部分はコード生成を行わない。
−ファイルおよびフォルダが関与する関係
−コンポーネントによって実現されるインターフェース
−ステレオタイプ化された<<Library>>または<<Executable>>ではない、他のすべてのコンポーネント・タイプ
・コンポーネント間の依存は、以下の規制および制限の下で、<<Usage>>ステレオタイプを有する場合のみコードを生成する。
−関連コンポーネントは同名のコンフィグレーションを有していなければならない。
−2つの関連コンポーネントが同じ要素をマッピングする場合、コード生成では、最初にチェックされた関連コンポーネントを用いる。
−(単一バイナリ・コンポーネントの範囲内で)要素が一意にマッピングされている場合、その要素のファイル名はそのコンポーネントからとられる。
−要素が、生成されたコンポーネント(関連コンポーネント)の範囲内で見つからないか、他の何らかのコンポーネントに一意にマッピングされている場合は、要素のファイル名が合成される。
名前の合成を無効にするには、(CG::Componentの下の)UseDefaultNameForUnmappedElementsプロパティをFalseに設定する。
(CG::Componentの下の)ComponentsSearchPathプロパティは、関連コンポーネントの名前を指定する(ただし、このプロパティの前に依存がチェックされる)。たとえば、コンポーネントAからコンポーネントBへの依存は、ComponentsSearchPathプロパティ内に「B」を置くことと等価である(ただし、名前変更の復元に関しては明らかな優位性がある)。
次の図の中に示した図を考える。
Figure 2005530238
クラスC1およびC2は互いに関係(関連)がある。このモデルには2つのコンポーネント(component_1およびcomponent_2)があり、それぞれが同名のコンフィグレーションを有する。Component_1は、ステレオタイプ<<Usage>>により、component_2に依存している。クラスC1は、component_1の範囲内にある。
クラスC2は、component_1の範囲内にないが、component_2内のファイルF1にマッピングされる。
このステレオタイプが適用された場合、これは以下のコード生成セマンティクス(意味論)を反映する。
・関連コンポーネント内で要素のファイル名を探す(要素が現在のコンポーネントの範囲内にない場合)。
たとえば、component_1の生成のときに、C2を含める必要があれば、F1(component_2内のファイル)を含める。
・関連コンポーネントをメイクファイルのインクルード・パスに追加する。たとえば、component_1メイクファイル内で、component_2の場所を含むインクルード・パスに対して新しい行が追加される。
・現在のコンポーネントのビルド・タイプが実行可能ファイルであり、関連コンポーネントのビルド・タイプがライブラリの場合は、現在のコンポーネントのビルドにライブラリを追加する。たとえば、component_1のビルド・タイプが実行可能ファイルであり、component_2のビルド・タイプがライブラリであれば、component_1メイクファイルは、component_2のライブラリをそのビルドに含める。
クロスパッケージの初期設定
ラプソディ(Rhapsody)の、いくつかのプロパティでは、パッケージ・インスタンスの初期設定後で、かつ、これらのインスタンスがイベントに反応する前に、パッケージ関係を初期設定するコードを指定することができる。より一般的に言うと、これらのプロパティにより、モデル内のパッケージごとに、他の任意の初期設定コードを特定することができる。それらのプロパティにより、パッケージ関係に関与している任意のパッケージや、パッケージ関係に関与していないパッケージによるクロスパッケージ関係を初期設定することができる。
パッケージ初期設定コードを制御するプロパティは以下のとおりである。
・CG::Package::AdditionalInitializationCode−パッケージinitRelations()メソッドの実行後に実行する追加的初期設定コードを指定する。
・CG::Component::InitializationScheme−初期設定を行うレベルを指定する。とりうる値は以下のとおりである。
−ByPackage−各パッケージが自身の初期設定の役割を担う。コンポーネントは、各パッケージ・クラスの属性を宣言するだけでよい。これは、デフォルトのオプションであり、V3.0より古いラプソディ(Rhapsody)モデルとの下位互換性がある。
−ByComponent−コンポーネントが、そのすべてのパッケージで宣言されているすべてのグローバル関係を初期設定しなければならない。これは、各パッケージのinitRelations()、追加初期設定、およびstartBehavior()に対するコンポーネント・クラス・コンストラクタにおける明示的な呼び出しによって行われなければならない。
以下は、InitializationSchemeプロパティがByPackageに設定されている場合に、上記の図のモデルから生成されたC++コードの例である。
コンポーネント・コードは以下のとおりである。
class DefaultComponent {
private:
P1_OMInitializer
initializer_P1;
P2_OMInitializer
initializer_P2;
};
P1パッケージ・コードは以下のとおりである。
P1_OMInitializer::P1_OMInitializer() {
P1_initRelations();

< P1 AdditionalInitializationCode value>
P1_startBehavior();
}
以下は、InitializationSchemeプロパティがByComponentに設定されている場合に生成されたC++コンポーネント・コードの例である。
DefaultComponent::DefaultComponent() {
P1_initRelations();
P2_initRelations();

< P1 AdditionalInitializationCode value>

< P2 AdditionalInitializationCode value>
P1_startBehavior();
P2_startBehavior();
}
クラス・コード構造
このセクションでは、モデルがどのようにコードにマッピングされるか、およびモデル・マッピングをどのように制御できるかを含め、生成されたコードの構造について説明する。生成されたソース・コードは、モデル要素のほかに、注釈と、インストルメンテーション・マクロ(装備されている場合)を含む。
注記:注釈は、コード・コンストラクトを設計コンストラクトにマッピングする。注釈は、両者間のトレースに重要な役割を果たす。注釈を改変したり、削除したりしてはならない。それを行うと、モデルとコードとの間のトレースを妨げることになる。注釈は、2つのスラッシュとシャープ記号(//#)で始まるコメント行である。
インストルメンテーション・マクロは、アニメーション/トレース・フレームワークをサービスするフックおよびユーティリティ関数になる。これらは、ソース・コードへの影響を最小限にするマクロとして実装される。インストルメンテーション・マクロを削除すると、アニメーションが正しく動作しない。
示すコード構造は汎用的なものであり、classやstateなどの一般的な名前を使用している。実際に使用するコードには、実際の名前を使用することになる。
クラス・ヘッダ・ファイル
クラス・ヘッダ・ファイルには以下のセクションが含まれる。
・プロローグ
・前方宣言
・インストルメンテーション
・仮想継承とプライベート継承
・ユーザ定義の属性および操作
・可変長引数並び(リスト)
・関係情報
・ステートチャート実装
・イベント・インターフェース
・シリアル化インストルメンテーション
・状態クラス
プロローグ
プロローグ・セクションは、フレームワーク・ファイルと、ヘッダ・ファイルまたはフッタ・ファイル(適用可能な場合)を含む。
<lang>_CG::Class/Package::SpecIncludesプロパティを使用して新たなインクルード・ファイルを追加することができる。これは、ラプソディ(Rhapsody)設計に含まれないモジュールへの依存を作成するときに必要になる場合がある。
例:
#ifndef class_H
#define class_H
#include <oxf/oxf.h> // フレームワーク・ヘッダ・ファイル
//------------------------------------------------------
// class.h
//------------------------------------------------------
他のクラスとの関係
ヘッダ・ファイルのこのセクションは、すべての関連クラスに対する前方宣言を含む。これらは、モデル内で指定された、クラスと他のクラスとの関係に基づく。
例:
class forwarded-class1;
class forwarded-class2;

class class : public OMReactive {
// クラス定義、およびフレームワーク・クラスからの継承(必要な場合!)
//
インストルメンテーション
インストルメンテーションを用いてコンパイルした場合は、システムのランタイム状態に関する情報がインストルメンテーション・マクロからアニメーションにもたらされる。
例:
DECLARE−META // クラスのインストルメンテーション
継承
仮想継承を用いると、サブクラスは、複数の継承を経て、共通アンセスタから1組のメンバだけを継承する。
仮想継承を用いるには、サブクラスのVirtualInheritsプロパティを、そのサブクラスが仮想として継承する源であるスーパクラスの名前に設定する。複数のスーパクラス名はカンマで区切る。
たとえば、クラスBがスーパクラスAを有し、BのVirtualInheritsプロパティが「A」に設定されている場合は、Bについて以下の宣言が生成される。
class B : virtual public A {...};
プライベート継承を用いると、サブクラスは、スーパクラスのパブリック・メンバだけを継承する。継承されたメンバは、サブクラス内でプライベートになる。
プライベート継承を用いるには、サブクラスのPrivateInheritsプロパティを、そのサブクラスがプライベートとして継承する源であるスーパクラスの名前に設定する。複数のスーパクラス名はカンマで区切る。
たとえば、クラスBがスーパクラスAを有し、BのPrivateInheritsプロパティが「A」に設定されている場合は、Bについて以下の宣言が生成される。
class B : private A {...};
ユーザ定義の属性および操作
このセクションでは、すべての操作および属性データ・メンバが定義される。このセクションのコードは、クラスの操作および属性の直接変換である。これを制御するには、モデルに対して操作および属性を追加または削除する。
例:
//// ユーザの明示的なエントリ ////
public :
//## operation
op1() // 操作の注釈
void
op1();
// 操作の定義
protected :
// 属性:
//## attribute
attr1 // 属性の注釈
attrType1
attr1; // 属性の定義
//// ユーザの暗黙的なエントリ
////
public :
// コンストラクタとデストラクタ:
class(OMThread* thread =
theMainThread);
virtual〜class();
// 生成されたデストラクタ
可変長引数並び(リスト)
可変長引数並び(...)を、操作の最後の引数として追加するには、その操作のPropertiesダイアログ・ボックスを開き、CG::Operation::VariableLengthArgumentListプロパティをTrueに設定する。
たとえば、操作void foo(int i)についてVariableLengthArgumentListプロパティがTrueに設定されている場合は、foo()について次の宣言が生成される。
void foo(int i,...) ;
関係に関して合成された方法およびデータ・メンバ
ヘッダ・ファイルのこのセクションは、モデル内で定義されているクラスのすべての関係を含む。必要に応じて、データ・メンバや、関係を操作する1組のアクセッサ関数およびミューテータ関数を含む。
このセクションは、関係プロパティおよびコンテナ・プロパティを変更することによって制御できる。CGプロパティの詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
例:

OMIterator<rclass1*> getrelation1()const;
void
addrelation1(rclass* p);
void removerelation1(rclass*
p);
void clearrelation1();
protected :
//

OMCollection<rclass*> relation1;
attrType1
getattr1()const;
void
setattrType1(attrType1 p);
ステートチャート実装
ヘッダ・ファイルのこのセクションは、クラスのステートチャート動作のデータ・メンバおよび関数定義を含む。このセクションの内容は、ステートチャートの実装ストラテジによって異なる。このセクションは、以下のいずれかの方法で制御できる。
・ステートチャート実装ストラテジを再利用可能からフラットに変更する。
・ステートチャートのコード生成を無効にする。
例:
//// フレームワーク・エントリ
////
public :
State*
state1; //状態変数

State* state2;
void
rootStateEntDef(); //初期遷移メソッド
//
int
state1Takeevent1(); //イベント・テイカ
int state2Takeevent2();
private :
void
initRelations(); //フレームワーク・メンバを初期設定

//するためにInitRelations

//またはInitStatechart

//が生成される。
void
cleanUpRelations(); //破壊されたフレームワーク・メンバを

//クリーンアップするために

//CleanupRelationsまたは

//CleanupStatechartが

//生成される。
注記:initRelations()操作およびcleanUpRelations()操作は、プロパティCG:Class:InitCleanUpRelationsがtrueに設定されている場合のみ生成される。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
イベント・インターフェース
コードのこのセクションは、クラスで消費されたイベントを示す。これはドキュメンテーション専用である。イベントはすべて、OMReactiveにある共通インターフェースを介して処理されるからである。このセクションは、イベント処理を自力で実装したい場合に有用である。
例:
//// 消費されたイベント
////
public :
// イベント群:
// event1
// event2
コード生成がイベント内の配列タイプをサポートすることに注意されたい。次のGEN()を作成することが可能である。
Client−>GEN(E(“Hello world !”));
この呼び出しにおいて、Eは次のように定義される。
class E : public OMEvent {
Char message[13];
};
シリアル化インストルメンテーション
インストルメンテーションを含めると、次のインストルメンテーション・マクロがヘッダ・ファイルに含まれる。
DECLARE_META_EVENT
};
これは、アニメーションのシリアル化サービスを実装するメソッド定義まで拡張される。
状態クラス
この状態は、クラスのステートチャートを構成する状態クラスを定義する。状態クラスは、再利用可能な状態実装ストラテジで生成される。
例:
class state1 : public ComponentState {
public :
// 状態クラス実装
};
class state2 : public Orstate {
public :
// 状態クラス実装
};
#endif
フラットな実装ストラテジを選択することによって状態クラスを排除できる。この場合、状態は列挙型としてマニフェストされる。
実装ファイル
クラス実装ファイルは、仕様ファイルで定義されたメソッドの実装を含む。さらに、クラス実装ファイルは、インストルメンテーション・マクロ及び注釈を含む。前述したとおり、インストルメンテーション・マクロと注釈のいずれかを排除または変更すると、モデルとコードとの間のトレースおよび機能性を妨げる可能性がある。
ヘッダとフッタ
生成されたファイルに対し、独自のヘッダおよびフッタを定義できる。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
プロローグ
実装ファイルのプロローグ・セクションは、すべての関連クラスのヘッダ・ファイルを含む。C_およびCPP::Class/Package::ImpIncludesプロパティを用いて、新たな#includeファイルを追加できる。このプロパティの詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
コードのセクションを#ifdef #endif命令でラップし、コンパイラ固有のキーワードを追加し、プロローグ・プロパティとエピローグ・プロパティとを用いて#pragma命令を追加することができる。詳細については、「#ifdef−#endifでコードをラップする」を参照されたい。
以下のコードは、プロローグ・セクションのサンプルである。
//## package package
//## class class
#include "class.h"
#include <package.h>
#include <rclass1.h>
#include <rclass2.h>
//-------------------------------------------------------
//class.cpp
//-------------------------------------------------------
DECLARE_META_PACKAGE(Default)
#define op1_SERIALIZE
コンストラクタとデストラクタ
各クラスに対し、デフォルトのコンストラクタとデストラクタが生成される。新たなコンストラクタ(群)を明示的に指定したり、新たなコンストラクタ(群)をモデルに明示的に追加してデフォルトのコンストラクタまたはデストラクタを無効にしたりできる。
例:
class::class(OMThread* thread) {

NOTIFY_CONSTRUCTOR(class, class(), 0,

class_SERIALIZE);
setThread(thread);
initRelations();
};
状態を定義する場合は、initRelationsの代わりにinitStatechartを用いる。
class::〜class() {
NOTIFY_DESTRUCTOR(〜class);
cleanUpRelations();
};
同様に、状態を定義する場合は、cleanUpRelationsの代わりにcleanUpStatechartを用いる。
操作
以下のコード・パターンは、すべてのプリミティブ(ユーザ定義)操作に対して作成される。
void class::op1() {
NOTIFY_OPERATION(op1,
op1(), 0, op1_SERIALIZE);

//インストルメンテーション
//#[ operation
op1() // 入力した、操作の注釈本体

//
//#]
};
属性および関係に対するアクセッサとミューテータ
アクセッサとミューテータは、クラスの各属性および関係に対して自動的に生成される。それらの内容および生成は、関係プロパティと属性プロパティを設定することによって制御できる。
例:
attr1Type class::getattr1()const {
return attr1;
};
void class::setattr1(attr1type p) {
attr1 = p;
};
OMIteratorrclass*
class::getItsrclass()const {
OMIteratorrclass*
iter(itsrclass);
return iter;
};
void Referee::_addItsRclass(Class* p_Class)
{
NOTIFY_RELATION_ITEM
ADDED("itsRClass",p_Class,
FALSE, FALSE);

itsRclass->add(p_Class);
};
void class::removeItsrclass(rclass* p) {

NOTIFY_RELATION_ITEM_REMOVED();
rclass.remove(p);
};
void class::clearItsPing() {
};
インストルメンテーション
このセクションは、アニメーションで使用されるインストルメンテーション・マクロとシリアル化ルーチンを含む。
例:
void class::serializeAttributes()const {
// 属性をシリアル化する
};
void class::serializeRelations()const {
// 関係をシリアル化する
};
IMPLEMENT_META(class, FALSE)
IMPLEMENT_GET_CONCEPT(state)
状態イベント・テイカ
これらのメソッドは、状態、イベント、および遷移の動作を実装する。これらは、ステートチャートに基づいて合成される。クラスのCG::Attribute/Event/File/Generalization/Operation/Relation::Generateプロパティをfalseに設定すると、それらは生成されない。
例:
int class::state1Takeevent1() {
int res = eventNotConsumed;
SETPARAMS(hungry);

NOTIFY_TRANSITION_STARTED("2");
Transition code

NOTIFY_TRANSITION_TERMINATED("2");
res = eventConsumed;
return res;
};
初期設定とクリーンアップ
これらのメソッドは、フレームワーク関連の初期設定およびクリーンアップを実装する。
例:
void class::initRelations() {
state1 = new
state1Class(); //状態を作成する
};
void class::cleanUpRelations() {
};
状態クラスの実装
このセクションは、各状態オブジェクトのディスパッチ・メソッドとコンストラクタを実装する。これは、状態クラスを生成しない、フラットな実装ストラテジを選択することによって変更できる。
例:
class_state1::class_state1(class* c, State*
p,
State* cmp) :
LeafState(p, cmp) {
// 状態コンストラクタ
};
int class_state1::takeEvent(short id)
{
int res =
eventNotConsumed;
switch(id) {

case event1_id: {

res = concept->state1Takeevent1();

// 遷移メソッドのディスパッチ

break;

};
};
};
#ifdef−#endifでコードをラップする
操作を#ifdefと#endifのペアでラップするか、コンパイラ固有のキーワードを追加するか、#pragma命令を追加する必要がある場合は、その操作のSpecificationProlog、SpecificationEpilog、ImplementationProlog、ImplementationEpilogの各プロパティを設定できる。
たとえば、コードが_DEBUGでコンパイルされた場合のみ操作が可能であるよう指定するには、以下を行う。
・SpecificationPrologを#ifdef _DEBUGに設定する。
・SpecificationEpilogを#endifに設定する。
・ImplementationPrologを#ifdef _DEBUGに設定する。
・ImplementationEpilogを#endifに設定する。
コンフィグレーション、パッケージ、クラス、および属性についても、同じプロパティが使用可能である。
注記:ラプソディ(Rhapsody)では、後続の新規行が暗黙のうちに追加されることがない。このため、同じ行にプロローグとエピローグを追加できる。プロローグとエピローグが異なる行にあるようにするには、Enterキーを押す。
演算子をオーバーロードする
ラプソディ(Rhapsody)で作成されたクラスに対する演算子をオーバーロードできる。たとえば、Stackクラスに対しては、「+」演算子を、自動的にpush()操作を実行するようにオーバーロードでき、「−」演算子を、自動的にpop()操作を実行するようにオーバーロードできる。
ストリーム出力演算子operator<<を除き、オーバーロードされた演算子(演算子(operator)+や演算子(operator)−など)はすべて、メンバ関数としてモデル化できる(ストリーム出力演算子は、メンバ関数ではなくグローバル関数であり、フレンド関数として宣言されなければならない)。クラス・メンバであるオーバーロードされた演算子はすべて、プリミティブ操作として定義される。
演算子のオーバーロードを例示するために、2つのクラスComplexおよびMainClassを以下のように定義する。
クラスComplex
Attributes:
double imag;
double real;
Operations:

Complex()
//単純なコンストラクタ
Body:
{

real = imag = 0. 0;
}
Complex(const
Complex& c) //コピー・コンストラクタ
Arguments:const
Complex& c
Body:
{

real = c.real;

imag = c.imag;
}
Complex(double r, double
i) //変換コンストラクタ
Arguments: double
r

double i = 0.0
Body:
{
real = r;
imag = i;
}
operator-(Complex
c) //減算
Return type: Complex
Arguments: Complex c
Body:
{

return Complex(real -c.real, imag - c.imag);
}
operator[](int
index) //配列サブスクリプト
Return type:
Complex&
Arguments: int
index //ダミー演算子(インストル

//メンテーション・チェック

//専用)
Body:
{

return *this;
}
operator+ (Complex&
c) // 値の追加
Return type: Complex
Arguments: Complex&
c
Body:
{

return Complex(real + c.real,imag + c.imag);
}
operator+(Complex*
c) // 参照の追加
Return type: Complex*
Arguments: Complex *c
Body:
{

cGlobal = new Complex (real + c->real,

imag + c->imag);

return cGlobal;
}

operator++()
// プレフィックスのインクリメント
Return type:
Complex&
Body:
{

real += 1.0;

imag += 1.0;

return *this;
}
operator=(Complex&
c) // 値の代入
Return type:
Complex&
Arguments: Complex&
c
Body:
{

real = c.real,

imag = c.imag;

return *this;
}
operator=(Complex*
c) // 参照の代入
Return type: Complex*
Arguments: Complex *c
Body:
{

real = c->real;

imag = c->imag;

return this;
}
以下、これらのオーバーロードされた演算子の生成されたコードの例をいくつか示す。
これは、オーバーロードされたプレフィックス・インクリメント演算子の生成されたコードである。
Complex& Complex::operator++() {
NOTIFY_OPERATION(operator++,
operator++(), 0,

operator_SERIALIZE);
//#[ operation
operator++()
real += 1.0;
imag += 1.0;
return *this;
//#]
};
これは、オーバーロードされた+演算子の生成されたコードである。
Complex Complex::operator+(Complex& c)
{
NOTIFY_OPERATION(operator+,
operator+(Complex&), 1,

OM_operator_1_SERIALIZE);
//#[ operation
operator+(Complex&)
return Complex(real +
c.real, imag + c.imag);
//#]
};
これは、最初のオーバーロードされた代入演算子の生成されたコードである。
Complex&
Complex::operator=(Complex& c) {

NOTIFY_OPERATION(operator=, operator=(Complex&), 1,

OM_operator_2_SERIALIZE);
//#[ operation
operator=(Complex&)
real = c.real;
imag = c.imag;
return *this;
//#]
};
ブラウザには、3つのComplexクラスをインスタンス化するコンポジットであるMainClassがリストされる。
その属性は以下のとおりである。
Complex* c1
Complex* c2
Complex* c3
その操作は以下のとおりである。
〜MainClass()
// デストラクタ
Body
{
delete c1;
delete c2;
delete c3;
}
e()
// イベント
ストリーム出力演算子<<は、これを用いようとするクラスに対するフレンドとして宣言されなければならないグローバル関数である。これは以下のように定義される。
operator<<
Return type: ostream&
Arguments: ostream& s

Complex& c
Body:
{
s << "real
part = " "<< c.real<<

"imagine part = " << c.imag << "\n" <<
flush;
return s;
}
種々のコンストラクタおよびオーバーロードされた演算子を、それらが呼び出されるときに監視するには、以下を行う。
1.Code > Set Configuration > Edit > Setting tabを選択して、プロジェクトにアニメーション・インストルメンテーションを割り当てる。
2.DefaultConfig.exeを作って実行する。
3.アニメータを用いて、MainClassとインスタンスComplex [0]:Complex、Complex [1]:Complex、およびComplex [2]:Complexを含む、アニメートされたシーケンス図(ASD)を作成する。
4.AnimationバーのGoをクリックして、MainClassとそのパート・インスタンスとの間で渡される、コンストラクタおよびオーバーロードされた演算子のメッセージを監視する。
ASDは次の図のように表示される。
Figure 2005530238
匿名インスタンスを使用する
ラプソディ(Rhapsody)では、ユーザが自分で管理する匿名インスタンスを作成したり、コンポジット・フレームワークで管理されるコンポジット・インスタンスのコンポーネントとしてインスタンスを作成したりできる。
匿名インスタンスを作成する
匿名インスタンスを作成し、従来の任意のC++プログラムと同様に、C++の新しい演算子を適用することができる。ラプソディ(Rhapsody)は、システム内のすべてのクラスについて、デフォルトのコンストラクタ(ctor)を生成する。ユーザは、ブラウザを用いて、新たなコンストラクタを追加できる。
たとえば、デフォルトのコンストラクタを用いてクラスAの新しいインスタンスを作成するには、次のコードを入力する。
A *a = new A();
リアクティブ・クラスおよびコンポジット・クラスの場合、デフォルトのコンストラクタは、デフォルトでシステムのメイン・スレッドに設定されるスレッド・パラメータをとる。インスタンスを、システムのメイン・スレッドではなく特定のスレッドに関連付けるには、このパラメータを明示的にコンストラクタに渡す必要がある。
次の例は、クラスAのインスタンスを作成し、これをスレッドTに割り当てるものである。
A *a = new A(T);
新しいインスタンスを作成したら、通常は、その関係ミューテータを呼び出して、それをそのピアに接続することになる(「関係を使用する」の項を参照されたい)。クラスがリアクティブであれば、通常は、そのstartBehavior()メソッドを次に呼び出すことになる。
コンポジット・インスタンスは、新しいコンポーネントの作成のための専用操作を提供することにより、コンポーネントの作成を管理する。各コンポーネントについて、Philosopher型の操作philが存在する。新しいphil操作は、新しいインスタンスを作成し、これをコンポーネント関係に追加し、そのスレッドを新しいコンポーネントに渡す。
次のコードは、コンポジットsysが新しいコンポーネントphilを作成する方法を示す。
Philosopher *pPhil = sys−>newPhil();
新しいインスタンスを作成したら、通常は、その関係ミューテータを呼び出して、それをそのピアに接続することになる。クラスがリアクティブであれば、通常は、そのstartBehavior()メソッドを次に呼び出すことになる。
匿名インスタンスを削除する
ラプソディ(Rhapsody)では、ユーザが自分で匿名インスタンスを管理する。したがって、それらを削除するのもユーザの責任である。コンポジット・インスタンスのコンポーネントは、コンポジットによって管理される。それを削除するには、コンポジット・オブジェクトの明示的な要求を行う必要がある。
従来の任意のC++プログラムと同様に、C++の削除演算子を適用する。インスタンスの削除は、そのインスタンスのデストラクタの適用を伴う。ラプソディ(Rhapsody)は、システム内のすべてのクラスについてデフォルトのデストラクタを生成する。このデストラクタに対しては、ブラウザを用いてコードを追加することができる。
たとえば、aBでポイントされるインスタンスを削除するには、次の呼び出しを用いる。
delete aB;
コンポジットのコンポーネントを削除する
コンポジットの各コンポーネントに対し、そのコンポーネントのインスタンスを削除する専用操作が存在する。
たとえば、コンポジットC内のcompBというコンポーネントから、aBでポイントされるインスタンスを削除するには、次の呼び出しを用いる。
C−>deleteCompB(aB);
関係を使用する
関係は、他のオブジェクトを参照するための基本的な手段である。関係は、コンテナ・クラスを用いてコードに実装される。ラプソディ(Rhapsody)フレームワークは、デフォルトで使用される1セットのコンテナ・クラスを含む。プロパティを用いて、このデフォルトを、たとえば、Standard Template Library (STL)(商標)コンテナを使用するように変更できる。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
この章で説明するコレクションと関係アクセッサ関数および関係ミューテータ関数は、ラプソディ(Rhapsody)で提供されるデフォルトのセットを参照する。
対1関係
対1関係は、単純なポインタとして実装される。これらの扱いは、属性の扱いと非常によく似ている。すなわち、対1関係にもアクセッサ関数とミューテータ関数がある。
Bが、ロール名roleによってAに関連付けられたクラスであるとすれば、Aは次のデータ・メンバを含む。
B* role;
これは次のメソッドを含む。
B* getRole();
void setRole(B* p_B);
これらのデフォルトは、そのロールのプロパティによって変更できる。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
対多関係
対多関係は、OMCollectionテンプレートを用いるポインタのコレクションによって実装される。
Fが、ロール名roleによってEに多様に関連付けられたクラス名であれば、Eは次のデータ・メンバを含む。
OMCollection<F*> role;
この関係を操作するために、次のメソッドがE内に生成される。
・この関係を最初から最後まで繰り返すには、次のアクセッサを用いる。
OMIterator<F*> getRole() const;
たとえば、関連付けられたFオブジェクトのそれぞれにイベントxを送るには、以下のコードを用いる。
OMIterator<F*>
iter(anE->getRole());
while(*iter)
{
*iter->GEN();
iter++;
}
このコードでは、anEがEのインスタンスである。
・コレクションにインスタンスを追加するには、次の呼び出しを用いる。
void addRole(F* p_F);
・コレクションからインスタンスを削除するには、次の呼び出しを用いる。
void removeRole(F* p_F);
・コレクションをクリアするには、次の呼び出しを用いる。
void clearRole();
これらのデフォルトは、そのロールのプロパティによって変更できる。詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
順序付き対多関係
順序付き対多関係は、OMListテンプレートを用いるポインタのコレクションによって実装される。
対多関係に順序を付けるには、その関係のOrderedプロパティをTrueにする。
操作メソッドはすべて、「対多関係」の項で述べたものと同じである。
好適化された対多関係
好適化された対多関係は、関連クラス内の属性によって好適化された対多関係である。好適化された対多関係は、OMMapテンプレートを用いるポインタのコレクションによって実装される。
操作メソッドはすべて、「対多関係」の項で述べたものと同じである。さらに、以下の鍵修飾(キーによって好適化)されたメソッドが提供される。
F* getRole(type key) const;
void addRole(type key, F* p_F);
void removeRole(type key);
ランダム・アクセス対多関係
ランダム・アクセス対多関係は、コレクション内のアイテムへのランダム・アクセスが可能であるよう拡張された対多関係である。
対多関係をランダム・アクセス可能にするには、その関係のGetAtGenerateプロパティをTrueにする。これにより、新しいアクセッサが生成される。
F* getRole(int i) const;
静的アーキテクチャのサポート
メモリに制約があり、過酷で、リアルタイムかつ安全性重視のアプリケーションでは、静的なアーキテクチャがよく用いられる。メモリ管理を行わないアプリケーションや、非決定性およびメモリ・フラグメンテーションによって問題が発生するアプリケーションを、ラプソディ(Rhapsody)は、(初期設定後の)実行中に汎用メモリ管理(即ち、ヒープ)機能をまったく用いないことによってサポートする。これは、安全性重視システムの典型的な要件である。
ラプソディ(Rhapsody)では、汎用ヒープ機能を用いないようにするために、指定されたクラスに対する特別なアロケータ(即ち、ローカル・ヒープ)を作成する。ローカル・ヒープは、ユーザが定義した数のオブジェクトを収容できる、あらかじめアロケートされた、連続的な境界付きメモリ・チャンクである。ローカル・ヒープのアロケーションは、安全かつ単純なアルゴリズムによって行う。ローカル・ヒープを用いることは、イベントやトリガされる操作では特に重要である。
ラプソディ(Rhapsody)アプリケーションは、以下の場合には、暗黙的にも明示的にも動的メモリ操作になる。
・イベント生成(暗黙的)−任意選択でローカル・ヒープによって解決される
・関係の追加−静的配列を用いて実装することにより解決される(動的コンテナは動的のまま)
・新しい演算子によるアプリケーション・オブジェクトの明示的作成−アプリケーションが実際にはオブジェクトを動的に作成する場合に、ローカル・ヒープによって解決される。
ローカル・ヒープを、クラス、トリガされる操作、イベント、およびスレッド・イベント・キューのすべてに適用するか、それらの一部だけに適用するかを指定することができる。
注記:バージョン2.0でoMListを用いて実装されたイベント・キューは、バージョン2.1ではOMArrayに変更されている。リンクされた並び(リスト)ではなく動的配列を使用してイベント・キューを実装すると、メモリ動作や時間的動作が変わる。
静的メモリ・アロケーションのプロパティ
以下の表は、生成されたコードに対する静的アロケーションのコンフィグレーションを行うことができるいくつかのプロパティのリストである。これらのうちのいずれかのプロパティを、個々のインスタンスより高いレベルで設定すると、すべてのインスタンスについてデフォルトが設定される。たとえば、クラス・プロパティをコンポーネント・レベルで設定すると、すべてのクラス・インスタンスについてデフォルトが設定される。いずれの場合でも、インスタンスの実際の数が、宣言されている最大数を超えると、動作が定義されない。
Figure 2005530238
これらのプロパティの詳細については、「プロパティ参照ガイド(Properties Reference Guide)」を参照されたい。
割り込みハンドラ内で生成されたイベントは、リスケジューリングに頼らないようにすべきであり、したがって、オペレーティング・システムのミューテックスを使用することにならないようにすべきである。つまり、ProtectStaticMemoryPoolはFalseでなければならない。メモリ・プールがスレッド・セーフでないことの確認はユーザが行わなければならない。アニメーション・フレームワークは、この制限の対象ではない。
フレームワーク・ファイルは、動的アロケーションでも静的アロケーションでも使用可能なコードを含む。実際の使い方は、生成されたコードに基づく。GENおよびgenマクロの使い方は、両モードで同じである。
(<lang>_CG:Relationの下の)ImplementWithStaticArrayプロパティを介して、固定の境界付き関係を静的配列に実装すると、初期設定から逸脱した静的アロケーションが暗黙的に使用される。
静的メモリ・アロケーション・アルゴリズム
ラプソディ(Rhapsody)は、ローカル・ヒープを用いる各イベントおよびクラスについてnew演算子とdelete演算子を再定義することによって、静的メモリ・アロケーションを実装する。メモリ・アロケータは、特定要素のn個のインスタンスを保持するのに十分なメモリを割り当てる(アロケートする)(nは、BaseNumberOfInstancesプロパティの値である)。メモリ・アロケーションは、システム構築中に実行され、動的メモリを使用する。メモリ・アロケータは、次のようなLIFO(スタック)アルゴリズムを用いる。
・要求されたメモリはスタックの最上位から取り出され、最上位ポインタが次のアイテムをポイントするよう移動する。
・返されたメモリはスタックの最上位に格納され、最上位ポインタが、返されたアイテムをポイントするよう移動する。
生成されたクラスは、クラスであれ、イベントであれ、トリガされる操作であれ、メモリ・アロケータ(特にnextポインタ)が使用するための必要な追加的コードを導入するように配備される。
メモリ・プールが空になったクラスをインスタンス化しようとすると、(ブレークポイントを設定できる)OMMemoryPoolIsEmpty()操作が呼び出され、トレーサ・メッセージが表示される。インスタンス化に失敗すると、トレーサ・メッセージが表示される。
静的アーキテクチャを介しての値による束縛
通常、ラプソディ(Rhapsody)は、1−to−MAX関係については、関係の種類(図で設定される)にかかわらず、値による束縛ではなく、参照による束縛を生成する。ただし、静的アーキテクチャ機能を用いれば、クラス・インスタンスおよびイベント・インスタンスの最大数を静的アーキテクチャ・プロパティで定義し、したがって、デフォルトの非決定的なnew()演算子を使用しないことによって、値による束縛の効果を実現することができる。
静的メモリ・アロケーション条件
アプリケーションが静的メモリ・アロケーションを用いる場合は、チェッカが、以下の条件が満たされるかどうかを検証する。
・クラス・インスタンスの最大数がゼロでない。
・ステートチャート実装がフラットである。
・ローカル・ヒープを用いる各イベントおよびクラスについて、new演算子とdelete演算子が明示的に指定されている。
レポートは、インスタンスの数について設定されている制限を含む。
すべてのプロパティが、要素定義の一部として、ロードされ、リポジトリに保存される。
制限
以下の制限が静的メモリ・アロケーションに適用される。
・配列のアロケーションはまだサポートされていない。インスタンスは1つずつアロケートされなければならない。これは、配列のアロケーションに関連するメモリ・オーバーヘッド(が不明)のためである。
・tm()タイムアウト関数はまだサポートされていない。
標準操作を用いる
標準操作は、特定のフレームワークまたはプログラミング・スタイルによって標準化されたクラス操作である。顕著な例は、分散フレームワークの一部であるシリアル化メソッド(「例」の項を参照)と、コピー・コンストラクタまたは変換コンストラクタである。このような操作は、一般に、(属性、操作、スーパクラスなどの)クラス機能に集約関数を適用する。以下のセクションでは、クラスおよびイベントについて生成されたコードに標準操作を追加する方法を説明する。
標準操作の用途
以下のことを行うために標準操作を用いることができる。
・イベントをシリアル化するメソッドを作成する。
・クラスの標準形式をサポートする。
・クラスを永続的にする。
・特定のフレームワークをサポートする。
イベントのシリアル化
イベントは、通常、次の2つのステップで生成され、これらのステップは、ラプソディ(Rhapsody)フレームワークのGENマクロ内でカプセル化される。
1.Eventクラスがインスタンス化され、イベントへのポインタが生成される。
2.その新しいイベント・ポインタを受け側のイベント・キューに追加することによって、そのイベントがキューイングされる。
イベントがインスタンス化され、受け側のイベント・キューに追加されると、そのイベントを「送る」準備が整う。送る操作が成功するためには、送り側と受け側のメモリ・アドレス空間が同じでなければならない。しかし、いつもそうであるとは限らない。
たとえば、以下のような場合には、送り側と受け側のアドレス空間が異なるのが普通である。
・同じホストにある、異なるプロセス間でイベントを送る場合。
・分散アプリケーション間でイベントを送る場合。
・送り側と受け側が、異なるメモリ・パーティションにマッピングされている場合。
この問題を解決する一般的な方法の1つは、情報をマーシャリングすることである。マーシャリングは、イベントを生(ロー)データに変換し(またはイベントをシリアル化し)、それを、publish/subscribeなどのフレームワークを用いて送り、受け側でそのロー・データを元の形式に変換する(戻す)ことを意味する。CORBAのような高レベルのソリューションでは、必要なコードが自動的に生成されるが、低レベルのソリューションでは、明示的な処置が必要である。標準操作を用いると、イベントやインスタンスのマーシャリングおよびアンマーシャリングをどのように行うかを、詳細なレベルまで指定できる。
クラスの標準形式
すべてのクラスに含めるべき操作のリストが、多くのスタイル・ガイドや作成規約によって指定されている。よくある例は、コピー・コンストラクタ、変換コンストラクタ、代入演算子などである。ラプソディ(Rhapsody)では、これらのような標準操作をすべてのクラスに対して定義できる。
永続性
クラスを永続的にすることは、通常、あらかじめ定義されたシグネチャを有する操作をすべてのクラスに追加することによって実現される。これは、標準操作を用いて行うことができる。
フレームワークのサポート
多くのオブジェクト指向フレームワークは、基本クラスからサブクラスを抽出し、仮想操作を無効にすることによって、用いられる。たとえば、MFCコンストラクトは、CObjectクラスから継承され、次のような操作を無効にする。
virtual void Dump(CDumpContext& dc) const;
これは、標準操作を用いて行うことができる別の例である。
フレームワーク基本クラスの追加は、<lang>_CG::Class::AdditionalBaseClassesプロパティを用いて行うことができる。
標準操作を作成する
標準操作はすべて、論理名に関連付けられている。標準操作の論理名を定義するには、StandardOperationsプロパティを無効にする。
定義されているすべての標準操作について、操作の宣言および定義を指定しなければならない。これを行うには、次の2つのプロパティをsite.prpファイルに追加して、必要な関数テンプレートを指定する。
・<論理名(LogicalName)>Declaration−操作宣言のテンプレートを指定する
・<論理名(LogicalName)>Definition−操作実装のテンプレートを指定する
たとえば、myOpという論理名に対し、(site.prpファイルまたはCOM API(VBA)を用いて)次のプロパティを追加できる。
Subject CG
Metaclass Class

Property myOpDeclaration MultiLine ""

Property myOpDefinition MultiLine ""
end
標準操作に関連付けられるすべてのプロパティを、それぞれのCGサブジェクトおよびメタクラスの下にあるsite.prpファイルに追加する。これらのプロパティはすべて、MultiLine型を含んでいなければならない。
キーワード
テンプレートは、以下のキーワードを含むことができる。
・$Attributes−クラス内のすべての属性について、このキーワードは、その属性のプロパティCG::Attribute::<論理名(LogicalName)>で特定されるテンプレートの内容に置き換えられる。たとえば、<lang>_CG::Attribute::myOp。
・$Relations−クラス内のすべての関係について、このキーワードは、その関係のプロパティCG::Relation::<論理名(LogicalName)>で特定されるテンプレートの内容に置き換えられる。たとえば、<lang>_CG::Relation::myOp。
・$Base (visibility(視認性))−すべてのスーパークラス/イベントについて、このキーワードは、そのスーパークラス/イベントのプロパティCG::Class/Event::<論理名(LogicalName)>Baseで特定されるテンプレートの内容に置き換えられる。たとえば、CG::Class::myOpBase。
・$Arguments−クラス内のすべてのイベントについて、このキーワードは、そのイベントのプロパティCG::Event::<論理名(LogicalName)>Argsで特定されるテンプレートの内容に置き換えられる。たとえば、<lang>_CG::Event::myOpArgs。
これらのプロパティを拡張すると、以下のキーワードを使用できる。
・$Name−キーワードのコンテキスト(文脈)に応じて、クラス(属性、関係、操作、または基本クラス)のモデル名を指定する。適用可能であれば、$Typeは、このモデル要素に関連付けられた型となる。
・$ImplName−(生成された)コピーの名前を指定する。通常、これは、このモデル要素に関連付けられたデータ・メンバである。
これは、生成されたコードにおいて論理名をより複雑な名前に置き換えることができるRiCで有用である。
さらに、規約$<プロパティ名>を用いて、コンテキスト内の任意のプロパティに関連付けられるカスタム・キーワードを作成できる。たとえば、プロパティCG::Class::Fooを追加した場合は、$Fooによって、CG::Class::myOpDefinition内のプロパティ内容に関連付けることができる。
パワー・ユーザが、この機能を、ステレオタイプ・ベースのコード生成と組み合わせて使用すれば、標準操作のセットを定義し、それをステレオタイプに関連付け、チームの他のメンバが(プロパティのことを気にかけずに)そのステレオタイプを適用して標準操作を取得できるようにすることができる。

特定パッケージ内のすべてのイベントについてイベントのシリアル化を実装する必要がある場合は、そのパッケージのCG::Event::StandardOperationsプロパティに「serialize, unserialize」を含める。strstreamの内部にイベント引数値を配置してシリアル化を行うと、対応するプロパティとその値は以下のようになる。
CG::Event::SerializeDeclaration
public:
strstream & serializer(strstream & theStrStream) const;
CG::Event::SerializeDefinition
strstream & $Name::serialize(strstream
& theStrStream) {
$Base
$Arguments
return theStrStream;
}
CG::Event::SerializeArgs
theStrStream << $Name;
CG::Event::SerializeBase
$Name::serialize(theStrStream);
2つの引数であるseverityおよびpriorityを有するイベントVoiceAlarmを定義し、VoiceAlarmをAlarmから継承した場合、結果として、そのテンプレートのコードは以下のようになる。
strstream &
VoiceAlarm::serialize(strstream &
theStrStream) {
Alarm::serialize
(theStrStream);
theStrStream <<
severity;
theStrStream <<
priority;
return theStrStream;
}
unserialize部分についても同じ処理が行われる。
Java初期設定ブロックをサポートする(RiJ)
Java初期設定ブロックは、クラスをインスタンス化する前に、クラスで使用するネイティブ・ライブラリをロードするなどの初期設定を実行するために使用される。標準操作を用いると、以下のように、この言語コンストラクトにとって便利なエントリ・ポイントを備えることができる。
1.site.prpファイルを開き、以下のプロパティを追加する。
Subject CG
Metaclass Class

Property StandardOperations String "InitializationBlock"
end
end
2.siteJava.prpファイルを開き、以下のプロパティを追加する。
Subject JAVA_CG
Metaclass Class

Property InitializationBlockDeclaration MultiLine ""
end
end
3.初期設定ブロックを必要とするすべてのクラスについて、そのクラスのInitializationBlockDeclarationプロパティにテキストを入力する。たとえば、次のようになる。
static {

System.loadLibrary("MyNativeLib");
}
このテキストは、クラス宣言の下に入力される。
本発明の1つまたは複数の実施形態によれば、動的モデル/コード結合は、たとえば、ラプソディ(Rhapsody)のUML(商標)(統一モデリング言語)モデルとそれらの実装コードとを自動的に同期するメカニズムを提供する。これにより、最新の実装コードを即座に表示でき、また、コードを手動で変更した場合にモデルがただちに更新されるようにできる。
このアプローチでは、モデルは、ツールが、一連の作業成果物(実装ソース・コード、各種ドキュメント、テスト・スクリプト、UIフロント・エンドなど)を生成し、タイミング解析やテスト・ドライブなど、様々な目的のために外部ツールと対話するもとになる、システムの完結した(または、ほぼ完結した)仕様を構成する。さらに、モデル・ベース・ツールは、ステートチャート図やアクティビティ図などの振る舞い図を含む、できるだけ多くをUML(商標)仕様から実装することをねらいとした綿密な実装スキームによって特徴付けられる。これにより、UML(商標)仕様とその実装の間の不整合性が最小化(または除去)されるとともに、生産性および製品品質が大幅に向上する。
エンド・ユーザがプログラミング言語とそれをサポートする技術プラットフォームの優位性を最大限に享受できるようにするには、モデルとコードの高い(または十分な)レベルの相乗効果が必要である。これを実現するために、実装言語がモデリング言語を補強する。つまり、モデルは、コード・フラグメントをモデルの仕様の一部として含む。さらに、ユーザは、生成されたコードを高いレベルで制御して、その製造品質要件を満たすようにしなければならない。この相乗効果的アプローチの別の主要成功因子は、生成されたコードに対してユーザが直接実行した変更を、その変更がモデルの不可欠な部分になるように
ラウンドトリップできることである。このため、手動で実行したコード変更が、コードの再生成によって失われることがない。DMCAにより、ユーザは、標準的なコード生成機能およびラウンドトリップ機能を利用してシステムの実装を即座に表示し、直接制御することができるので、動的モデル/コード結合は、前述のアプローチの優位性を押し進める重要な要素の1つである。
本発明の少なくとも1つの実施形態における本願発明者らの動的モデル/コード結合のアプローチは、モデルまたはコードにおける変更を検出して、必要な更新を自動的に(または、ほぼ自動的に)行うという、これまでと異なる切り口をとることによって、現行技術の制限を克服するものである。これにより、モデルとその実装を切り離したままで両者間の高レベルの相乗効果を確保して、本願発明者らのモデル・ベース・アプローチを維持および拡張することができる。代替実施態様では、このモデルは、更新を要する変更のタイプに関係なく、所定のアクティビティおよび/または時間間隔に基づいて自動的に更新される。
本発明の少なくとも1つの実施形態による動的モデル/コード結合では、関連するモデル要素を変更すると、表示されているコードが更新され、逆に、コードを変更すると、モデルが更新される。
DMCAManagerは、モデル要素の変更の結果として生成されたファイルを更新でき、コードの変更をモデルにラウンドトリップできる。
さらに、本発明の代替実施形態によれば、以下のうちの1つまたは複数が達成される。
a.DMCAManagerが、任意選択で、ファイルの生成が必要らしいという通知を、コード・ビューまたはアクティブ・コード・ビュー以外のモジュールから取得できる。
b.任意選択で、DMCAManagerが任意のタイプのメカニズムを用いてモデル要素の再生成が必要かどうかを決定できるようにしたり、常にファイルを再生成するようにしたりできる。
c.DMCAManagerが、任意選択で、ファイル内の実装されているすべて(または、ほぼすべて)の要素の保存場所へのポインタまたは参照をアクティブ・コンポーネントに照会できる。
d.アクティブ・コンポーネントが、任意選択で、実装ファイルとモデル要素の間のマッピングの保存場所へのインデックスまたは参照を保存する。
e.ビューがフォーカスを失い、ビューの内容が修正された場合でも、DMCAManagerが任意選択でそのファイルを保存できる。
f.ファイルの内容が変更されたかどうかを判断する代わりに、ファイルおよび関連要素が更新されている場合には、それらについて任意選択でリポジトリ更新を自動的に実行する。
g.コードがコード生成規則に適合するように、DMCAManagerが、任意選択で、(修正された要素を更新する前に)すべて(または、ほぼすべて)の要素のコード生成を実行する。
また、本発明の少なくとも1つの実施形態は、UML(商標)(統一モデリング言語)を利用して、UML(商標)モデルとコードの高い(または十分な)レベルの相乗効果をもたらすことができる。
本発明の一実施形態は、有利なことに、ユーザが、生成されたコードを高いレベルで制御して、たとえば、製造品質要件を満たすことを可能にする。たとえば、本発明の少なくとも1つの実施形態はさらに、生成されたコードに対して直接行われた変更をモデルにラウンドトリップして、コードに対するそれらの変更がモデルの不可欠な部分になるようにできる。これにより、有利なことに、たとえば、コードの再生成に応答してモデルが必ず更新される。したがって、本発明の1つまたは複数の実施形態により、ユーザは、標準的なコード生成機能およびラウンドトリップ機能を利用して、システムの実装を素早く表示したり、直接制御および/または編集したりできる。
したがって、本発明の1つまたは複数の実施形態を利用して、ソフトウェア・モデルおよび/またはソフトウェア・コードの変更を検出し、そのモデルおよび/またはコードを自動的に(または、ほぼ自動的に)更新することができる。代替実施態様では、このソフトウェア・モデルを、たとえば、更新を要する変更のタイプに任意選択で依存せず、所定のアクティビティおよび/または時間間隔に基づいて自動的に更新することが可能である。
本発明はさらに、有利なことに、複雑なコード生成スキームおよびラウンドトリップ・スキームのモデル/コード結合を可能にする。したがって、本発明は、ユーザが、実装コードに対する十分なレベルの可視性ならびに制御性と併せ、(たとえば、UML(商標)を利用して)モデル・ベース開発の強みを有利に利用することを可能にすることができる。
関連技術による開発ツールの概要を示す図である。 モデル・ビューとアクティブ・コード・ビューを示す例示的な画面表示である。 コードの変更に基づいてモデルが更新される様子を示す例示的な画面表示である。 本発明の一実施形態のアーキテクチャの例示的なハイレベルの概要を示す図である。 コード・ファイルが、関連付けられたモデルへの変更に基づいて更新される様子を示す例示的なフロー図である。 モデルが、関連付けられたコード・ファイルへの変更に基づいて更新される様子を示す例示的なフロー図である。 本発明に係る動的モデル/コード結合を実装するために使用できるコンピュータのブロック図である。 図7のコンピュータの内部ハードウェアのブロック図である。
符号の説明
100 トランジェント・メタモデル
102 ソース・コード
108 インクリメンタル・コード・エディタ
401 モデル・コード・マネージャ
402 コード・ジェネレータ
403 リポジトリ更新/ラウンドトリップ
404 要素位置ファインダ
405 モデル要素
406 コンポーネント
407 リポジトリ
408 IMCA
409 生成されたファイル
410 アクティブ・コード・ビュー
411 コード・ビュー
412 テキスト・ファイル
413 ソース・ファイル
414 メイク・ファイル
415 スクリプト
700 コンピュータ
702 CPU
704 フロッピー・ドライブ
706 CD−ROM
708 ディスプレイ
710 キーボード
712 マウス
812 ROM
814 RAM
816 ディスク・コントローラ
818 ハード・ドライブ
820 ディスプレイ・インターフェース
822 通信ポート
824 インターフェース

Claims (29)

  1. コンピュータに実装され、ソース・コードを、該ソース・コードを表している、複数のモデル要素に関連付ける方法において、
    ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成するステップと、
    前記モデルの前記複数の要素に対応する前記ソフトウェア・ソース・コードを生成するステップと、
    前記ソフトウェア・ソース・コードの部分を、前記モデルの前記複数の要素の少なくとも1つに関連付けるステップと、
    前記複数の要素の少なくとも1つが修正されていることを確認するステップと、
    前記ソフトウェア・ソース・コードの一部分および前記ソフトウェア・ソース・コード全体のうちの少なくとも一方を修正して、前記修正されている複数の要素の前記少なくとも1つまたは複数に対応させるステップと
    を具備することを特徴とする方法。
  2. 前記修正されているソース・コードの、少なくとも一部分を表示するステップをさらに具備することを特徴とする請求項1記載の方法。
  3. 前記モデル要素の少なくとも一部分がブラウザの第1の表示領域に表示され、前記修正されたソース・コードの少なくとも一部分が前記ブラウザの第2の表示領域に表示されることを特徴とする請求項1記載の方法。
  4. 前記ソース・コードの特定の行番号が前記モデル要素に関連付けられることを特徴とする請求項3記載の方法。
  5. 前記第1および第2の表示領域がフレームを具備することを特徴とする請求項3記載の方法。
  6. 前記ソース・コードの特定の行番号が前記モデル要素に関連付けられることを特徴とする請求項1記載の方法。
  7. 前記モデル要素が統一モデリング言語(UML)モデル要素であることを特徴とする請求項1記載の方法。
  8. 前記UML要素が、クラス図、オブジェクト図、ユースケース図、状態図、シーケンス図、アクティビティ図、コラボレーション図、コンポーネント図、および配置図のうちの少なくとも1つを含むことを特徴とする請求項7記載の方法。
  9. コンピュータに実装され、ソース・コードを、該ソース・コードを表している、複数のモデル要素に関連付ける方法において、
    ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成するステップと、
    前記モデルの前記複数の要素に対応する前記ソフトウェア・ソース・コードを生成するステップと、
    前記ソフトウェア・ソース・コードの部分を、前記モデルの前記複数の要素の少なくとも1つに関連付けるステップと、
    前記ソフトウェア・ソース・コードの少なくとも一部分が修正されていることを確認するステップと、
    前記複数のモデル要素の前記少なくとも1つを修正して、前記修正されているソフトウェア・ソース・コードに対応させるステップと、
    前記ソフトウェア・ソース・コードが前記修正されたモデルと合致するように、所定の規則に従って前記ソフトウェア・ソース・コードの一部分および前記ソフトウェア・ソース・コード全体のうちの少なくとも一方を再生成するステップと
    を具備することを特徴とする方法。
  10. 前記修正されているソフトウェア・ソース・コードの、少なくとも一部分を表示するステップをさらに具備することを特徴とする請求項9記載の方法。
  11. 修正されている前記モデルの前記複数の要素の少なくとも1つを表示するステップをさらに具備することを特徴とする請求項10記載の方法。
  12. 前記複数のモデル要素の少なくとも1つがブラウザの第1の表示領域に表示され、前記修正されたソフトウェア・ソース・コードの少なくとも一部分が前記ブラウザの第2の表示領域に表示されることを特徴とする請求項11記載の方法。
  13. 前記ソフトウェア・ソース・コードの特定の行番号が前記複数のモデル要素の少なくとも1つに関連付けられることを特徴とする請求項12記載の方法。
  14. 前記第1および第2の表示領域がフレームを含むことを特徴とする請求項12記載の方法。
  15. 前記ソース・コードの特定の行番号が前記モデル要素に関連付けられることを特徴とする請求項11記載の方法。
  16. 前記モデル要素が統一モデリング言語(UML)モデル要素であることを特徴とする請求項11記載の方法。
  17. 前記UML要素が、クラス図、オブジェクト図、ユースケース図、状態図、シーケンス図、アクティビティ図、コラボレーション図、コンポーネント図、および配置図のうちの少なくとも1つを含むことを特徴とする請求項16記載の方法。
  18. コンピュータ可読媒体上に存在するコンピュータ・プログラム製品において、
    ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成することと、
    前記モデルの前記複数の要素に対応するソフトウェア・ソース・コードを生成することと、
    前記ソフトウェア・ソース・コードの部分を、前記モデルの前記複数の要素の少なくとも1つに関連付けることと、
    前記モデルの前記複数の要素の少なくとも1つが修正されていることを確認することと、
    前記ソース・コードの一部分とソース・コード全体の少なくとも一方を修正して、前記1つまたは複数の修正されたモデル要素に対応させることと
    をコンピュータに実行させる命令を具備することを特徴とするコンピュータ・プログラム製品。
  19. 前記修正されているソース・コードの、少なくとも一部分を前記コンピュータに表示させる命令をさらに具備することを特徴とする請求項18記載のコンピュータ・プログラム製品。
  20. コンピュータ可読媒体上に存在するコンピュータ・プログラム製品において、
    ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成することと、
    前記モデルの前記複数の要素に対応するソフトウェア・ソース・コードを生成することと、
    前記ソフトウェア・ソース・コードの部分を、前記モデルの前記複数の要素の少なくとも1つに関連付けることと、
    前記ソフトウェア・ソース・コードの少なくとも一部分が修正されていることを確認することと、
    前記複数のモデル要素の前記少なくとも1つを修正して、前記修正されているソフトウェア・ソース・コードに対応させることと、
    前記ソフトウェア・ソース・コードが前記修正されたモデルと合致するように、所定の規則に従って前記ソフトウェア・ソース・コードの一部分および前記ソフトウェア・ソース・コード全体のうちの少なくとも一方を再生成することと
    をコンピュータに実行させる命令を具備することを特徴とするコンピュータ・プログラム製品。
  21. 前記修正されているソース・コードの、少なくとも一部分をコンピュータに表示させる命令をさらに具備することを特徴とする請求項20記載のコンピュータ・プログラム製品。
  22. ソフトウェア・プロジェクトにおいて、ソース・コードのドキュメントを生成するためのデータ処理システムにおいて、
    ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成する手段と、
    前記モデルの前記複数の要素に対応するソフトウェア・ソース・コードを生成する手段と、
    前記ソフトウェア・ソース・コードの部分を、前記モデルの前記複数の要素の少なくとも1つに関連付ける手段と、
    前記モデルの前記複数の要素の少なくとも1つが修正されていることを確認する手段と、
    前記ソフトウェア・ソース・コードの一部分とソフトウェア・ソース・コード全体の少なくとも一方を修正して、1つまたは複数の前記修正されたモデル要素に対応させる手段と
    を具備することを特徴とするデータ処理システム。
  23. 前記修正されているソース・コードの、少なくとも一部分を表示する手段をさらに具備することを特徴とする請求項22記載のデータ処理システム。
  24. コンピュータに実装され、ソース・コードを、該ソース・コードを表している、モデルの複数の要素に関連付ける方法において、
    ソフトウェア・ソース・コードとして実装できる、モデルの複数の要素を生成するステップと、
    前記モデルの前記複数の要素に対応するソフトウェア・ソース・コードを生成するステップと、
    前記ソフトウェア・ソース・コードの部分を、前記モデルの前記複数の要素の少なくとも1つに関連付けるステップと、
    前記ソフトウェア・ソース・コードの少なくとも一部分が修正されていることを確認するステップと、
    前記複数のモデル要素の前記少なくとも1つを修正して、前記修正されているソフトウェア・ソース・コードに対応させるステップと、
    前記ソフトウェア・ソース・コードが前記修正されたモデルと合致するように、所定の規則に従って前記ソフトウェア・ソース・コードの一部分とソフトウェア・ソース・コード全体の少なくとも一方を再生成するステップと
    を具備することを特徴とする方法。
  25. 前記修正されているソース・コードの、少なくとも一部分を表示するステップをさらに具備することを特徴とする請求項24記載の方法。
  26. ソース・コードを、該ソース・コードを表している、モデルの複数の要素に関連付けるためのシステムにおいて、
    モデル・リポジトリに保存されている要素と、要素に関連付けられているソース・コードとのうちの少なくとも一方に対する変更を検出または決定するためのモデル・コード・マネージャと、
    前記モデル・リポジトリに保存されている修正された要素及び関連付けられたすべての要素のうちの少なくとも一方に対応するコードを生成するコード・ジェネレータと、
    既存の関連付けられた要素を更新することと、修正されたソース・コードに対応する新しい要素を少なくとも1つ生成することとの、少なくとも一方を行うモデル更新ジェネレータと
    を具備することを特徴とするシステム。
  27. 特定の要素に対応する、少なくとも一部のソース・コードを検出する要素ファインダをさらに備えることを特徴とする請求項26記載のシステム。
  28. 選択された要素の対応するコード・フラグメントを表示するためのアクティブ・コード・ビュー・モジュールをさらに備えることを特徴とする請求項27記載のシステム。
  29. コード更新が最後に行われてから少なくとも1つの要素が修正されているかどうかを調べるインクリメンタル・モデル・コード結合モジュールをさらに備え、前記モデル・コード・マネージャが前記修正を反映するために1つまたは複数のファイルの作成もしくは更新を行わせることを特徴とする請求項26記載のシステム。
JP2004513930A 2002-06-12 2003-06-12 動的モデル/コード結合を提供するシステム、方法、および媒体 Pending JP2005530238A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US38758102P 2002-06-12 2002-06-12
PCT/US2003/018217 WO2003107180A1 (en) 2002-06-12 2003-06-12 Providing dynamic model-code associativity

Publications (1)

Publication Number Publication Date
JP2005530238A true JP2005530238A (ja) 2005-10-06

Family

ID=29736334

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004513930A Pending JP2005530238A (ja) 2002-06-12 2003-06-12 動的モデル/コード結合を提供するシステム、方法、および媒体

Country Status (7)

Country Link
US (2) US20040034846A1 (ja)
EP (1) EP1552385B1 (ja)
JP (1) JP2005530238A (ja)
AT (1) ATE411559T1 (ja)
AU (1) AU2003239209A1 (ja)
DE (1) DE60324171D1 (ja)
WO (1) WO2003107180A1 (ja)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2008269273A (ja) * 2007-04-20 2008-11-06 Meidensha Corp ソフトウェア開発支援システム、開発支援方法およびプログラム
JP2011510418A (ja) * 2008-02-15 2011-03-31 サムスン エレクトロニクス カンパニー リミテッド コンポーネント・モデル基盤の仮想ソフトウェア・プラットホームを生成する方法、これを利用してソフトウェア・プラットホーム・アーキテクチャを検証する方法及びその装置
US8370781B2 (en) 2006-11-21 2013-02-05 Fujitsu Limited Computer product for supporting design and verification of integrated circuit
KR101565666B1 (ko) * 2010-10-04 2015-11-03 미쓰비시덴키 가부시키가이샤 소프트웨어 생성 장치, 소프트웨어 생성 방법 및 프로그램 기억매체
JP2016206962A (ja) * 2015-04-23 2016-12-08 株式会社明電舎 ソフトウェア開発支援システム、ソフトウェア開発支援方法

Families Citing this family (64)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8095413B1 (en) 1999-05-07 2012-01-10 VirtualAgility, Inc. Processing management information
US8522196B1 (en) 2001-10-25 2013-08-27 The Mathworks, Inc. Traceability in a modeling environment
US8104017B2 (en) 2001-10-25 2012-01-24 The Mathworks, Inc. Traceability in a modeling environment
DE60324171D1 (de) * 2002-06-12 2008-11-27 Telelogic North America Inc Bereitstellung einer dynamischen modellcodeassoziativität
US8458164B2 (en) * 2003-07-15 2013-06-04 International Business Machines Corporation Query model tool and method for visually grouping and ungrouping predicates
US20050015368A1 (en) * 2003-07-15 2005-01-20 International Business Machines Corporation Query modelling tool having a dynamically adaptive interface
US20050015361A1 (en) 2003-07-15 2005-01-20 International Business Machines Corporation Model content provider with reusable components for supporting a plurality of GUI API's
US8219968B2 (en) * 2003-07-17 2012-07-10 Raytheon Company Designing computer programs
US20050114832A1 (en) * 2003-11-24 2005-05-26 Microsoft Corporation Automatically generating program code from a functional model of software
US7823122B1 (en) * 2003-12-16 2010-10-26 The Mathworks, Inc. Model and subsystem function signatures
JP2005196291A (ja) * 2003-12-26 2005-07-21 Fujitsu Ltd ユーザインタフェースアプリケーション開発プログラム、および開発装置
US7533365B1 (en) * 2004-02-03 2009-05-12 Borland Software Corporation Development system with methodology for run-time restoration of UML model from program code
US7849440B1 (en) * 2004-04-16 2010-12-07 The Mathworks, Inc. Real-time code preview for a model based development process
US7856621B2 (en) * 2004-05-19 2010-12-21 International Business Machines Corporation Method for synchronization of concurrently modified interdependent semi-derived artifacts
US20050262485A1 (en) * 2004-05-19 2005-11-24 International Business Machines Corporation Duplicate merge avoidance in parallel development of interdependent semi-derived artifacts
US7376933B2 (en) * 2004-10-22 2008-05-20 International Business Machines Corporation System and method for creating application content using an open model driven architecture
US20060101387A1 (en) * 2004-10-22 2006-05-11 Gerken Christopher H An Open Model Driven Architecture Application Implementation Service
US8024703B2 (en) * 2004-10-22 2011-09-20 International Business Machines Corporation Building an open model driven architecture pattern based on exemplars
US20060101385A1 (en) * 2004-10-22 2006-05-11 Gerken Christopher H Method and System for Enabling Roundtrip Code Protection in an Application Generator
US20060130007A1 (en) * 2004-12-01 2006-06-15 International Business Machines Corporation Computer method and apparatus for automating translation to a modeling language
US7689969B1 (en) 2005-01-18 2010-03-30 The Mathworks, Inc. Obfuscation of automatically generated code
WO2006087728A1 (en) * 2005-02-15 2006-08-24 Codito Technologies System for creating parallel applications
US7882116B2 (en) * 2005-05-18 2011-02-01 International Business Machines Corporation Method for localization of programming modeling resources
US8719716B2 (en) 2005-09-15 2014-05-06 The Mathworks, Inc. Locked element for use in a graphical modeling environment
US8316386B2 (en) * 2006-02-17 2012-11-20 Microsoft Corporation Multiple application integration
US20070234278A1 (en) * 2006-03-02 2007-10-04 Microsoft Corporation Managing source code in a model-based development environment
US20070220481A1 (en) * 2006-03-20 2007-09-20 Microsoft Corporation Limited source code regeneration based on model modification
US20080046858A1 (en) * 2006-08-15 2008-02-21 Zeligsoft Inc. Method and apparatus for merge condition detection
US8719766B1 (en) * 2006-10-16 2014-05-06 The Math Works, Inc. System and method for identifying and adding files to a project manifest
US8082301B2 (en) * 2006-11-10 2011-12-20 Virtual Agility, Inc. System for supporting collaborative activity
US8196100B2 (en) * 2007-04-06 2012-06-05 International Business Machines Corporation Content management system for computer software with dynamic traceability between code and design documents
JP4412674B2 (ja) * 2007-04-18 2010-02-10 インターナショナル・ビジネス・マシーンズ・コーポレーション モデル駆動型開発を支援する装置及び方法
WO2009011056A1 (ja) * 2007-07-19 2009-01-22 Fujitsu Limited アプリケーション改善支援プログラム、アプリケーション改善支援方法およびアプリケーション改善支援装置
US8307334B2 (en) * 2007-09-17 2012-11-06 International Business Machines Corporation Method for assisting a user in the process of creating software code
US8307333B2 (en) * 2007-09-17 2012-11-06 International Business Machines Corporation System and computer program product for assisting a user in the process of creating software code
US8996349B2 (en) * 2007-10-11 2015-03-31 Microsoft Technology Licensing, Llc Synchronizing an abstract model and source code
US20090144695A1 (en) * 2007-11-30 2009-06-04 Vallieswaran Vairavan Method for ensuring consistency during software development
US9274753B1 (en) * 2007-12-23 2016-03-01 Sprint Communications Company L.P. Application diagram tool
US8166449B2 (en) * 2008-01-17 2012-04-24 Microsoft Corporation Live bidirectional synchronizing of a visual and a textual representation
US20090204939A1 (en) * 2008-02-13 2009-08-13 Yuliya Kimovna Lavrova Methods for visual representation of macros language
US8635593B2 (en) * 2008-05-13 2014-01-21 Hewlett-Packard Development Company, L.P. Dynamic autocompletion tool
US20100023922A1 (en) * 2008-07-23 2010-01-28 International Business Machines Corporation Linking uml activity diagram nodes to uml class diagram nodes by using properties from applied stereotypes
US8943482B2 (en) * 2009-05-15 2015-01-27 International Business Machines Corporation Incrementally constructing executable code for component-based applications
GB0908913D0 (en) * 2009-05-26 2009-07-01 Univ Dundee Software development tool
US20140033167A1 (en) * 2009-08-28 2014-01-30 Adobe Systems Incorporated Method and system for generating a manifestation of a model in actionscript
US8584080B2 (en) * 2010-03-22 2013-11-12 International Business Machines Corporation Modeling and generating computer software product line variants
CA2706747A1 (en) * 2010-06-29 2010-09-08 Ibm Canada Limited - Ibm Canada Limitee Scoped code fly-out editor for domain languages
US9069559B2 (en) * 2010-06-30 2015-06-30 International Business Machines Corporation Modularizing steps within a UML user model interaction pattern
US8978018B2 (en) * 2010-12-02 2015-03-10 International Business Machines Corporation Reversibly instrumenting a computer software application
US8364725B2 (en) * 2011-03-24 2013-01-29 International Business Machines Corporation Bidirectional navigation between mapped model objects
US8689184B2 (en) 2011-03-30 2014-04-01 The Procter & Gamble Company Apparatus, system, and method for managing industrial software configurations
US9460224B2 (en) * 2011-06-16 2016-10-04 Microsoft Technology Licensing Llc. Selection mapping between fetched files and source files
US9753699B2 (en) 2011-06-16 2017-09-05 Microsoft Technology Licensing, Llc Live browser tooling in an integrated development environment
US9563714B2 (en) 2011-06-16 2017-02-07 Microsoft Technology Licensing Llc. Mapping selections between a browser and the original file fetched from a web server
US9383973B2 (en) * 2011-06-29 2016-07-05 Microsoft Technology Licensing, Llc Code suggestions
US9110751B2 (en) 2012-02-13 2015-08-18 Microsoft Technology Licensing, Llc Generating and caching software code
US9176937B2 (en) * 2012-04-05 2015-11-03 International Business Machines Corporation Ensuring user interface specification accurately describes user interface after updates to user interface
US9158504B2 (en) * 2012-10-12 2015-10-13 Baker Hughes Incorporated Method and system to automatically generate use case sequence diagrams and class diagrams
GB2528453A (en) * 2014-07-21 2016-01-27 Aptitude Software Ltd Multi-format editors
US10191726B2 (en) * 2015-04-17 2019-01-29 Battelle Memorial Institute Biosequence-based approach to analyzing binaries
JP7105683B2 (ja) * 2018-12-07 2022-07-25 株式会社東芝 電子計算機、方法及びプログラム
US11625228B2 (en) * 2020-09-30 2023-04-11 Palo Alto Research Center Incorporated System and method for facilitating efficient round-trip engineering using intermediate representations
EP4089525A1 (en) * 2021-05-12 2022-11-16 Siemens Aktiengesellschaft System and method for generating program code for an industrial controller
CN115202732B (zh) * 2022-06-27 2023-08-08 苏州唐人数码科技有限公司 一种智能软件开发辅助系统及使用方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01116729A (ja) * 1987-10-30 1989-05-09 Fujitsu Ltd 仕様記述のためのエディタ
JPH09152965A (ja) * 1995-11-29 1997-06-10 Hitachi Ltd クラスライブラリ再構築方法
JP2000242479A (ja) * 1999-02-23 2000-09-08 Matsushita Electric Works Ltd ソフトウェアプログラム作成支援方法

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6212672B1 (en) * 1997-03-07 2001-04-03 Dynamics Research Corporation Software development system with an executable working model in an interpretable intermediate modeling language
US7152228B2 (en) * 1999-07-08 2006-12-19 Science Applications International Corporation Automatically generated objects within extensible object frameworks and links to enterprise resources
EP1224541A1 (en) * 1999-10-05 2002-07-24 Togethersoft Corporation Method and system for developing software
US7188332B2 (en) * 1999-10-05 2007-03-06 Borland Software Corporation Methods and systems for relating a data definition file and a data model for distributed computing
US7404175B2 (en) * 2000-10-10 2008-07-22 Bea Systems, Inc. Smart generator
WO2001082072A1 (en) * 2000-04-21 2001-11-01 Togethersoft Corporation Methods and systems for generating source code for object-oriented elements
WO2001087226A2 (en) * 2000-05-18 2001-11-22 Wilson-Cook Medical Inc. Percutaneous gastrostomy device and method
DE60324171D1 (de) * 2002-06-12 2008-11-27 Telelogic North America Inc Bereitstellung einer dynamischen modellcodeassoziativität

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01116729A (ja) * 1987-10-30 1989-05-09 Fujitsu Ltd 仕様記述のためのエディタ
JPH09152965A (ja) * 1995-11-29 1997-06-10 Hitachi Ltd クラスライブラリ再構築方法
JP2000242479A (ja) * 1999-02-23 2000-09-08 Matsushita Electric Works Ltd ソフトウェアプログラム作成支援方法

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8370781B2 (en) 2006-11-21 2013-02-05 Fujitsu Limited Computer product for supporting design and verification of integrated circuit
US9177088B2 (en) 2006-11-21 2015-11-03 Fujitsu Limited Computer product for supporting design and verification of integrated circuit
US9378316B2 (en) 2006-11-21 2016-06-28 Fujitsu Limited Computer product for supporting design and verification of integrated circuit
JP2008269273A (ja) * 2007-04-20 2008-11-06 Meidensha Corp ソフトウェア開発支援システム、開発支援方法およびプログラム
JP2011510418A (ja) * 2008-02-15 2011-03-31 サムスン エレクトロニクス カンパニー リミテッド コンポーネント・モデル基盤の仮想ソフトウェア・プラットホームを生成する方法、これを利用してソフトウェア・プラットホーム・アーキテクチャを検証する方法及びその装置
US8601433B2 (en) 2008-02-15 2013-12-03 Samsung Electronics Co., Ltd. Method and apparatus for generating virtual software platform based on component model and validating software platform architecture using the platform
KR101565666B1 (ko) * 2010-10-04 2015-11-03 미쓰비시덴키 가부시키가이샤 소프트웨어 생성 장치, 소프트웨어 생성 방법 및 프로그램 기억매체
JP2016206962A (ja) * 2015-04-23 2016-12-08 株式会社明電舎 ソフトウェア開発支援システム、ソフトウェア開発支援方法

Also Published As

Publication number Publication date
US20070209031A1 (en) 2007-09-06
DE60324171D1 (de) 2008-11-27
EP1552385A1 (en) 2005-07-13
ATE411559T1 (de) 2008-10-15
US20040034846A1 (en) 2004-02-19
EP1552385A4 (en) 2006-01-25
WO2003107180B1 (en) 2004-02-26
EP1552385B1 (en) 2008-10-15
AU2003239209A1 (en) 2003-12-31
WO2003107180A1 (en) 2003-12-24

Similar Documents

Publication Publication Date Title
JP2005530238A (ja) 動的モデル/コード結合を提供するシステム、方法、および媒体
US7051316B2 (en) Distributed computing component system with diagrammatic graphical representation of code with separate delineated display area by type
Bracha et al. Modules as objects in Newspeak
US9916134B2 (en) Methods and systems for accessing distributed computing components through the internet
US5956479A (en) Demand based generation of symbolic information
CA2211478C (en) Systems, methods and apparatus for generating and controlling display of medical images
Reiss The Field programming environment: A friendly integrated environment for learning and development
Kirby Reflection and hyper-programming in persistent programming systems
US5950002A (en) Learn mode script generation in a medical imaging system
KR20060087994A (ko) 작업 흐름 모델을 주시하는 컴퓨터화된 시스템
US20090320007A1 (en) Local metadata for external components
Crocker Safe object-oriented software: the verified design-by-contract paradigm
WO2000067122A2 (en) A coherent object system architecture
Larsen et al. Overture vdm-10 tool support: User guide
Ducasse et al. Meta-environment and executable meta-language using Smalltalk: an experience report
Alomari et al. Comparative studies of six programming languages
Sampaio et al. A trusted infrastructure for symbolic analysis of event-driven web applications
Canciani et al. A context-oriented extension of F
Layer et al. Lisp Systems in the 1990s
Bockisch An efficient and flexible implementation of aspect-oriented languages
US8135943B1 (en) Method, apparatus, and computer-readable medium for generating a dispatching function
Zirintsis et al. Hyper-programming in Java
Lee Pro Objective-C
Lewis Producing network applications using object-oriented petri nets
Linka Visual Studio refactoring and code style management toolset

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20060514

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20070919

A711 Notification of change in applicant

Free format text: JAPANESE INTERMEDIATE CODE: A712

Effective date: 20070919

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20070919

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20080617

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A821

Effective date: 20080619

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20090929

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20100330