クラスのデザイン
作成するクラスはおおまかに2種類に分類されます。取得するデータを表現するEntityクラスと、YouTubeの各種APIをコールし、それに応じたEntityを取得するメソッドを持つクラスです。YouTubeのAPIをコールするクラスを通じて、各Entityの配列が取得できます。このような形にしておくことで、データの利用側が型変換などを意識することなくデータを操作できるようになります。
下図は、list_featuredを呼び出したとき用のEntityクラス「ListRecord
クラス」と、APIをコールするクラス「YouTube
クラス」を表したものです。
それでは各クラスの詳細を見てみましょう。
APIをコールするクラスの実装
以下、APIをコールし、動画情報の配列を返すYouTube
クラスのメソッドについての説明します。ここではGetListRecordFeatured
メソッドを例に説明していきます(他のメソッドも取り扱うEntityの種類が違うだけで動作はほぼ同じです)。
- YouTubeのAPIをコールし、動画情報に関するXMLファイルを取得する
- XMLファイルをDataSetに読み込む
- 読み込んだDataSetから、Entityである
ListRecord
クラスの配列を生成する - メソッドの呼び出し元に
ListRecord
クラス配列を返す
GetListRecordFeaturedメソッド
まずはGetListRecordFeatured
メソッドについてです。このメソッドは外部から呼ばれ、呼び出し元に動画情報配列を返すメソッドです。
public YouTube.ListRecord[] GetListRecordFeatured() { String RequestUrl = String.Format( "http://youtube.com/api2_rest?method=youtube.videos.{0}&dev_id={1}" , ListRecord.Method.list_featured, this.zDeveloperID); return YouTube.GetListRecord(RequestUrl); }
GetListRecordFeatured
メソッドでは、リクエスト先のAPIのURLを作成します。String
クラスのFormat
メソッドを使って見やすく記述します。Format
メソッドはObject型で引数を受け入れるのでToString()
などを使った型変換が必要なく、ちょっとだけ楽になります。
そして、作成したURLを使ってYouTube
クラスのGetListRecord
というstaticメソッドを呼び出します。
GetListRecordメソッド
このメソッドは、実際にYouTubeのAPIをコールし、動画情報をYouTubeから受け取ります。
public static YouTube.ListRecord[] GetListRecord(String inRequestUrl) { ListRecord[] rVideoList = null; DataSet ds = new DataSet(); WebRequest rq = WebRequest.Create(inRequestUrl); WebResponse rs = rq.GetResponse(); ds.ReadXml(rs.GetResponseStream()); DataTable dt = ds.Tables["video"]; rVideoList = new ListRecord[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++) { rVideoList[i] = new ListRecord(dt.Rows[i]); } return rVideoList; }
このメソッドの中ではWebRequest
クラスを利用し、YouTubeに対してリクエストを送っており、レスポンスで取得したXMLファイルをDataSetに読み込んでいます。
DataSetクラスはXMLファイル形式のデータを暗黙的にRDBの形に変換してくれます。DataSetにXMLファイルを読み込む(ds.ReadXml(rs.GetResponseStream());
の部分)と、そのデータは3つのテーブルとして展開されます。
そして、videoテーブルに格納されているデータをListRecord
の生成に利用します。Entity生成はListRecord
コンストラクタで行います。
ListRecordコンストラクタ
GetListRecord
メソッド内のfor文でデータを渡されたListRecord
インスタンスは、DataTableのDataRowをコンストラクタで受け取り、各メンバフィールドにセットします。
internal ListRecord(DataRow inDataRow) { DataRow dr = inDataRow; Int32 s = 0; this.zAuthor = Cast.ToString(dr["author"]); this.zID = Cast.ToString(dr["id"]); this.zTitle = Cast.ToString(dr["title"]); this.zLengthSeconds = Cast.ToInt32(dr["length_seconds"], -1); this.zTime = new TimeSpan(0, 0, this.zLengthSeconds); this.zRatingAverage = Cast.ToDouble(dr["rating_avg"], -1); this.zRatingCount = Cast.ToInt32(dr["rating_count"], -1); this.zDescription = Cast.ToString(dr["description"]); this.zViewCount = Cast.ToInt32(dr["view_count"], -1); s = Cast.ToInt32(dr["upload_time"], 0); this.zUploadTime = YouTube.BaseTime.AddSeconds(s); this.zCommentCount = Cast.ToInt32(dr["comment_count"], -1); this.zTags.AddRange(Cast.ToString(dr["tags"]).Split(' ')); this.zUrl = Cast.ToString(dr["url"]); this.zThumbnailUrl = Cast.ToString(dr["thumbnail_url"]); }
コンストラクタのアクセス修飾子をinternalにしておきます。これにより、クラスをDLLで配布する際に、YouTube
クラスの各メソッドを利用する以外にインスタンスを生成できないようすることができます。これは、publicにしてしまうと、スキーマの異なるDataRowをもとにインスタンスを生成してしまうなど、不適切な利用をされる可能性があるためです。
なお、型の変換は私が作成したCast
クラスを使用しています。Cast
クラスについては添付ファイルを参照してください。
使用方法
それでは、今まで作成したクラスを使ってみましょう。
Default.aspx protected void Page_Load(object sender, EventArgs e) { HtmlGenericControl div = null; HtmlGenericControl div1 = null; HyperLink hp = null; Label lb = null; YouTube y = new YouTube("qguspDF-1Gg"); YouTube.ListRecord r = null; this.zRecords = y.GetListRecordFeatured(); for (int i = 0; i < this.zRecords.Length; i++) { r = this.zRecords[i]; ///コンテナの生成 this.Zone.Controls.Add(new HtmlGenericControl("div")); div = this.Zone.Controls[this.Zone.Controls.Count - 1] as HtmlGenericControl; div.Attributes["class"] = "Row" + (i % 2).ToString(); ///画像の生成 div.Controls.Add(new HyperLink()); hp = div.Controls[div.Controls.Count - 1] as HyperLink; hp.ImageUrl = r.ThumbnailUrl; hp.NavigateUrl = r.Url; hp.CssClass = "ThumbnailImage"; ///タイトルの生成 div.Controls.Add(new HyperLink()); hp = div.Controls[div.Controls.Count - 1] as HyperLink; hp.Text = r.Title; hp.CssClass = "Title"; ///詳細の生成 div.Controls.Add(new HtmlGenericControl("div")); div1 = div.Controls[div.Controls.Count - 1] as HtmlGenericControl; div1.InnerHtml = r.Description; div1.Attributes["class"] = "Description"; ///回り込みの解除 div.Controls.Add(new Label()); lb = div.Controls[div.Controls.Count - 1] as Label; lb.Style.Add("clear", "both"); } }
上記のようにしてYouTube
クラスのGetListRecordFeatured
メソッドを呼び出すと、ListRecord
の配列が取得できます。強く型付けされているのでインテリセンスを利用しながら値を取り出すことができます。
取得したデータの利用方法はさまざまです。例えば以下のような、動画情報を一覧できるページを作ることもできると思います。
まとめ
このようにクラスの配列としてデータを取得できるようにメソッドを設計することで、データの再利用が容易になります。強く型付けすることでインテリセンスの利用によるコーディング速度のUpと、型変換エラーの発生率を低減することができるでしょう。結果としてアプリケーション作成のコストを下げることが可能です。
私が運営しているサイトでもこのクラスを利用したガジェットを作成しています。
![YouTubeガジェット YouTubeガジェット](http://cz-cdn.shoeisha.jp/static/images/article/1155/1155_05.gif)