ビルダー
ビルダーを使用すると、ユーザーはより便利な方法でオブジェクトとオブジェクト階層を構成できます。階層内の各オブジェクトを手動でインスタンス化してそのプロパティを 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 が最も有名なユーザー - の一部として、便利なビルダーを直接あなたの玄関に導きます。
ビルビルダー
独自のビルダーを構築するには、まず New -> jmbaseLanguage.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>>
}
}
、Address クラスともハウスクラスのルートビルダーのためだけでなく、ルームクラスのビルダーを定義しました。ルートビルダーは、プレーンビルダー とは異なり、新しいキーワードの後にユーザーコードで直接使用できます。Room クラスには 2 つのビルダーがあることにも注意してください。最初の定義では、プロパティを room ブロック内にネストできますが、2 番目の定義では、2 つのプロパティを room メソッド呼び出しのパラメーターとして直接取得できます。両方のアプローチは確かに単一のビルダーに組み合わせることができます。
この場合の House、Room、Address クラスは、メソッドとプロパティを持つ通常のクラスです。ビルダーで操作されるプロパティのメソッドと setter は、ビルダーに表示される必要があります。一般的なケースでは、「パッケージ」の可視性で十分です。例として、以下の例の House クラス定義を参照してください。
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>>
}
2024 年 2 月 11 日