勉強メモ1

最近、.NETを勉強してます。

以下、Java屋が.NETエンタープライズWebアプリケーション開発技術大全を読んだときに気になるメモ。

Vol.2

Webサーバ上に配置した.aspxプログラムファイルはそのまま実行されているのではなく、いったん暮らすファイルに変換されてから実行されている。
(略)
・.aspxプログラムファイルがC#あるいはVB.NETのクラスファイルのコードに変換される(初回のみ)。
・クラスファイルがC#あるいはVB.NETコンパイラによりコンパイルされる(初回のみ)。
・クラスファイルからページインスタンスが生成され、実行される。

JSPとそっくりです。遅延コンパイルの仕組みも同じです。

クライアントからのリクエストごとにインスタンスが生成され、並列処理される。

これも同じです。ページに変数を置いても問題なさそう。

  • p20 ASP.NETランタイムの基本動作のまとめ

・HTMLデザインブロック中に埋め込まれたWebコントロールを元にして、WebUIコントロールツリーが作成される。
・ランタイムからASP.NET処理ブロック中のPage_Load()メソッドなどが自動的に呼び出されて処理が進む。
・最終的には、Web UIコントロールツリーからHTMLが出力され、クライアントに返される。

Web UIコントロールツリーは、WebコントロールなどがHTML構造にしたがってツリー状に連結されたオブジェクト。構築要素は次のとおり。

  • p21 HTMLデザインブロック中のタグのオブジェクト変換ルール

・Webコントロール
 というタグを元にして作成されるオブジェクト。
・HTMLコントロール
 というタグを元にして作成されるオブジェクト。
 通常のHTMLのタグに対してrunat="server"を付与することで作成される。
・リテラルコントロール
 上記以外の単純な文字列を元に作成されるオブジェクト。

・Webコントロールは.NET FrameworkのSystem.Web.UI.WebControls名前空間に存在するクラスのインスタンスに変換される。
・HTMLコントロールは.NET FrameworkのSystem.Web.UI.HtmlControls名前空間に存在するクラスのインスタンスに変換される。

runat="server"属性とかネーミングがダサ…
実際にはVisualStudioでWYSIWYGで作るからあまり意識はしなくてよい。

  • p23 WebコントロールとHTMLコントロールの相違点

同一のHTMLコードを出力できるWebコントロールとHTMLコントロールがある場合には、可能な限りWebコントロールを利用するようにすべき

理由は、以下の4点。
1. 抽象度の高いコンポーネントが利用できる。
→リッチな画面オブジェクトが同じコードで出力できる
2. 一貫性のあるコーディングができる
→HTML文法の各要素はvalue属性などの用途が要素によってばらばらだが、マイクロソフトは全部変えている。JSPタグと考え方が似ている…
3. コレクションデータバインドが利用できる
→table要素にRDBから取得したデータを自動的に埋め込むような芸当が可能
4. ブラウザに依存しない開発がしやすくなる
→これが一番エラい。ブラウザに応じたDHTMLを出力するようになっている。DHTMLというのは置いておきつつ…

  • p31 ポストバック処理

asp.netでは、処理をリクエスト単位ではなく、画面単位に設計することができる。
これにより画面で行うべき処理を簡潔した状態で次画面に遷移できる。これは画面遷移や状態管理の複雑度を低減できる。
このため処理を実行する上でサーバに問い合わせないといけないものは、同じ画面に対して「ポストバック」する。
書籍の刊行された時代だと通常のHTTPリクエスト。このため画面状態はシリアライズしてhidden要素として送信する。これをViewStateという。
なおこれがスゴイのは、ViewStateを復元したときの画面状態と画面を最初に表示したときの状態を比較して、Webブラウザ上でどういうユーザ操作が行われたか逆解析し、サーバ側のイベントハンドラとして「クリック」とかのイベントがおきた時の処理を実行するというもの。
変すぎ。
当然UI操作と処理がリアルタイム&操作順までは記録しないため、そこを意識してコーディングする。

ちなみに

  • p57

特に従来のASPやJSPでの開発に慣れ親しんでいる方々に気をつけて頂きたいのは、ASP.NETフレームワークでは、フォームの入力データは同一ページに対してしか送信できない(=ポストバックしかできない)ように設計されているという点である。

これはかなり徹底している。しかしこうすることで
・画面作成時にaction属性を指定しなくてすむ
・画面遷移の方法がすべて強制的に統一できる
というメリットがあるのでこれはこれで便利。
画面遷移はサーバ側でResponse.Redirect命令を使って302コードをブラウザに返してリダイレクトさせる。なお、JSPでいうforwardもあるが、ASP.NETではリダイレクトを使うのが基本。これは今日では回線状況が良いため、リダイレクトによる転送時間が相対的に無視できるという判断。

  • p69 コードビハインド

aspxはHTMLデザインブロックとASP.NET処理ブロックを同じファイルに書けるが、分けて開発できるようになっている。これをコードビハインドという。
書籍中では、単に処理ブロックのファイルを指してコードビハインドということもあるようだ。

  • p126 データベースとの接続携帯による分類

・接続型データアクセス
 データベースとの接続を保ったまま、読み書きを行う方式。
・非接続型データベースアクセス
 ポンプを利用して、データベース上のデータをいったん手元の容器に汲み取ってから読み書きする方式。
 必要に応じてデータベースとの接続と切断を行う。

非接続型データベースアクセスはDataSetというオブジェクトに結果セットをごっそり持ってくる。

  • p148 XMLとの相互変換

ちなみにDataSetはXMLと相互変換が容易。
・XML→DataSet:ReadXml()
・DataSet→GetXml() or WriteXml()

  • p150 脚注

(DataSetにデータアクセス機能がないという批判に対しての返答)
データアクセス機能とデータ保持機能とは分けて実装しなければならない(これを一体化して設計・実装するデザインはほとんどの場合は不適切である。)

Entity Beanですね。わかります。

  • p250 ページングを利用する場合のアプリケーション設計上の注意点

データバインド機能に対する小項目です。
検索結果などのリストになるものをページングする場合、結果データすべてを保持するとエラいメモリ消費量になるので、工夫しましょうという話。

・数百件以下に絞り込めた場合に限ってデータを表示する
・上限件数を超えた場合には、ひっとした件数のみをユーザに示す

SQL ServerなのでTOP句を使うように指示がありました。
でもTOP句に与えるデータ取得範囲の計算の方が面倒なんですけれども…

Vol.3に続きます。