今回はBuilderパターンを現代から見つめなおします。Builderパターンは複雑なオブジェクトの生成を、生成プロセスから独立させます。複雑なオブジェクトを作りがちの現代に於いて、非常に重要なオブジェクトだと言えるでしょう。しかし、現代では考えなければならない課題もまた増えています。
Builderパターンで生成するオブジェクトが複雑な場合や、生成過程の計算量が大きい場合、並行処理で実装する事を検討する必要があるでしょう。Builderパターンを並行処理で扱う事により、パフォーマンスが向上する可能性があります。しかしながら、パフォーマンスは労無くして手に入りません。並行処理を行うようにBuilderパターンを実装するには、検討しなくてはならない事があります。
課題となるのは、
オブジェクトの整合性をどのようにして保つのかという点です。闇雲に並行処理をするとオブジェクトが壊れてしまいます。慎重に設計と実装をしなくてはなりません。
先ず考えなくてはならないのは、Directorオブジェクトと生成するオブジェクトの性質です。Directorオブジェクトが担当する処理を並行的に行うと、Builderオブジェクトへの指示がランダムに発生するようになります。何故ならば、並行処理では命令を実行する順序が予測できなくなるからです。ですから、生成するオブジェクトがデータの順序に依存するか否かをよく考えなくてはなりません。
生成するオブジェクトがデータの順序に依存する場合、Directorオブジェクトで並行処理をするのは止めた方が賢明です。並行処理を順番通りに処理させようとすると、多大なオーバーヘッドが生じます。出来ない事ではありませんが、労力とオーバーヘッドに見合うパフォーマンスが得られる可能性は低いでしょう。この場合、Builderオブジェクトの処理を並行化する方法を考えた方が賢明です。
一方、
生成するオブジェクトがデータの順序に依存しない場合、Directorオブジェクトでの並行処理を検討する価値があります。この場合、データの発生源の多重度が重要です。データ発生源が「一つのファイル」などの単数である場合、Directorオブジェクトを複数作成して並行処理をするのは得策だと言えません。共有資源であるファイルをロックする事によりトラブルが発生する可能性があるので、極力単一リソースから同時に読みとるのは避けるべきです。あらかじめデータファイルを分割するなどの工夫が必要です。その逆にデータの発生源が複数ある場合、Directorオブジェクトの並行処理化は比較的簡単です。
次に考えるべき事は
Builderオブジェクトの並行処理化です。
Builderオブジェクトの場合、並行処理を検討する箇所は、個別要素の構築とオブジェクトの生成の2点あります。個別要素の生成が計算量を要する場合、その処理を並行化するとパフォーマンスがアップします。一方、個別要素を纏めてオブジェクトを生成する処理を並行化する場合、処理の切り分けをよく考えて行う必要があります。
以上、Builderパターンを個別に考えた場合の並行処理化の検討項目を書きました。しかし、並行処理をする場合、より広い視点で物語を見なくてはなりません。一つのオブジェクトの生成に拘るのではなく、
オブジェクトの生成そのものの並行化を検討する必要もあります。つまり、1つのオブジェクト生成に拘るのではなく、オブジェクトの生成処理そのものを複数同時に行う事も可能です。システムの性質に応じた方法を採りましょう。
纏めます。Builderパターンと並行処理の組み合わせは難しく、考えるべき事が沢山あります。しかしながら、その効果は多大です。
Builderパターンと並行処理を組み合わせると、オブジェクトの生成過程が隠蔽されているので、利用者は意識することなく並行処理のメリットを得られます。挑戦する価値は十分にあります。
テーマ : プログラミング
ジャンル : コンピュータ