クラスのデザイン
作成するクラスはおおまかに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と、型変換エラーの発生率を低減することができるでしょう。結果としてアプリケーション作成のコストを下げることが可能です。
私が運営しているサイトでもこのクラスを利用したガジェットを作成しています。




