if not item.has_item?
のとき item.nodes(...
からエラーメッセージを取り出すことはできない。以前のように doc
に対してメッセージを送らないと。■AmazonItem#initialize
で has_item?
相当の処理をして、ダメならアクセス可能な場所(AmazonItem#error_message
とか)にエラーメッセージを残しておく(あるいは AmazonItem のアイデンティティ不在を理由にエラーメッセージを例外にして投げる)というのが一案。■規模に比して過度な構造化は避けたいにしても、複数のメソッドがフラグ(この場合はシンボル型の @parser
変数)で分裂するのは嫌いだなー。コンテクストがモザイク状に入り組むのを避けたい。アダプタに委譲するとか(※分岐フラグではなく予め分割して選択したコードを保持するということ。毎回進路に迷うのではなく、事前の1分岐で決定する)、特異メソッドで特化するとか(※分岐コードをモジュールに分割してエクステンド。派生メソッドの呼び出しまでをインタープリタに任せられる)、呼び出し側が変更できるならクラスではなくファクトリメソッドをエクスポートするとか、思いつくのはこのあたり。■便乗して蒸し返すけど、AmazonItem#initialize
で最初の <Item> を無条件に選択するのは、ISBN で検索してるのに ISBN を持たない Kindle本が紙の本より優先される場合があり、必ずしも望んだ結果ではないし(※対応する Kindle版を含めることが不合理だとまでは言わない)、結果が並びに依存していて不安定でもある>20150518p02。←の方法は、XPathで全部やろうとしないで、items.find{...} or items.first
あたりが無難か。■参考。error_response.xml, twoitems_response.xml