2010年10月9日土曜日

TwitterのC#用ライブラリを考え中

ツイッターはほどほどに、ブログを書いていきます。

でもブログもツイッターのお話です。

Twitterは、公式Webサイトだけでなく、個人のアプリケーションからタイムラインを閲覧したり、ツイートしたりできるようにTwitter APIが用意されています。
そのAPIは様々なプログラミング言語で扱えるような仕組みになっています。

私は、C#用でそのAPIを利用するために、面倒なことをまとめたライブラリを作ろうとしているのですが、設計に迷っています。



完璧に完成したものしか公開すべきでないと考え、いつもは何日も悩んで結局止めてしまうのですが、どうせなら悩んでいることを記しておこうと思います。
最終的に完成できればいいですし、なんかすごい人がうまいアイデアをくれるかもしれませんから。

さて、まずはTwitter APIの仕組みを説明します。

以下のURLは英語のドキュメントです。
http://dev.twitter.com/doc

タイムラインを取得するAPIを例にあげましょう。

タイムラインというと、ツイッターではホーム画面に表示される、自分と自分がフォローしている人のつぶやきの一覧のことです。
ところがTwitter APIではタイムラインの名のつくものが4つあります。

パブリックタイムライン
:ツイッターに登録している全てのユーザのツイート

ホームタイムライン
:自分と自分がフォローしているユーザのツイート

フレンズタイムライン
:ホームタイムラインとほぼ同じ

ユーザータイムライン
:特定のユーザのツイート

の4つです。今回はユーザータイムラインを例にとります。

Twitter APIはURLの形で表されます。

http://api.twitter.com/version/statuses/user_timeline.format

これがユーザータイムラインのAPIです。
versionには1が、formatには、json,xml,rss,atomのどれかが入ります。
さらに、?screen_name=***を後ろに追加することで、***のユーザのタイムラインを取得することになります。

では、私のタイムラインを取得してみましょう。
以下のURLにアクセスするだけです。

http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=e_fia

一度に表示するツイート数を変えるには、&count=5を後ろに追加します。最大200です。
&page=2と後ろに追加することで、さらに昔のツイートを見ることができます。

ツイッターのAPIはこんな感じです。
おわかりいただけたでしょうか。


さてさて、いよいよC#の話です。
Twitter APIはとても沢山あります。そして、それぞれにscreen_namecountといったパラメータがあります。

これをどうライブラリにするか?

もちろん様々な方法があるでしょう。しかし、なかなかうまくいかないので、ここに記します。



URLを中心とした方法

string url = Methods.Statuses.UserTimeline.Url;

url = url.ReplaceFormat(Formats.Json);

var param = new Parameters();
param["screen_name"] = "e_fia";
param["count"] = "5";
url = url.AddParameters(param);

var response = Twitter.Get(url);

これは、string型の定数として保存しているURLを取得して、次々に装飾していく方法です。
私はこれを全て実装しました。
しかし、あまりに定数が多くなるためか、起動に時間がかかるという問題が出てきました。
URLを定数として保持しておく方法はあまり良いとは言えません。



次は上の方法でURLを意識しないものです。

var method = new Methods.Statuses.UserTimeline(Formats.Json);

method["screen_name"] = "e_fia";
method["count"] = "5";

var response = Twitter.Get(method);

この方法は前のライブラリをちょこっと弄ってやれば作れます。
しかも、URLを定数ではなく、動的変数にすれば前の問題を解決できます。
しかし、基本となるURLは変更されてはいけないのに、定数としてではなく変数として保持するのはいかがなものでしょうか。


要するに言いたいことは、URLやパラメータをどのようにライブラリに組み込むのかです。
C#では定数は静的なものとして扱われます。つまり、起動時にすべてロードされるのです。APIの数はかなりの量ですのね、これは避けたいのです。
しかし、変わらない値なので変数とするのは変です。

書きながら気づいたのですがreadonlyにすればいいんじゃ・・・・・・。

一番の理想としては、「静的」「変更不可能」「初期化なし」です。
プロパティで1個1個記述することで、解決できますが面倒です。


さて、今までのはデータをプログラムに直接組み込む場合です。
データはxmlファイルに別途用意して、実行時に読み込むという手段もあります。
使用するほうは、コンパイル時のチェックができないので難しくなりますが、作る方としては保守性に優れているため、扱いやすいです。
それに、C#4.0のdynamicとxmlのコンビネーションは扱いやすいらしいですし。4.0じゃないといけないという問題はありますが。

とりあえず、dynamicを使った場合を作ってみますかね。
xmlファイル用意するの面倒くさい。誰か作ってくれればいいのに。

0 件のコメント:

コメントを投稿