miau's blog?

ASP.NET その4

ASP.NET の感想とか不満点とか、そういう所。




■情報が多い

 やりたい事をググると、かなりあっさりサンプルコードが見つかったりします。(@IT の Tips とか、よく行き着きます)
 ma さんが以前 ASP.NET の利点として「他の言語にはフレームワークが複数存在するけど、ASP.NET には標準のフレームワークがあって、ほとんどの機能がそれに収まってる」ことを挙げてましたが、今回豊富な情報に触れてその通りだと思いました。


■GUI はやっぱり楽

 コンポーネントの配置とかは結局 HTML エディタでやるのでいいんですけど、DataGrid とかの設定が GUI でできるので楽でした。
 まぁこれは ASP.NET の利点ではなく、VS.NET の利点でしょうけど。


■Repeater や CustomTemplate の記述

ちょっと面倒だなと思った部分。
Repeater を多用してたんですけど、いちいち DataBinder.Eval() とか Server.HtmlEncode() とかするのは面倒です。

例えば DB から RegDate、Comment、Name の 3 フィールドを取得して一覧表示したい場合、以下のように書かないといけません。

<asp:repeater id="repComments" runat="server">
<ItemTemplate>
<tr bgcolor="#cccccc">
<td width="100%" colspan="2"><%# Server.HtmlEncode(Format(DataBinder.Eval(Container.DataItem, "RegDate"), "yyyy年M月d日")) %></td>
</tr>
<tr bgcolor="#ffffff">
<td width="60%"><%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "Comment")) %></td>
<td width="40%"><%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "Name")) %></td>
</tr>
</ItemTemplate>
</asp:repeater>

<%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "Comment")) %> の部分がやたら冗長だと思いませんか?

これが Smarty だったら、{$comment|escape:html} みたいに書けるわけで。(オプション次第では escape:html も不要だし)

確かに ASP.NET の書き方は冗長な書き方になってしまう反面、柔軟な処理は可能になっています。
でもフレームワークとしては「簡単な処理は簡単に書けるし、難しい処理も記述することができる」というのを目指すべきでは。

そんなわけで、syntax sugar みたいなのを用意しておけばいいと思う。
どうせプリプロセッサ的に特殊なことやってるんだから、#D("Comment") が DataBinder.Eval(Container.DataItem, "Comment") に展開されるとか、<%# 〜 %> の代わりに<%#H 〜 %> と書いたら HTML Encode してくれるとか。(可読性の点では #DATA と #HTML のほうがいいかもしれないけど)

そしたらさっきのが <%#H #D("Comment") %> みたいに書けるわけで。これなら Smarty とかと比べても面倒な気はしないんだけど。


■Repeater の自動化

ちなみに、実際の作業は自動化してたので作業自体はそれほど面倒ではなかったです。
というのも、基本的にデザイナーさんがサンプルページを用意してくれていたので、特定部分を置き換えるだけなんですね。

デザイナーさんから渡されるのはこんな感じのファイル。

<tr bgcolor="#cccccc">
<td width="100%" colspan="2">2005年12月9日</td>
</tr>
<tr bgcolor="#ffffff">
<td width="60%">教えてください!</td>
<td width="40%">反復 士郎</td>
</tr>

で、画面の設計書には項目定義書が無かったので、自分で作ってしまおう、と。

項目名サンプルDBフィールド名
登録日2005年12月9日RegDate
コメント教えてください!Comment
氏名反復 士郎Name

この表があれば、HTML からテンプレートを作るのは簡単ですよね。
・先頭からサンプル文字列を検索
・見つかった部分を <%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "(DBフィールド名)")) %> で置き換え
するだけなので。今回は Perl でこの処理作りましたが、ASP.NET 専門部隊とかであれば VS.NET のアドインとかそういう形で実現してほしい所。


■ASP.NET のデザイン分離

Repeater で DB から取得したデータを書式指定する場合、単純に考えて 3 通りのやり方がありますが。

(1) SQL で処理する
(2) コードビハインドな VB で処理する
(3) .aspx 内で処理する

書式指定ってのはデザインに属する部分なので (3) が妥当なのは言うまでも無く。

そんなわけで書式指定には .aspx 内で Format() を使うことが多かったんですが・・・これって VB.NET の関数(C# では使えない)ですよね・・・。デザインは言語依存にしない(コードビハインドで使う言語が C# になってもそのまま動く)ほういいんと思うんですが。
DataBinder.Eval() の結果(SqlDateTime とか)が IFormattable インターフェイスを備えてないのが問題な気がする。
String.Format("{0:d}", DataBinder.Eval(〜)) とかできたら言語依存なくなりますよね。

そもそもデザイン側で使う言語が VB.NET とか C# ってのはどうなんだろう。デザイナーもそのへんの言語を覚えるべき、っていうのが Microsoft 的な考え方なのかな。
とか思ったけど、よく考えたら Label とか使う場合の書式はコードビハインドで処理するしかないような。DataGrid が GUI でフォーマット指定できることを考えると、VS.NET はデザインビューだけで全ての設定が行える世界を目指してる気がする。まだ未完成ってことだろうれど、VS.NET 2005 ではどこまで対応してるんだろう。


■VB.NET での条件分岐

同じく「データが NULL の場合は - と表示する」みたいな処理がやりたい場合。
これも書式の問題だからデザイン側で処理するのが正しいはず。

で、こんなコードを書くわけですが。

<%# IIf(IsDBNull(DataBinder.Eval(Container.DataItem, "Point"), _
"-", _
DataBinder.Eval(Container.DataItem, "Point")) %>

実はこれだと例外が発生してしまいます。

VB.NETにおけるIIfメソッドの注意点 - Mai::blog

このへんに書いてる通り、FalsePart も読み込まれるもんで。

結局 NULL の情報を View までそのまま伝える方法が無いわけで。
仕方ないから DB から取得する時に COALESCE("Hoge", -1) とかなんとか変なことやってました。元々 0 以上の値しか入らないフィールドだからよかったけど、そうじゃなかったら困ってたような。


■VB.NET の不満点

ちなみに上記の問題、C# で三項演算子使った場合は起きないそうで。(普通ですが)

ILで遊んでみよう! C#とVB.NETの局所的比較

それ以外にも色々 VB.NET 使ってて面倒だと思ったことがあるので、いくつか書いて見ます。

・ヒアドキュメント(verbatim 文字列リテラル)が使えない
 sql を書くときも、

sql = sql + "SELECT "
sql = sql + " hoge,"
sql = sql + " fuga"
sql = sql + " FROM"
sql = sql + " HogeHoge"

 みたいな書き方しかできないから、クエリアナライザにコピーするのが面倒。

・行内コメントが使えない。
 さっきの Repeater の例で、

<%# Server.HtmlEncode(DataBinder.Eval(Container.DataItem, "Hoge")) %>

とかあったわけですが、ここで Hoge が整数型の場合、Server.HtmlEncode() は不要になりますよね。
でも、それを消してしまうとわざとやってるのか何なのかわからないので、できればこんな感じでコメントを入れたい。

<%# DataBinder.Eval(Container.DataItem, "Hoge") 'Hoge は integer なので HTML Encode は不要 %>

でも VB.NET だとこの書き方はできない、と。(C# なら多分可能)

前も VBScript の関係で書いたけど、いいかげん BASIC の流れは滅びて欲しい。
Microsoft も「VB.NET を使えば VB6 の技術者も移行が楽」とか売り込んでたけど、そんな甘言に騙されないで皆 C# を使うべきだと思う。
きっといずれ捨てられますよ、VB.NET ユーザは。で、そのときになったら「VB.NET 使ってたら C# 使うのも楽ですよ」とか売り込まれるわけですよ。


■Repeater

たまにハマったんですが。
・データフィールドに NULL があると、その行は表示されない
・NO DATA の場合、HeaderTemplate と Footer Template のみ表示される
という仕様みたいですね。

今回やりたいこととして、
「NO DATA の場合、その Repeater 自体を表示しない」
(Header や Footer も表示しない)
というのがあったんですけど、結局実現方法わかりませんでした。
(今回は Repeater をネストしてたので、Visible="false" とかは不可)

HideIfNodata みたいなオプションがあれば良かったなー、と。

似たようなもので、こんなのはあったんですが・・・使うかもしれないのでメモ。

Extended asp:Repeater

I've always wished for a Repeater with a NoData template.
It is a very common requirement that we display a “No data available” message
when a database query returned no rows.



■ページ処理

SQLServer って「101 件目から 110 件目を取得する」みたいなことができないんですよね。
一応やり方はあるんですが、

ステップアップ!ADO.NET 第 4 回 データベースからの読み込み 〜その3:ページ操作、並べ替え、そして検索〜

こんな感じで、組み込むのが結構面倒です。
SQL Server 2005 だと改善されてるのかな。


■プラグイン達

どこに書くべきかまよった挙句、最後にひたすら羅列することにしました。
元々自分用のメモとして書き溜めたものなので、かなり適当な感じですが勘弁。

Morrison Schwartz > Freeware Developer Products
SharpTools and Plugins にいろんなプラグインがあります。

Command Prompt Explorer Bar
Explorer を拡張して、.net のコマンドを色々実行できるようにする。
面白いんだけど、操作が違うのでちょっと戸惑う。
それはいいけど、これ入れてから ActivePerl の動作がおかしくなったような?

QuickCode .NET
プロパティ追加するときとかに便利かも。
プロジェクトでこういう情報も共有できたらいいんだろうけど。
ちなみに入れたんだけど、なんか調子悪くなって使えなくなりました。

Web Development Helper
色々便利そうなんだけど、要 ASP.NET2.0 なのかなんなのか、使えなかった。

.NET Reflector Add-Ins
これも色々便利そうなんだけど、Reflector.Graph を試したらアセンブリ単位の依存関係しか表示されなくて萎えた。

Scott Hanselman's 2005 Ultimate Developer and Power Users Tool List
開発系ツールのリンク集。かなり充実してる。
以降のツールはここを参考にしてるはず。

Introducing the Bayden IEToys
まあ、色々な右クリック拡張。

Unleash It
必要なファイルをまとめてくれる deployment 補助ツール?
リリースのときに便利そう、とか思いつつ結局使ってません。

ReSharper
未宣言の関数を書いたときに、その宣言を書くのを補助してくけるツール。
Eclipse 3.1 にこういう機能あるはずだけど、これは有料と。
でもガリガリとコーディングするときに良さそうだから欲しい。

CodeRush
なにやら格好いい補助ツール。
ネストがごちゃごちゃして見にくいコードとか扱うときに良さそう。
でも有料。

Professional Validation And More
ASP.NET 標準の Validator で物足りない人向け、みたい。
確かに必須チェックと一緒に空白チェックとかやってくれてもいいような。
でも金払ってまで使うか、というと今回はいいや、と。
posted at 07:40:21 on 2005-12-20 by miau - Category: Work No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

No comments yet

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。