はじめにこの連載では、Dave"達人"Thomasによるコード=カタを筆者による乱暴な要約でお届けします。「コード=カタって何よ?」と思われた方は連載初回[*1]を参考にしてください。二分探索(バイナリチョップ――散文的にはバイナリサーチと呼ばれることも)はソート済の配列から、ある値の位置を特定します[*2]。このカタでは、後述する仕様にしたがって、自分の選んだ言語と技法でバイナリチョップを実装します。翌日には、異なる技法を利用して再び実装します。その翌日にはまた同じことを行い――全く異なる5つの方法で5回実装するまで、ひたすらバイナリチョップを続けます。これがこのカタがバイナリチョップであるゆえんです。......残念ながらこの後はこうした「カタっぽい」名前は出てこないようですが。列スライスを渡す方法が挙げられています。「全く異なる5つの技法で実装することは至難の業だろう」とDaveもCodeKataメーリングリストで発言していました。「5種類のアルゴリズム」ではなく5種類の技法(アプローチ)だと考えてみれば何通りかの方法を思いつけるのではないでしょうか。ポスト・エラーをやってしまいがち。エラーの発生頻度が減少するかを確かめます。自問自答しましょう――「なぜ?」と。3.バイナリチョップの5つの技法をひねり出すのはかなり難しいです。脳のニューロンを発火させたのかについて、思いを巡らせてみましょう。整列済みの整数配列を対象とした、特定の整数の検索を二分探索法で記述してください。処理は戻り値として、対象配列の整数インデックスを返します。配列のなかに検索対象が存在しなければ、-1を返します。int配列の要素は10万より少ないことを想定して構いません。このカタの目的に鑑みて、処理時間とメモリのパフォーマンスは問いません――といっても、処理が終わるのを待っている間に退屈してカタを止められても意味がありません。コンピュータのメモリはそれなりに確保しておきましょう。Test::Unit[*3]のコードです。御自由にどうぞとのこと。今回のカタは「カラテチョップ」をお届けしました。Fowlerから「こんなのカタじゃない。講義の演習じゃねえか」と物言いがついたらしいですが、このカタで大事なのは「目標」を意識することです。コーディングを身体感覚として体得し、他者に対して設計判断を言葉として伝える。自らが行き詰った際の打開策を客観視する。いずれも実務で欠くべからざる基礎的な技能だと思います。́Д`)3種類以上こなせた方は是非、オブジェクト倶楽部編集部宛に見せびらかしてください。次回のカタは「どれぐらい大きい?どれぐらい早い?」を予定しています。内容はプログラマの心得るべき「見積」についてです。Rubyのユニットテスト用フレームワークです。してRuby本体に同梱されています。_______________________________________________________________________この記事への評価にご協力をお願いします。URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用のブラウザに表示されれば投票完了です。前回は不吉な匂いから『巨大なクラス』を紹介しました。今回は予定通り『・・・・・・』を紹介するのは、すいません、パスさせてください。期待していた方、いらっしゃいましたらすいません。今回は予告とは異なりますが『属性、操作の横恋慕』を紹介したいと思います。[属性、操作の横恋慕で見られる症状]・やたらと他のクラスのgetメソッドを呼び出しているこの症状が見られるときは、本来別のクラスにあるべきメソッドを実装している可能性があります。『メソッドの移動』を行い、適切なクラスにメソッドを移動しましょう。逆に、メソッドではなく属性が、あるべきクラスに所有されていないこともあります。そのようなときは、『フィールド(属性)の移動』を行いましょう。それでは簡単な例を見てみましょう。サービス期間を管理するServiceTimeRangeクラスと商品を表すProductクラスがあります。Productクラスは与えられたServiceTimeRangeと現在時刻currentから、価格を決定します。ソースコードは次のようになります。}}----------------------------------------------------------------------全体を見渡すとメソッドの大きさも小さいですし、読みやすいですね。このソースコードだけを見ていると、なかなか良さそうな印象を受けます。ProductクラスのwithinServiceTimeRangeメソッドを見てみましょう。何か気付きませんか?この例では、Productクラスにサービス期間内かどうかを判定するこのメソッドが実装されています。サービス期間内かどうかを判定したいのはProductクラスだけなんでしょうか?次にメソッドの内部を見てみましょう。ServiceTimeRangeクラスのgetメソッドをたくさん(といっても2回ですが)呼び出しています。ここでは、サービス期間を扱う処理しかしていませんね。有するほうが良さそうです。ServiceTimeRangeクラスに移動してしまいましょう。このメソッドは外部のクラスから呼び出されるものなので、可視性はprivateからpublicに変更します。併せて内部もちょこちょこと修正しましょう。あとはメソッド名をそれらしく変更して・・・と、これで完了です。それでは、修正後のServiceTimeRangeクラスを見てみましょう。}}----------------------------------------------------------------------良い感じになりましたね。「適材適所」といった感じです。クラスを分割して、1つのクラスの複雑度を下げることはもちろん重要ですが、でたらめな形で複雑度が下がっても、やはり理解するのが難しいソースコードになります。いう理由で、どのクラスがどの属性・メソッドを所有すべきか「適材適所」を念頭において考え、クラス定義を変更していくことが重要です。今回の例ではメソッド全体が『メソッドの移動』の対象となりましたが、メソッドの一部分で『横恋慕』の症状が見られるときももちろんあります。そのようなときには、『メソッドの抽出』を先に行い、その部分を分離してから移動しましょう。今回は『属性、操作の横恋慕』を紹介しました。みなさんの中にはお気付きの方もいらっしゃるかと思いますが、いつでもどこでもこのルールを適用すると良いわけではありません。きれいなソースコードでもこのルールから逸脱していることがありますよね。「Strategyパターン」のようにロジックを構造から分離しているケースです。こちらは次回に紹介したいと思います。わかりにくい点や質問などは随時とりあげていきたいと思いますので、気軽にご意見をお寄せください。記事の評価も今後の執筆の参考になりますので、気軽に投票にご参加ください。みなさんからのメール・投票をお待ちしております。_______________________________________________________________________この記事への評価にご協力をお願いします。URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用のブラウザに表示されれば投票完了です。ホントのところ今週は「プログラマはコミュニケーションが得意?不得意?」のホントのところ。最近ではウンザリするほど耳にするこの言葉。どちらかと言えば得意な方です。ある種のコミュニケーションならうまくやっています。どちらともいえません。どちらかと言えば苦手な方です。誰ともうまくいきません。まで詳細を!!アンケート結果はオブジェクト倶楽部HP上にて公開します。前号「普及率が高いブラウザ」の結果は公開中。┗編集後記こんにちは、編集人です。GWも過ぎましたし5月病の時節ですね。5月病になる暇がない方もいらっしゃるのでしょう。先代の編集人のさとみさんは、GWはブラック・ウィークになると漏らしておりました。開けて空でも眺めてくださいね。今年は秘密の修行を新しく始めたので五十肩ですが、五月病の気配はありません。GW中に原稿を書いてきてくれたライターもいて、編集人としては、すこしニッコリしてしまう休み明けでございます。「オブジェクト倶楽部カレンダー」6月の電子データを公開します。絵のテーマは「デザイン・パターン(composite)」です。7月のカレンダーは、6月最初のメルマガ発行日に公開予定です。Emergence(道元禅師)***「先日、永平寺に行ったときに道元禅師の言葉が飾ってあった。『修せざれば現れず』修行のことをPracticeと言う。行うことをしなければ、そもそも見えないことがあるのだ。