良いコ-ドへの道―普通のプログラマのためのステップアップガイド
第4回 コードの分割―その2 2つの方向からの分割― トップダウンとボトムアップ
2つの方向からの分割
それではコードを分割していきましょう! ……でもちょっとだけ待ってください。あと1点だけ。コードの分割のプロセスには,
トップダウン方式
トップダウン方式では,
私は神だ。これからメール送信を行うクラスを創造するぞ。必要なのはメールを送信するMailSenderクラスだ。必要なメソッドは,
MailSender sender = new MailSender();
Map<String,String> params = new HashMap<String,String>();
params.put("name", "太郎");
sender.send("${name}さん,お買い得な情報です。",
"user@example.com", params);
私も神だ。まただまされたな,
だまされてはおらぬ,
MailSender sender = new MailSender("localhost", 22);
いや,
だまされてはおらぬ,
Mail mail = new Mail();
mail.addTo("user1@example.com");
mail.addCc("user2@example.com");
mail.addBcc("user3@example.com");
mail.setBody(""${name}さん,お買い得な情報です。"");
mail.addParam("name", "太郎");
sender.send(mail);
「暇を持て余した神々たちの設計」
トップダウン方式は設計の書籍などでもよく取り上げられますし,
問題は
なお,
- 注4)
- 正確にはテスト駆動開発はリファクタリングやインクリメンタルな手法からボトムアップ的な側面も強いです。ここでは
「使い方から考える」 という面に着目してトップダウン方式に分類しています。 - 注5)
- ここは笑うところです。意味がわからない人は,
「あらびき団神々の遊び」 で検索してください。 - 注6)
- いわゆるYAGNI
(You Aren't Going to Need It) の精神からすると 「事前の大げさな設計は悪である」 という考え方もあります。
ボトムアップ方式
ボトムアップ方式はあとから分割する方式です。
まずはメール送信を行う処理を書いてみよう。
String template = "${name}さん,お買い得な情報です。";
String to = "user@example.com";
Map<String,String> params = new HashMap<String,String>();
params.put("name", "太郎")
...
...(テンプレートの置換処理)
...
// メール送信処理
MimeMessage msg = new MimeMessage(session);
...
// メール送信
Transport.send(msg);
できたー。
アドレスとか変わっても共通で使えるように,
分割してみたー。
String template = "${name}さん,お買い得な情報です。";
String to = "user@example.com";
Map<String,String> params = new HashMap<String,String>();
params.put("name", "太郎")
send(template, to, params);
...
// 抽出されたメール送信メソッド
private void send(String template, String to,
Map<String,Stirng params) {
...
...(テンプレートの置換処理)
...
// メール送信処理
MimeMessage msg = new MimeMessage(session);
...
// メール送信
Transport.send(message);
...
}
ボトムアップ方式は,
実際には,
- 注7)
- 最近はEclipseなどのIDEで,
簡単にリファクタリングができますしね。 - 注8)
- 最低限のAPIができあがるのはテスト駆動開発も同じですね。
バックナンバー
良いコ-ドへの道―普通のプログラマのためのステップアップガイド
- 最終回 配列/コレクションを利用した抽象化―その5 Step4:配列/コレクション化して抽象化する
- 最終回 配列/コレクションを利用した抽象化―その4 Step3:関連のあるデータをオブジェクトに
- 最終回 配列/コレクションを利用した抽象化―その3 Step2:可読性を高めるためのメソッドの抽出
- 最終回 配列/コレクションを利用した抽象化―その2 Step1:ベタなコードで書いてみる
- 最終回 配列/コレクションを利用した抽象化―その1 配列/コレクションって何?
- 第5回 メタプログラミング―Excelを使ったDSLを作ろう―その4 Step3:リフレクションAPIで変換ルールを動的に適用する
- 第5回 メタプログラミング―Excelを使ったDSLを作ろう―その3 Step2:メタ情報をExcelに移動する
- 第5回 メタプログラミング―Excelを使ったDSLを作ろう―その2 Step1:ベタなコードで書いてみる
- 第5回 メタプログラミング―Excelを使ったDSLを作ろう―その1 メタプログラミングとは?
- 第4回 コードの分割―その6 Step4:クラスに分割する