Net::ECS4 ... 挫折気味
amazlet.com がちょっと雑なつくりになっていてかなりリソースを無駄に使っているので、ここいらで再構成しようかなと思い、せっかくだから ECS3 から ECS4 に乗り換えてみよう、という気になりました。
それで、どうやって ECS4 をハンドリングしようかなと思ったんですが、いい機会なので ECS3 で言うところの Net::Amazon みたいにライブラリを作ってしまおうと思ったわけです。
それで、試行錯誤を繰り返しながら途中まで作ってみてはみたものの、色々問題点にぶつかりちょっと面倒な作業が多いことに気付き、息切れ中。
インタフェースは
use Net::ECS4; my $ecs = Net::ECS4->new( SubscriptionId => '05E4Z6BS905VMVE919G2', AssociateTag => 'naoyadyndnsor-22', Version => '2005-07-26' ); my @items = $ecs->search( Operation => 'ItemSearch', Keywords => 'perl', SearchIndex => 'Books', ResponseGroup => 'Large', ) print $_->Title for @items;
みたいな感じかなと思い、Operation の種類ごとに parse のロジックを振り分けるために Strategy パターン、それから ECS3 に同じく 書籍、DVD ... といった商品ごとに返却されてくる情報が異なるみたいなので、それを吸収しつつ同じインタフェースでオブジェクトを生成するよう、Abstract Factory パターンなんかを使って組んでみました。
で、何が面倒かといいますと、例えば asin:B0000XK7L4 に関する XML の中身で、商品そのものの情報に関するところに相当する ItemAttributes はこんな感じになってます。
<ItemAttributes> <Brand>Matsushita</Brand> <EAN>4984824555471</EAN> <ListPrice> <Amount>39795</Amount> <CurrencyCode>JPY</CurrencyCode> <FormattedPrice>¥ 39,795</FormattedPrice> </ListPrice> <Manufacturer>松下電器産業</Manufacturer> <NumberOfItems>1</NumberOfItems> <PackageDimensions> <Height Units="cm">9.0</Height> <Length Units="cm">27.0</Length> <Weight Units="Kilograms">0.95</Weight> <Width Units="cm">21.0</Width> </PackageDimensions> <ProductGroup>CE</ProductGroup> <ReleaseDate>2004-02-20</ReleaseDate> <Title>Panasonic ΣBook(シグマブック) ...</Title> </ItemAttributes>
この ItemAttributes の中が、商品の種類や、同じ種類でも商品ごとに、どういう要素があって何が複数で何が単数でっていうのがかなり違うというところ。結構いろんな要素があるんですが、そのすべての要素の仕様というかスキーマを全部考慮して XML::Simple で parse してオブジェクトにセットしてみたいなことを完璧にやろうとすると、相当疲れるということが発覚したという。
オンラインドキュメントを見ても、この各要素ごとのフォーマットの仕様みたいなのは見当たらなかったので、とりあえず適当な商品のデータをみながらごにょごにょとやってたのですが、これだと全部把握するのはかなりしんどい。やっぱりスキーマなり何なりと照らし合わせて自動でオブジェクト生成、みたいにしないと無理なのかなあ。(でもそれで自動でオブジェクトを生成したとしてもテンプレートに埋め込むときに、結局パラメータの仕様を知る必要があって同じなんだけど。)
ということで、途中まで作って動いてはいるんだけど、もう絶賛放置の予感。
ECS4 は ECS3 に比べて取得できるデータの種類もかなり豊富だし、いろいろ矛盾してたところが改善されてはいるのですが、その分返却される XML の中身がちょっと複雑になってて細かいところで躓くな、という印象です。