2010年4月30日金曜日

テスト駆動型開発の基本的な考え方について

今日はテスト駆動型開発の基本的な考え方について書きます。(間違ってたらすいません)
テスト駆動型開発って聞くとすごく難しい感じがしますが、
コードを書く前にテストケースを上げる
ただそれだけのことです。
テスト駆動型開発によって得られるメリットは
  • 仕様を把握していないとテストケースが作れない、つまり仕様の理解を深めることが出来る、あいまいな部分をなくすことが出来る。
  • 仕様の理解を深めることによってバグが少ない、かつ拡張性が高い、かつメンテナンスしやすい設計が出来る可能性が高くなる。
  • 仕様に矛盾や問題があるとテストケースが作れない、つまり仕様書レベルでバグをつぶすことが出来る。
などです。
私が以前関わっていたプロジェクトではテストを自動化し、
  1. 仕様書を確認する。
  2. テストケースを上げる。
  3.  「1.叉は2.」で仕様書に矛盾や問題が有った場合は仕様書を差し戻す。
  4. 自動化の為のテストケースコードを記述する。
  5. 設計&実装
  6. テストケースを通す。
のような手順で開発して、毎朝その日の最新ソースで全てのテストコードを実行し常に品質を確保していました。

2010年4月28日水曜日

C++のconst T&(const参照)について

今日はC++のconst T& について書きます。
これはC++特有(たぶん)の型宣言で、知っていれば使用頻度はかなり高いと思っています。
私の場合editする必要がない参照変数や、関数の引数は極力const T& を使用するようにしています。
さて、const T& がどういったものかといいますと、まずは次のコードをみてください。
  1. CHoge& hoge = 1; // ①  
  2. const CHoge& hoge = 1; // ②  
このコードをコンパイルしたときはコンパイルエラーとなり、はコンパイルエラーとはなりません、なぜかというと
  1. CHoge temp = CHoge(1);  
  2. const CHoge& hoge = temp;  
このように一次変数への参照となるからです。また、一次変数への代入の際はコンストラクタが呼び出されるためコンストラクタの引数として取りえる型ならなんでもokなのです。
どうでしょう?便利ですよね?
最後に注意点が有ります、それは暗黙的に一次変数が生成されるためプログラマの意図しない動作となる可能性があるということです。
このことを頭の隅に置いておけばじゃんじゃん使ってよいと思います。

2010年4月26日月曜日

JavaScriptでテキストの入力非入力を検出する

今回はJavaScriptでフォームの入力を検出してボタンを有効/無効にするTipsです。

まずはJavaScriptのコードです。

  1. <script type="text/javascript">  
  2. <!--  
  3. // 入力欄にフォーカスが当たったときの処理  
  4. function onFocusInputText() {  
  5.  // 入力がある場合のみ登録ボタンを有効にする  
  6.  setTimeout("input_textCheck()", 200);  
  7.  return false;  
  8. }  
  9.   
  10. // 入力有無を検出する  
  11. function input_textCheck() {  
  12.  var form = document.form_input_text;  
  13.  if (form.input_text.value.length > 0) {  
  14.   form.entry.disabled = false;  
  15.  }  
  16.  else {  
  17.   form.entry.disabled = true;  
  18.  }  
  19.  setTimeout("input_textCheck()", 200);  
  20. }  
  21.   
  22. //-->  
  23. </script>  

200m秒のタイマーイベントに、ボタン有効/無効の関数input_textCheck()を登録するだけです。

無限にチェックするためにinput_textCheck()の中でタイマーイベントに自分を設定しています。

次にHTMLのコードです。

  1. <form name="form_input_text"><input type="textbox" name="input_text" onfocus="return onFocusInputText();">  
  2.  <input type="button" name="entry" value="登録" disabled="">  
  3. </form>  

textboxのonfocusイベントハンドラにonFocusInputText()を設定しています。

↓のフォームに文字を入力すると登録ボタンが有効になり、文字が無いと無効になります。




2010年4月25日日曜日

PHPでmysqli_connect() or die();

最近PHPの本を読んでいてなんだこれって思ってしまったのが
  1. $db = mysqli_connect('address''user name''password')  
  2.  or die('error:サーバとの接続に失敗しました。');  
ってコードなんですけど、2行目の「or」ってやつが分らなくてgoogle先生に聞いてしまいました(汗
まぁ、なんてことはない「||」=「or」つまりただのor条件式でした。
ちなみにこのコードはmysqli_connect()の結果が真なら$dbに真が代入され、偽ならdie()が実行されます。

C++でSingletonパターン

Singletonパターンはクラスのインスタンスが一つしかないことを保証するパターンです。
Singletonパターンのメリットは
  • 不要なインスタンスの生成を禁止することができる。
です。
まずは次のクラス図をご覧ください

このクラス図で重要なのは
  • getInstance()メソッド(static Singleton& getInstance())
  • privateなコンストラクタ(Singleton)
の二つですこれらによりsingletonを実現します。
つぎにソースを見てみましょう、用意するのは次のファイルです。
  • main.cpp
  • Singleton.h
  • Singleton.cpp
ますはSingleton.hです。
  1. #ifndef _SINGLETON_H_  
  2. #define _SINGLETON_H_  
  3.   
  4. class Singleton  
  5. {  
  6. public:  
  7.   
  8. // get instance  
  9. static Singleton& getInstance(); // ①  
  10.   
  11. // to string  
  12. const char*const toString(); // ②  
  13.   
  14. // destructor  
  15. ~Singleton(); // ③  
  16.   
  17. private:  
  18. // constructor  
  19. Singleton(); // ④  
  20. Singleton(const Singleton& _singleton); // ⑤  
  21.   
  22. // initialize  
  23. const bool init(); // ⑥  
  24.   
  25. // operator(=)  
  26. Singleton& operator=(const Singleton& _singleton); // ⑦  
  27.   
  28. };  
  29. #endif  

①唯一のインスタンスを取得するためのインタフェースです。
②文字列化のインタフェースです。Singletonパターンとは関係有りません。
③デストラクタです。
④⑤インスタンスの生成を禁止するためにコンストラクタをprivateで宣言しています。
⑥初期化メソッドですSingletonパターンとは関係ありません。
⑦operator=をprivateで宣言することによりインスタンスのコピーを禁止しています。Singletonパターンとは関係有りません。

次にSingleton.cppファイルを見てみます。
  1. #include "Singleton.h"  
  2.   
  3. Singleton& Singleton::getInstance()  
  4. {  
  5. static Singleton singleton; // ①  
  6.   
  7. static bool isAlreadyInit = false// ②  
  8. if (isAlreadyInit) {  
  9. // do nothing...  
  10. }  
  11. else {  
  12. isAlreadyInit = singleton.init();  
  13. }  
  14. return singleton;  
  15. }  
  16.   
  17. // to string  
  18. const char*const Singleton::toString()  
  19. {  
  20. static char* str = "singleton";  
  21. return str;  
  22. }  
  23.   
  24. // constructor  
  25. Singleton::Singleton()  
  26. {  
  27. // do nothing...  
  28. }  
  29.   
  30. // destructor  
  31. Singleton::~Singleton()  
  32. {  
  33. // do nothing...  
  34. }  
  35.   
  36. // initialize  
  37. const bool Singleton::init()  
  38. {  
  39. // do nothing...  
  40. return true;  
  41. }  

①唯一のインスタンスをstaticで定義しています。
②初期化処理を最初の1回だけ行うために初期化済みフラグを定義して初期化したらtrueを代入します。
注:この実装はスレッドセーフではありません。

最後にmain.cppです。

  1. #include "Singleton.h"  
  2. #include <stdio.h>  
  3.   
  4. void main (void)  
  5. {  
  6. Singleton& apple = Singleton::getInstance();    // ①  
  7. printf("%s\n", apple.toString());       // ②  
  8. printf("hit any key...\n");             // ③  
  9. while(getchar() == EOF);                // ④  
  10. }  
  11. </stdio.h>  

①getInstance()メソッドでインスタンスを取得しています。
②取得したインスタンスのtoString()メソッドを呼び出しています。
③"hit any key..."を標準出力に表示しています。
④いずれかのkeyが押されるまでループしています。

以上でSingletonパターンの説明は終わりです。ソースコードはコピペで動かせるハズですので是非試してみてください。

2010年4月23日金曜日

Iphoneから投稿してみる

今日は、iphoneから記事を投稿してみました。

まず、スムーズに投稿できるようにmacで記事をまとめます、ってスティッキーズに今まさに書いています。

スティッキーズというのはmacに付属している付箋紙アプリです。

iphoneから記事投稿の画面を表示して

タイトルを入力したところまでは良かったのですが、

本文のフォームをタッチしても反応してくれません><

何度か試したのですが駄目でした。

幸いにもHTMLの編集は可能だったのでこちらから入力しました。

(タグも書かないといけない罠・・・)

これから投稿するところですが入力が辛かったです。記事をメモしておいて後でPCから投稿するのが良いですね。

投稿しようとしたらHTMLエラーが出ました。

構文チェックをしてくれたようです。エライッ!

2010年4月22日木曜日

ソースコードに色(ハイライト)をつける

まず、プログラム関係の記事が多くなることが予想されるためソースコードをつけるプラグインを刺すことにしました。
ってことでgoogle先生に聞いてみると
クリボウさんブログ(aタグで直接指定しちゃってるけどいいのだろうか・・・)
を教えていただきました。
記事の中盤で

FaziBear's Blogger Widgets
の「Add to Blogger」ボタンを押し、ハイライト機能を導入したいブログを選択、「タイトル」入力欄を空白にして、「ウィジットを追加」ボタンを押すだけ。

ってあるので試してみたらIEにめっちゃおこられてしまった。
どうしたもんかと考えた結果一端保存してSafariにドラッグ&ドロップしたらうまくいきました。
さて試しにコードを乗せてみます。

  1. class hoge : public superHoge  
  2. {  
  3. pulic:  
  4. // コンストラクタ  
  5. hoge();  
  6. // デストラクタ  
  7. ~hoge();  
  8. // 初期化  
  9. virtual const bool init() = 0;  
  10. };  

良い感じ♪
ところでラベルってなんだw?カテゴリとは違うみたい・・・