InfoQ

News

プライベートメソッド、テスト駆動開発と優れたデザイン

作者 Amr Elssamadisy, 翻訳者 編集部 投稿日 2008年1月10日 午前6時16分

コミュニティ
Agile
トピック
ユニットテスト,
Object Oriented Design
タグ
TDD

テスト駆動の開発(TDD)が優れたデザインを促進するという主張が成された。TDDがアーキテクチャとデザインに悪影響を及ぼすという主張も成された。 抽象性を論じるよりもそれは少し具体性を加えるので私達はプライベートメソッドと優れたデザインとテスト容易性とその関係性に重点を置くことにした。明らかな矛盾の一例である。

Szczepan Faber氏はプライベートメソッドが非パターンである(source)とブログに書いた。

プライベートメソッドの匂いはTDDの誕生と共に発火するように見えました。テスト病にかかった人々は彼らのプライベートメソッドをどのようにテストしたら良いか知りたがったのです。やれやれ・・・それはそんなに簡単な事ではなくその疑問は”どのように”から”なぜ”に発展しました。プライベートメソッドをテストする目的は何でしょうか?ほとんどのテストドリブンデベロッパたちは即座に答えるでしょう。やめておきなさい。(source)それでもまたTDDは私達がソ フトウェアを作る方法を変え、またプライベートメソッドを再評価したのです。:)

Jay Fields氏はRubyにおいてプライベートメソッドをテストする一般的な方法(source)をブログに記載した。

・・・私はプライベートメソッドをめったにテストしません。パブリックAPIを通してテストするのを好みます。しかしながらプライベートメソッド用にテストをいくつか書くのであればもっと生活が楽になる場合があるのです。

Michael Feathers氏はThe Deep Synersy Between Testability and Good Design(source)においてTDDが優れたデザインを促進し、また反対にテスト不可能なコードには再考の余地があることを提示した。

テストを書くとき、またプライベートメソッドをテストする衝動を感じた時、私はそれをヒントと受け取ります。そのヒントは私のクラスが非常にカプセル化されているのでそ、のパブリックインターフェースによって”理解不能”になるように終わっている事を教えてくれます。私はそのヒントに耳を傾けデザインを異なったやり方でファクターするのです。通常私はプライベートメソッドが非プライベートになることが可能で、テストにアクセス可能な新たなクラスにそれ(と可能性 としてその周りのメソッド)を動かすことに終わります。

上記の概念は全てプライベートメソッドを阻止する傾向にあり、またテスト容易性に重点を置いている。しかしながらその課題における言葉はそれだけではなかった。実際のところオブジェクト指向のデザインについて書かれたもののほとんどが最大限のカプセル化とより少数のクラスを後押しするものであった。パブリックAPI内で絶対最小値を表示することのみによって結合が最小限化されるのである。Ojject Thinking(サイト・英語)のDavid West氏はオブジェクト指向のソフトウェア測定基準(source)におけるLorenz氏とKidd氏の文章を引用している。

  • アプリケーションは40の階、100以内のクラスで構成されるべきである
  • アプリケーションの全体的なビジネスドメインは1000以上のクラスを要するべきではない
  • コードの25-30%は反復ごとに捨てられるべきである
  • クラスごとの責任:平均7
  • クラスごとのメソッド:平均12
  • メソッドごとのコードライン:15
  • コメントを要するコードラインの%:60
  • ケースステートメントの数:平均 0

もしプライベートメソッドがそれらのクラスに引き出される必要があるのなら、私達はテストを簡単にするためだけにアプリケーション内のクラスの数を増やすのではないだろうか?そうすることによってすばやく非常に大数のクラスがもたらされるのである。

プライベートメソッドはどうだろうか?それをテストするのは厄介なのである。プライベートメソッドを変更してテスト用にそれを表示するだろう?プライベートメソッドをテストするのをやめ、デザインをテスト容易性から独立させた状態を保つだろうか?それともプライベートメソッドがあやしいのだろうか-クラスのインディケーションはやりすぎなのだろうか?

原文はこちらです:http://www.infoq.com/news/2008/01/private-methods-tdd-design

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

ジャンル別一覧

BlazeDSとAMFでWebとデスクトップのアプリケーションを構築する

現在のRIAアーキテクチャにおいて、クライアント/サーバーの通信は重要な位置を占めています。本稿では、James WardとShashank TiwariがアドビによるオープンソースのBlazeDSメッセージングサーバーの世界へ飛び込みます。

業務ソフトに手を加えずに暗号化を実現する~秘文の挑戦~

hibun

ウィルス対策ソフトや情報漏えい防止用のソフトは、いわば影の存在です。ユーザの操作性やGUIを工夫する以上に、いかに目立たない存在となるかにその技術を注ぎ込んでいます。ここでは日立ソフトが開発した「秘文」の事例を紹介します。

Google Chartとgchartrbの紹介

Google Chartは、チャートを作成するためのWebサービスです。本稿では、Google Chartのインターフェースと、Rubyコードから簡単にチャートを生成することができるgchartrbライブラリの説明をします。

SOAを超えて: 動的な業務アプリケーションのための新しいエンタープライズアーキテクチャフレームワーク

全二回からなるこの記事では、ダイナミックビジネスアプリケーション(Dynamic Business Applications:DBAs)の開発についての全体的な眺望を、アーキテクチャと方法論の観点から見ていくことになります。我々のゴールは、「ビジネスの変化や、その他に必要とされる変更に対して、いかにして容易に適応できるアプリケーションを構築していくか」を導きだすことです。

ESB接続形態のオルタナティブ

本稿では、Adrien Louis氏がESBベースのSOAに対する2つの接続形態についての賛否について説明しています。その2つとは、会社での単一のESB対「部門毎」に相互接続するESBによるシステムです。

AjaxプログラマのためのJavaOne2008 -GrizzlyでComet!-

誕生から2年を経てCometは「何が出来るのか」という議論から、「いかに実現するか」という議論に関心が移ってきたように見えます。そこで本稿では同じくJavaOneで数多く取り上げられたNetBeans 6.1とGlassFish v3を使いながら、サンプルを交えてCometを解説していく事にします。

SharePoint Webサービスを始めましょう

この記事では、WSS3とMOSS 2007に難しい設定など一切せず、すぐに利用可能なWebサービスと、Javaと.NETからそのWebサービスを消費する方法に目を向けます。

レトロスペクティブのプライムディレクティブに対する問い

この記事の始まりは、知的で思慮深い人たちの魅力的なグループが食事会を終えて話をしているところです。話はレトロスペクティブ(振り返り)プロセスの要であるプライムディレクティブ(最初の指示)に及んでいます。