Show page source of design #55500

= にこりぶ設計 =

== nicolib C# Java 草案1 ==
@author はるxxxx

=== まえがき ===
 * 独善的でかなり分野的に偏った設計になってます。(足りない部分は修正してね(ハート))
 * クラス名やメソッド名が気にくわない場合は容赦なく変更してください。
 * 設計に関してはご意見ご感想随時募集中です。あと彼女(ry



'''ライブラリの設計にあたり、どのような特徴を備えるべきか'''

 * ライブラリの主となるAPIアクセスやサーバー接続に関しては、取得失敗時の自動リトライ・非同期通信・適切なイベント・例外処理など高度な機能を備える。
 * ニコニコ動画の仕様変更に対して柔軟に対応できるような仕組みを備える。
 * 初心者でもサンプルコードを見るだけで使い方を理解できるような直感的なインターフェースを備える。
 * ギークなユーザーの要望にも答えられるように全てのAPIデータは一部例外を除き直接アクセス可能なアクセシビリティを備える。
 * アクセス頻度の高いデータのキャッシング、情報の拡張、処理の自動化など実用的な機能を備える。
 * アスペクト指向(マイブーム)



'''効率的な開発のためにライブラリ全体を4つのブロックに分けて設計する。'''

 1. 通信インフラブロック
 2. APIアクセス・取得ブロック
 3. コメント受信・送信ブロック
 4. 実用的な機能の実装ブロック



----

=== 1.通信インフラ ===
ニコニコサーバーとのHTTP通信を取り扱う。

 * ブラウザからのクッキー取得(Javaはマルチプラットフォーム対応を目指す)
 * 直接ログイン
 * ユーザーセッションはライブラリのスタティックな変数に保存される。
 * セキュリティの関係上外部からはアクセスしにくいような方法で保存する。
 * HTTPというクラスに静的メソッドHTTP.Get(url); やHTTP.Post(url,param);などを定義して
 * ライブラリ上からどこからでもログイン情報込みの通信ができるようにする。
 * 通信失敗時のリトライ機能、非同期的な通信、通信失敗時の例外処理など。

(課題)
 * 対応ブラウザ
 * 例外処理
 * セキュリティ(アクセスできるURLを制限する?)



----

=== 2.APIアクセス・取得ブロック ===
単純なAPIアクセス、APIのインスタンス化を取り扱う。

(参考:http://sourceforge.jp/projects/nicolib/svn/view/Java/Nico-Lib-Java-Hal/src/nicolib/api/?root=nicolib)


◆ 概要

□ 情報取得系APIについて
  * APIはそれと1対1対応のクラスを作る。
  * XPathなどでAPIの任意の要素にアクセス可能にしておく。(仕様変更に即座に対応できるように)
  * プロパティによる呼び出しもサポートする。(APIの中身を意識しなくてもデータにアクセスできるように)

   * (!)データの取得と表現以上の動作を定義しない。(キャストや単純な変換などはあり)
   * データを加工したり何かしらメソッドを定義したりする場合はクラスを継承して拡張すること。(統一的なインターフェースを実現するため)


□ 操作系APIについて
  * ログイン要求、マイリス登録、運営コメント投稿など
  * 分類ごとにクラスにまとめて定義しておく。
  * APIに対して静的メソッドが用意されている感じ。


(課題)
 * 非同期的なAPIアクセス
 * 取得失敗時の動作



◆ 詳細設計

全てのAPI表現クラスはApiBase抽象クラスからの派生型とする

ApiBaseクラスにはApi内部のデータを任意に取り出せるSelect(String location);という抽象メソッドを定義しておく。(返り値はString。)
SelectIntとかSelectDateなんかもあると便利かも。(作る場合はSelect抽象メソッドを使ってApiBaseに実装を書くとらくちん)

ApiBaesクラスの派生型としてXmlApiBase、UrlParamApiBase、HtmlApiBaseの3つの抽象クラスを定義する。

 * XmlApiBaseクラスはXMLでデータを表現しているAPI
 * UrlParamApiBaseクラスはname1=value1&name2=value2...のような形式のAPI
 * HtmlApiBaseクラスはHTMLページ上の情報をAPIのように扱う場合

この3つのクラスはAPIから受け取ったデータを、それぞれXMLDocument、HashMap、テキストデータとして内部に保存する。
Selectメソッドを実装してこれらから任意のデータを取り出せるようにしておく。
 
(Selectのlocation引数は、XmlApiBaseはXPath、UrlParamApiBaseは名前、HtmlApiBaseは正規表現パターンでいいんじゃないでしょうか)
  将来的にはJsonApiBaseなんかも必要になるかもしれない。


具象クラスは対象のAPIの名前を持つクラス。PlayerStatusとか
データへのアクセスは、値をプロパティとしてクラスに定義しておく方法と
XPathなどで任意のデータを取り出せる方法を用意する。

例 簡単に実装するとこんな感じ(妄想コード)

{{{ code csh
abstract class ApiBase 
{
	public abstract string Select(string location);
}

abstract class XmlApiBase : ApiBase {
	System.Xml.XmlDocument xdoc;

	protected void loadXml(string url) {
		xdoc = new System.Xml.XmlDocument();
		xdoc.LoadXml(Http.Get(url));
	}

	public string Select(string location) {
		return xdoc.SelectSingleNode(location).Value;
	}
}

public class PlayerStatus : XmlApiBase {
	public static PlayerStatus Get(string liveId) {
		string url = "http://-----" + liveId;
		PlayerStatus p = new PlayerStatus();
		p.loadXml(url);
		return p;
	}
	private PlayerStatus() { }
	public String Addr { 
		get {return this.Select("getplayerstatus/ms/addr");}
	}
}

}}}
-----------------------------------------------

=== 3.コメント受信・送信ブロック ===
生放送と実況のコメントとアラートのコメントを取扱う。

 * 当然通信は非同期で行う。
 * 接続時、コメント受信時、切断時など適切なタイミングでイベントを発生させる。
 * 接続失敗時や通信不良による切断時の復帰機構。


設計としては
テキストベースの送信と受信(\0区切りで)が行えるClientBaseなるクラスを作って、
ChatReceiverやAlertReceiverみたいな派生クラスを作ればいいんじゃないかと思います。(適当

(課題)
詳細設計
イベントの種類
非同期処理


-----------------------------------------------

=== 4.実用的な機能の実装ブロック ===
動画のダウンロードとか頻繁にアクセスするAPIのキャッシング、データの拡張など
あと生放送の運営コマンド関係なんかもひつようかなぁ
ここだけすごい大雑把なのは許してください