Under17の「こたえ」もAngelaの「未来という名の答え」も好きな曲。
MVVMってものを色々と、作りながらあーでもないこーでもないと悩んでいたのだけれど、結局は「これでいいんじゃね?」と行きついた一つの答えというか、そんな結論をまとめてみたのでメモしておく。
図にまとめるとこんな感じ。上から行くと、
View部分
Viewクラスが一つ。ここが画面。ユーザーにみえる所。モノはFormだったり、aspxページだったり、Silverlightコンテンツだったりするけど、もちろん、ルックス重視で外面の良いタイプが適任。コントロールが配置されたり、表示されたりでイベントも発生させるし、イベントドリブンの簡単なコードはあるけれど、それ以外のことは全部ViewModelに丸投げw。
ViewModel部分
ViewModelクラス
外面だけ良い八方美人のViewを支える縁の下の力持ち、というか、パートナー、というか、執事。Viewとは1:1の関係で、Viewで発する色々なイベント処理やデータ処理の実体実働はここ。場合によっては複数のModelをコントロールしなくちゃだから、やることはたくさん。といっても、細かな処理についてはModelにさせてしまうので「あれしろ」「これしろ」とメソッド呼び出しするのがお仕事。何も考えていないViewModelのために「何を表示するのか」を定義したViewRecordも管理してくれていたりと、致せり尽くせり。
ViewRecordクラス
View部分に配置されるGridViewやDetailView用に作成する自己完結したクラス。各要素をプロパティで公開して、必要であればチェックメソッド何かを持っていたりする。ViewModelに属しているようでいてViewにも媚びている板挟みの立場w
Model部分
ここはModelクラス-DataControlクラス-DataSourceクラスのトリオ。3兄弟か姉妹かグループなのかは判んないけどね。ModelとDataControlは、List (of DataRecord)というクラスを共有してうまく仕事を連携できるようにしてる。DataSourceはデータの内容そのものには何も関係してないから、気にしてないけどw
Modelクラス
ViewModelクラスとのやりとりを一気に引き受ける窓口で交渉人。実質のリーダーというか一番上。正体はDataControlのラッパークラスで、メソッドを公開して命令を受けて、連番処理とかキー付与とかそういう小細工が必要ならしてくれるけど、大体においてはその命令をそのまますぐ下のDataControlに丸投げw
DataControlクラス
Modelクラスから受けたメソッドを真面目にこつこつと処理する。List (of DataRecord)を持ち、データ処理の中心部分。真ん中はつらいよね。
DataSourceクラス
データ接続やロード処理だけを引き受けるクラス。データベースであれば接続切断やSQLの実行、ファイルであれば読み込みや書き込みをする。ModelクラスとDataControlクラスが「どこの」データを処理しているのか全く意識しなくて済んでいるのは実はこのクラスのおかげ。無関心を装って実は要?
DataRecordクラス
データベースであればテーブルと、ファイルであればファイルレコードと、それぞれ一致したデータ要素を持つクラス。要素はプロパティで公開。Modelが一緒に外部に公開しているけれども、実体はDataControlと密接な関係に……ってそれなんてトライアングラーw Modelクラスとのやり取りがある、さらにその上のViewModelクラスからも見守られていたりするヒロイン属性w
いじょ。
時間とパワーがあれば、サンプルコードも書いてみたいんだけどな。
つか、擬人化してるのは、きっと気のせいw
ってわけじゃないだろうけど、
ASP.NETで、My.Settings.Save がなぜか反映されないorz
値の取得はできるんだけどなぁorz
自分でXmlDocument使って、ごりごり書いたらうまくいくので、そうすることにした。
<<以下、戯言>>
時々、.NET Framework って便利なのか不便なのか、よく判らなくなってくるよねぇ。
色んなロジックや操作をカプセル化してくれてるのはすごいんだけど、一方で、
自分のほしいと思う操作や関数処理にはどこか足りなかったり、
種類も用途も豊富すぎて適切なクラスを探し出せなかったり。
開発工数、本当に短縮できてるんかなぁと思う時もあるw
初めっから無いものとして、ごりごり書く方が結果早くて確実だったりするかもだし。
そうだ、固定長ファイルのI/O用クラスを作らなくちゃw VisualBasicじゃ、どうも、やりづらいwwww<おい
というのをVB.Netでチェックするロジック。すっごくベタw
Private Function CheckURL(ByVal cURL As String) As Boolean
'入力が無いならFalse
If cURL = "" Then
Return False
End If
'チェック開始
Try
Dim chp = Net.WebRequest.Create(cURL)
Dim resultSet = chp.GetResponse
Catch ex As Exception
Return False
End Try
Return True
End Function
恐ろしく単純明快、危険極まりないのは確か。
本来なら、404かどうかとか、Responseコードをちゃんとチェックした方がいいと思うの。
VB.Netで固定長ファイルを読むのはとても簡単
My.Computer.FileSystem.OpenTextFieldParser メソッド
使うと、1レコードを配列にして受け取れるから
じゃぁさ、1レコード分のデータ配列から、固定長に書き込むにはどうするん?
ゴリゴリ書くしか、ないっぽいorz
ちょっと頑張ってみるかorz
年末のご挨拶
というわけで、怒涛の一年が終わり、新たな年が始まろうとしています。
諸事情により、ITという業界を離れ、全く別の職種で働く昨今ですが
これからもほそぼそと、この面白くも厳しく楽しい世界にかかわっていきたいなと思っています。
業界の皆様には、永らくのご愛顧ありがとうございました。
良いお年をお迎えくださいませ
来年はかたぎりさんの次回作にご期待ください<違っ