MPS 2019.1ヘルプ

ビルダー

ビルダーを使用すると、ユーザーはより便利な方法でオブジェクトとオブジェクト階層を構成できます。階層内の各オブジェクトを手動でインスタンス化してそのプロパティーを1つずつ設定する代わりに、専用のビルダーを使用して、より簡潔で直感的な方法で同じデータ構造を作成できます。

例として、家を建てているとしましょう。

House h = new House(); h.houseType = HouseType.detached; Address address = new Address(); address.street = "Na Lysinach"; address.number = "10"; address.city = "Prague"; address.zipCode = "23459"; h.locate(address); list<Room> rooms = new arraylist<Room>(0); rooms.add(new Room("livingroom", 25)); rooms.add(new Room("kitchen", 18)); rooms.add(new Room("bedroom", 20)); rooms.add(new Room("hall", 12)); rooms.add(new Room("bedroom", 15)); h.rooms = rooms; h.moveIn(6); println(h);

家には住所が必要です。住所自体はいくつかの項目で構成されており、その中にたくさんの部屋があり、それぞれに2つのプロパティーが必要です。

面倒な方法の代わりに、ビルダーはあなたに取るべき構文上の近道を与えます:

 House house = new house { inhabitants : 6; type : HouseType.detached; address { street : "Na Lysinach"; number : "10"; city : "Prague"; zipCode : "23459"; } room { name : "livingroom"; size : 25; } room { name : "kitchen"; size : 18; } room { name : "bedroom"; size : 20; } room { name : "hall"; size : 12; } room("bedroom", 15) };

コードの構造自体は作成されたオブジェクト間の依存関係を反映しているため、コードを見ると、作成されたオブジェクトグラフの構造を素早く把握できます。ビルダーは互いに入れ子になっており、プロパティーを保持できます。プロパティー値とビルダーの相互ネストの両方が、その背後に構築されたオブジェクト階層に変換されます。

MPSは、いくつかの言語 - JavaBeans、XML、XMLSchema、またはXMLQueryが最も有名なユーザー - の一部として、便利なビルダーを直接あなたの玄関に導きます。

Building Builders

独自のビルダーを構築するには、最初にNew -> j.m.baseLanguage.builders.SimpleBuildersを呼び出す必要があります。今度は、階層に参加する各オブジェクトタイプのビルダーを定義します。これらのビルダーは独自のプロパティーと子を保持しており、それらの子から要求されたデータ構造を構築します。私たちの以前の "家を建てる"例に固執するには、以下のサンプルをチェックしてください。

builders houseBuilders extends <no extendsBuilder> { root builder house() extends <no extends> { type: House create: new House() child address { attach parent.locate(child); } child room { attach parent.rooms.add(child); } property inhabitants : int { set parent.moveIn(value); } property type : HouseType { set parent.houseType = value; } } builder address() extends <no extends> { type: Address create: new Address() <<children>> property street : string { set parent.street = value; } property number : string { set parent.number = value; } property city : string { set parent.city = value; } property zipCode : string { set parent.zipCode = value; } } builder room() extends <no extends> { type: Room create: new Room() <<children>> property name : string { set parent.name = value; } property size : int { set parent.size = value; } }   builder room(string name, int size) extends <no extends> { type: Room create: new Room(name, size) <<children>> <<properties>> } }

ルームクラスとアドレスクラス、クラス用のルートビルダーのためのビルダーを定義しました。ルートビルダーは、普通のビルダーとは異なり、newキーワードの後のユーザーコードで直接使用できます。ルームクラスには2つのビルダーがあることにも注意してください。最初の定義では、プロパティーをroomブロック内にネストすることができます。2番目の定義では、2つのプロパティーをroomメソッド呼び出しのパラメータとして直接指定できます。両方のアプローチは確かに単一のビルダーに組み合わせることができます。

私達の場合のルームおよびアドレスクラスは、メソッドとプロパティーを持つ通常のクラスです。Builderで操作されるプロパティーのメソッドとsetterは、Builderに表示されなければなりません。「パッケージ」の可視性は典型的な場合に行われます。あなたに例を与えるために、我々の例からのクラス定義の下を参照してください。

  public class House extends <none> implements <none> { <<static fields>> <<static initializer>> private Address address; private int numberOFPeople; public HouseType houseType {get; <no visibility> set;} public list<Room> rooms {get; <no visibility> set;} <<initializer>> public House() { <no statements> } public void moveIn(int people) { this.numberOFPeople = people; } public void locate(Address address) { this.address = address; } public int numberOfInhabitants() { return this.numberOFPeople; } public String toString() { return "House for " + numberOFPeople + " people at " + address.?toString(); } <<static methods>> <<nested classifiers>> }
最終更新日: 2019年7月5日