2009/12/27

C# PrivateAccesserを使ってみるよ

こないだTDDBootCampで、プライベートの関数に直アクセスできるという
素敵な機能の話があって、Twitterにて、

「そいつは、プライベートアクセサーっていうんだぜ!」(一部誇張)

ということを教えてもらったので、こいつぁ試してみるかと。

使い方を調べてみると、ちゃんとMSDNにつながるのね

http://msdn.microsoft.com/ja-jp/library/bb385974.aspx
http://msdn.microsoft.com/ja-jp/library/ms184807.aspx
(MSDNもかっこよくなっとる・・・)

といっても、ちょっっと試してみただけなんだけど簡単に使えるのね。

最初、プロキシクラスが とか 中継してくれるとか、
いろいろ手続き処理を書きながら呼ぶのかと思ったら、
実際のやり方は非常に簡単で、テスト元のクラスを作ってから、
クラスのコードの中で右クリック(コンテキストメニュー)から、
単体テストの作成を選ぶだけ

クラスを指定してやれば、すべてのメソッドについて作ってくれるし
メソッド名を指定すれば、そのメソッドだけ作ることも可能

どれを生成するかは、メニューを出すとき、もしくは、その後に
表示されるダイアログで、必要なものにチェックいれると
自動で生成してくれるという簡単さ。

image 

自動生成されるコードには、TODOが書かれてるので、
簡単な関数であれば、そのとおり書いていけば単体テストの完成なのかな。

同じこと2回やると、XxxxxTest1みたいに数字がついて生成されちゃうので
気を付ける。(上書きでの生成はしない)

自動生成のコードは、引数用の変数が自動生成される
(引数名そのままの変数)ので、そこの値にテスト用の値、
expectedに予想される結果の値を入れれば、
メソッドのテストが完成する。

戻り値なしの場合は

Assert.Inconclusive("値を返さないメソッドは確認できません。");

って自動生成されるので、例外を受け取るように自分で
ExpectedException を追加する必要がある。

さて、自分の思ったところは、

TDDの場合は、テスト –> 関数の本体のみ実装 –> Red –> Green

と思ってたので少し流れが違うのかな・・・

自動生成だと、ユーザーが実際に使うに対してというよりは、
メソッドの動作を確認するっていう観点のテストになるので

リファクタリングとかで、共通化する部分が出てきて
そこを切り出すときに、関数単体のテストもしといたほうがいいな~って
思ったら、テストの自動生成の出番かな
(関数がprivateなら、プライベートアクセサーだなw)

試しにFizzBuzzで試したコードがあるけど、どこにおくかいまいち決めらんないので
要望があれば出すことにしようw

2009/12/20

TDDBootCampに参加してきたよ

見事に失礼なこと・・・
どこを修正したかは、恥ずかしくて言えません・・・

--

まずはお礼w
ラッセさん、ミルズさん、和田さん、ebackyさん、スポンサーの方々、スタッフの方々、
素晴らしいイベントをありがとうございます、本当にお疲れ様でした。
参加者の皆様、本当に楽しい時間をありがとうございました。

いやー、燃えた。すっごい燃えた。
興奮が覚めず、こんな時間に起きたのかもれないが・・・

午前中の座学は言うまでもなく素晴らしい内容で、
こりゃあ、自分の製造だけでもTDDにしなきゃいけないなぁ と
思わさしてくれる内容だった。

お品書きとか、内容とかは、聴く方に集中してたため
あれやこれやとかけない・・・

とりあえず

* 黄金の三角形
* レガシーコードにTDD入れるなら、手順を踏んで慎重にピンポイントで。

とか・・・

実習時間は、ペアプロと発表 * 2 だった。
ペアプロ自体、存在は知っててもやる気会がなく、今回初挑戦で
すっごい面白かったし、ものすごいタメになった。
(相手の人には聞いてばっかりで、申し訳ない感じでしたが。。。^^;)
発表は・・・相変わらず、下手くそなので修行が必要です。

実習課題については、
* キャッシュを作る
* 古い履歴は削除される

と、アバウトな問題で・・・w
でも、実際に誰かから要求されるのレベルは、こんなもんだよなぁとも。
こういう仕組みがほしいなー って、一緒に作ってる人にムチャぶりしたこともあるので
あまり人の事は・・・・

追加の課題で
* キャッシュサイズの変更ができる
* 時間がたつと消える
* 排他制御

自分は、2個目の途中で時間が終わったんだけど、3つ目にも
挑戦してる人がいて、いやー早いな と。

自分のソースコードを振り返ってみると
2週目を回してる最中で、ノードの時間に関して外部から取得変更にインタフェースを追加したんだが
ラッセさんのコードを見てると、システム時間をいじる部分に細工して、
単体モジュール自体に影響を与えずに時間のテストを行うのが、ベター(ベスト?)みたいだった。
C#でどうやるのかパッっと思いつかないが、そこは改善の余地があるのかなって。
ただ、時間取得、時間設定ってのは、内部的に実装してあった方が
問題の切り分けには役立つので、「Publicにして表に出した」のが、少し失敗だったかなと。

それから、排他の話で、どうやって確実に問題を起こすコードを作成するか
ってところで、ちょっと思ったのは
排他されるべき区間内で、順番が入れ違うと発生する部分を関数化しておくことで
外部から呼ばれるタイミングを制御するってのはどうかなぁ

制御順番として、A -> B -> C -> D っていう区分けがあったとして
これを全部関数化しておくことで、自由に呼ばれる順番を制御できるようにする

で、A -> A -> B -> B -> C -> C -> D -> D とか、やってみるとか。

ただ、これを書いてて思ったのは
テストに実装が釣られるないように注意しないといけなくて、
テストのために、実装が変更されるのは本末転倒だよなぁ。
さらに、区分けした関数は全部Privateになると思うので、それ相応のプロキシが必要なことか。
意図的に競合を発生させるってのは、悩みどころだ。

難しい。

すごい乱文だけど、とりあえず覚書だからいいかー(よくないか・・・)

追記
そういえば、いろんなおみやげもらってきたんだ。
Tシャツは嬉しかったw その他いろいろは活用します!

Powered by ScribeFire.

2009/12/14

[Linux]コンパイルスイッチでプログラムから出力される文字を、Shift-Jisに。

プログラムを作ってて、ちょっと悩んだので覚書。

gcc/g++ には、入力される(ソースコード)の文字コードと
出力される(実行ファイル)の文字コードを指定するオプションがある。

入力文字コード : -finput-charset=<文字コード>
出力文字コード : -fexec-charset=<文字コード>

文字コードには、"cp932" ← Shift-jisって
指定すると、入力と出力の文字コードを制御できる。

組み込み系とかだと、Linux上で開発してるのに、
画面はShift-Jisにしか対応していないとか、
そういうときに重宝すると思う。


Powered by ScribeFire.

2009/12/01

Linux上のEclipseでコンテンツアシスト

ずいぶん前に書いたのに、投稿されてなかった・・・
--
コンテンツアシストって、あのコード補完ですよ。
この機能が好きなときに呼び出せないと、候補を探し間違えるだけで
また文字列打ち直しになるから面倒なんだよね。

LinuxでEclipse使いながら開発してたんだけど
どうにもアシストが自動では出てくるが、自分で出せない。

なんでかなーって調べてたら
普通にキーバインドがちがうでやんの・・・・

設定方法は、

日本語化済み環境にて

ウィンドウ -> 設定 -> 一般 -> キー
を開いて、中から「コンテンツアシスト」の項目を探す。

選択状態にして、説明の下にあるテキストボックスみたいなのに
カーソルを移してCtrl押しながらSpace
これで、設定が変わる(デフォルトだと、Alt+/ になってるみたいだなぁ)

というわけで、Ctrl+Space でコンテンツアシストが出てくるようになったよ。


Powered by ScribeFire.