私は「任意の属性の定義」が好きで、RubyのOpenStructはハッシュを使用するよりもクリーンに感じることがあると思いますが、他に特定の利点やユースケースがあるかどうかについて興味があります。単にハッシュを使用するよりも、OpenStructの方が適しています。
これは主にパフォーマンスの決定に帰着すると思います。 Rubyドキュメント から:
OpenStructは、Rubyのメソッドルックアップ構造を利用して、プロパティに必要なメソッドを検索および定義します。これは、method_missingメソッドとdefine_methodメソッドによって実現されます。
ハッシュまたは構造体を使用する場合と比較して、これらのプロパティの設定にははるかに多くのオーバーヘッドがあるため、作成されるオブジェクトのパフォーマンスに懸念がある場合は、これを考慮する必要があります。
さらに、Hash
のようなものには、それが提供するすべてのメソッド(has_key?
、include?
など)。 OpenStruct
は、その観点からは非常に単純なオブジェクトですが、パフォーマンスの観点からは何の懸念もなく、簡単なオブジェクトで作業したい場合は、OpenStruct
が適しています。
OpenStruct
オブジェクトは、特定のメソッド呼び出しインターフェイスに適合するものが必要な場合(つまり、#name
および#value
に応答するダックタイプのオブジェクトを送信する場合)、またはカプセル化する場合に役立ちます。実装の詳細だけでなく、ソリューションの過剰な設計も避けたいと考えています。また、すばらしいスタブオブジェクトを作成し、スタブ/モックのオーバーヘッドが必要ない場合は、フレームワークスタブの代わりに使用することがよくあります。