連載
|
|
|
■■「シンプルさ」にコミットする演習 ― シンプルに考えるための問題意識■■
さてここで演習だ。 | ||||
演習があるんですか。 | ||||
当たり前だ。実践せずに理論だけでNAgileが身に付くか。 さて問題だ。日付を表すこんなクラスがあるとする(C#)。
まずは演習の課題として、この日付クラスに、日付をチェックする機能を付けてほしい。この日付クラスのコンストラクタのパラメータに、「0年13月32日」のような不正な値が渡されたら例外を投げるようにしてほしいのだ。分かるか? |
||||
はい。 | ||||
やってみてくれ。 | ||||
うー……。 |
||||
だいぶ時間がかかったな。まあいい。見せてみろ。 | ||||
はい。ちゃんと閏(うるう)年まで考慮してみました。
|
||||
なるほど。出来ているようだな。 | ||||
さすが師匠。一目で分かりますか。 | ||||
いや、分からん。 ところで、これはどんなロジックなんだ!? ……うーむ。追加されたコードを見たままいってみるぞ。 これは、
ということをC#で書いたのだな。 |
||||
ええ、まあ、そういうことになりますか。 | ||||
複雑に考えたな。これがお前にとって自然な考え方なのか。これがお前には「分かりやすい」のか。 大体、こんな複雑なコードを書いてしまっては、それが正しいかどうかをどうやって確かめるんだ!? |
||||
えっと、ロジックを目で追って……。 | ||||
そんなので正しいかどうか分かるがやつがいたら、そいつにはテストもデバッグも必要ないな。 |
||||
えっと、じゃあ動かしてみて、実際にいろいろと日付を入れてみて確かめる……。 |
||||
かなりいろいろなパターンについて確かめる必要があるぞ。それを全部手入力か!? それに、コードというのは要求の変化に従ってどんどん変化するものだ。コードが変化するたびにそれをやるのか? 面倒くさすぎだ。 その前に、そもそも「どのように動作するのが正しいのか」という仕様を決めたのか? ……まあ、お前とお前のチーム全員が、「仕様の妥当性が頭の中で判断できて、複雑なロジックも頭の中で考え出せて、それを書いてもバグを出さないし、今後の変化もすべて予測していてそれを盛り込めるスーパー・プログラマー」だったら、これでもよいかもしれんな。 |
||||
それって皮肉ですよね……。 | ||||
もちろんだ。 お前の中の問題意識は多分こうだ。 「どうやって これを「プチ・パラダイム・シフト」させるんだ。
こう考えろ。 「何を作ろうか」(つまり“What”という問題意識) そして「作ると決めたものを作る」んだ。 |
||||
はあ……、そういわれても……。 | ||||
何度でもいう。シンプルに考えろ。 |
■■「シンプルさ」にコミットする演習 ― Dateクラスの仕様を決める「動く設計書」の作成■■
ここでキーになる考え方は「視点の転換」だ。まず何を作るか決めるんだ! ソース・コードを書く前に仕様を決めよう。 それには、NUnitという「クラスの仕様を書くためのツール」を使う。NUnitの使い方は今日は割愛するが(*3)、参考までに挙げておくと、クラス仕様の書き方はこんな具合になる。
|
|||||
なんだか、随分くだけた調子ですね。NUnitというツールを活用するためのDateクラスの仕様を書いたのですね。 |
|||||
そうだ。いいか。お前のものと似ているようだが違う。お前のは“How”だが、これは“What”だ。視点が違う。“How”はDateクラスを作る側の視点だ。“What”はDateクラスを使う側の視点だ。 本来、クラスの仕様、すなわちクラス名やpublicなメソッドの名前やパラメータ、戻り値、例外、それからpublicなプロパティやイベントなどは、この視点で決定すべきなんだ。要するに、クラスが外部に公開するアプリケーション・プログラミング・インターフェイス(API)は、それを使用する側の視点で決める、ということだ。「どんなクラスが必要か?」を考えて、まずは「何を作るか」を決める。 まあ実際には、こんなにクラス仕様を一挙にすべて書いてしまわずに、コーディングしながら少しずつ進めていくのだが、今日は紙面の都合により一気に書いてみた。 |
|||||
「紙面の都合」って何ですか? | |||||
知らん。 これはDateクラスの仕様を決定づける「動く設計書」だ。「検証可能な設計書」といい換えてもいい。なんとNUnitを使うと、この仕様どおりに実際のDateクラスができているかどうか、検証を何度でも自動で行ってくれる。 |
|||||
すごいツールですね。 | |||||
そう思うか。さて、上記のソース・コードから、メソッド名だけを読んでみると次のような具合だ。
|
|||||
なるほど。 | |||||
この「Dateクラスの仕様」がそのまんまNUnitを使ったC#のコードになっているのが、先ほどのソース・コードなのだ。 |
INDEX | ||
NAgileで始める実践アジャイル開発 | ||
第2回 ソフトウェア開発をシンプルにする考え方のコツ | ||
1.“NAgile”って何? どうやる? | ||
2.NAgileにおけるシンプルさの極意“NSimplicity” | ||
3.「シンプルさ」にコミットする演習 ― シンプルに考えるための問題意識 | ||
4.「シンプルさ」にコミットする演習 ― 実際のDateクラスのソース・コードの実装 | ||
5.“Be Agile. That's my attitude.”という心構えを持とう! | ||
「NAgileで始める実践アジャイル開発」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|