いろいろ勉強していくうちにやる気が出てきたので、NEMCHIバージョン2の作成を再開しました。
前回(もう、半年ぐらい前になっちゃってますが・・・)しこしこ設計したやつは、ほぼ破棄してもっとシンプルに行くことにしました。シンプルイズベスト!
今回はプラグインが肝なのですが、ここのページを見たらインターフェースを使って実現させていました。これが一番シンプルなんだろうけど、途中でメソッド増やしたくなったらどうするんだろ、とか思っていたので他の方法を探していたのですが、そのときは元々のインターフェースは互換性のために残したまま、新しいインターフェースを作成すればいいや、と気づいたのでこれで行くことにします。
あと、SSLですが解説ページを見てもイマイチよく分からなかったのですが、.NET Framework2.0になって標準でSslStreamクラスが追加されており、原理がよく分かってなくても、これで簡単にSSL接続できることが分かりました。既存のSocketクラスにコイツをかぶせてあげるだけという、お手軽さでSSLに対応できます。
試しにIMAP4サーバーのポート993へSSL接続したら、ちゃんと通信が出来ました。ビバ!.NET!
今回はしっかり単体テストを入れていくぞ!ということで、いろいろ悩みながらやってます。
通信の所はモックオブジェクトを使うことで、テストが楽になるはず!と思いながらやってみますが、これがなかなかうまく適用できない。
IMAPやIMAPSなどのプロトコル毎にクラスを分けており、その中でソケットのオブジェクトは作るようにしています。ソケットの作成はそれぞれのプロトコルによって変わってくるので、論理的にはおかしくないと思う(レイヤー的にはどうかと思うけど)のだけど、それだとIMAPのソケット部分だけをモックに置き換えることできない。外部からプロパティーとかでIMAP4とかIMAPSとかのプロトコルを表すクラスにソケットのオブジェクトを与えるのも変な感じだし、どうしようか悩みました。
うまい方法は無いかと思いネットをうろうろしていたら、「モックオブジェクトがうまく適用できないのは、リファクタリングが足りていないからだ」みたいなことを書いてあるページを見かけたので、なるほどね、と思い、よーく考え直してみました。
よくよく考えれば、IMAPもIMAPSも通信手順はまったく変わりません。違うのは使うソケットがSSLでラップされているか、されていないの違いだけ。
ならば、実際にソケットを使って細かい通信をやりとりする部分だけをプロトコルを表すクラスから切り出して、切り出したクラスにはコンストラクタでソケットのオブジェクトを与えるようにしてしまえばいい。切り出したクラスは与えられたソケットを元に通信を行うという役割にしてしまうわけですね。
これで、IMAPSのプロトコルを表すクラスからはSSLをかぶせたソケットオブジェクトを渡し、IMAP4のクラスからは普通のSocketオブジェクトを渡すことで二つの通信方法の切り替えが出来るようになりました。単体テストもモックを使ってできるようになった。おおー、いいかんじ♪
なるほどねーこんな感じで単体テストが出来るようになるのね。いやーこれは楽だ。
モックオブジェクト無かったら、わざわざメールサーバーにテスト用のメールを置いて、それでテストしなくちゃいけないですからね。モックを使えば自由自在にテストデータは作れるし、TestDriven.NET使えば、テストクラスを一つ選んでRun Testですぐにテストできるから効率がいい。
なんか、ちょっと「あじゃいら?」になった感じで気分がいいぞ(笑)
進捗的には課題がだいぶクリアできたから、うーん7%ぐらい?