連載:[完全版]究極のC#プログラミング

Chapter1 C# 3.0らしいプログラミングとは?

川俣 晶
2009/07/31

1.9 まとめ ― プログラマーよ、心してかかれ!

 まとめておこう。

 C# 3.0には、C# 1.xに便利な機能が付いただけと見なす「Better C# 1.x」としての使い方と、クラスを主役から引き下ろしてラムダ式を"あたかも数値や文字列と同じように"湯水のごとく使う「C# 3.0」としての使い方がありうるだろう。

 ここで、前者の使い方が必ずしも誤りではないことに留意していただきたい。たとえば、C# 1.xのソースコード資産をメインテナンスしながら運用するような場合には、無理にコーディングスタイルを変えるよりも、もともとのC# 1.xのスタイルを堅持したほうがスムーズにいくだろう。それは、正当な使い方の1つといえる。

 しかし、それは"1つ"の使い方であって、すべての使い方ではない。もし、「Better C# 1.x」をマスターしたことで「C# 3.0」をマスターしたと思い込むと、恥をかく場合もありうるだろう。それは、かつてBetter CとしてのC++をマスターしたことでC++をマスターしたと思い込んで恥をかいた者たちや、Javaからの類推でC#を理解した気になり、うかつなことを語って恥をかいた者たちと同じ立場に立つことを意味する。

【C#olumn】金のハンマーと銀の弾丸―クラス至上主義

 本書は、「クラスによってすべての機能と構造を作り出すOOP」を、最善にはほど遠い夢想上の"トンデモ"であるとしている。そのように主張する者たちは、技術者ではなく宗教者でしかないと見なしている。つまり、彼らは、問題が解決できるという未来の成就を約束はするが、それを実現してはくれないのである。

 しかし、このことは次の2つの主張を意味するわけではない。

  • クラスを使うことはすべて間違いである
  • すべての問題は、クラス以外の何か(たとえば、ラムダ式)で解決することが最善である

 つまりは、本書で解説するいかなる機能であっても、それを用いればすべてがうまくいくと考えるなら、それは技術者ではなく宗教者の態度でしかない。

 では、宗教者に堕落せず、問題解決能力を持つ技術者であり続けるにはどうすればよいのだろうか?

 ここでは、「金のハンマー」と「銀の弾丸」という2つの言葉を使って説明しよう。

 「金のハンマー」(英語では「Golden Hammer」)は「銀の弾丸」ほど有名ではなく根拠も明確ではないが、非常に的確に問題を示す言葉であるので紹介しておく。「金のハンマー」とは、ハンマーを持つ者にはすべてが釘に見えることを意味する。つまり、「ある手段を持つ者にとって、すべての問題はその手段によって解決すべきものに見える」ということである。つまり、対象が何であろうと自分が持っている道具で問題に対処しようとする態度である。

 一方、「銀の弾丸」とは「銀の弾丸はない」というフレーズで有名だが、これは「すべての問題を完全に解決する万能の手段は存在しない」ことを意味している。

 技術者であることをやめ、宗教者に堕落した者たちが踏み込んだミステークは、この2つを信ずることで特徴付けられている。

 つまり、彼らは、「銀の弾丸」などないにもかかわらず「クラス」が「銀の弾丸」だと錯覚し、「クラス」という「金のハンマー」を手にしたために、目に付いたすべての問題について「クラス以外で解決する方法」が見えなくなったと考えればわかりやすい。

 この問題の中心は、「クラス」ではない。問題なのは、「銀の弾丸」があると確信してしまうことと、「金のハンマー」を手にしてしまうことである。道具は道具と割り切り、その場の状況に応じて複数の道具を使い分けることが重要なのである。決して、道具に魂を奪われてはいけない。あなたが道具に使役されるのでは本末転倒である。道具はあなたが活用すべきものなのだ

 このことは、次のように要約できる。

  • XXを使えばすべてうまくいく、と思ったら負け

 「XX」がクラスであろうとラムダ式であろうと、負けであるのは同じである。

 C# 3.0の価値とは、C# 3.0自身が"すべてうまくいく"道具だという点にはなく、"さまざまな"道具を使えるようにパッケージングされている点にある。本書は、C# 3.0に含まれるさまざまな道具をいかにしてうまく使い分けるかを解説するものである。End of Article


 INDEX
  [完全版]究極のC#プログラミング
  Chapter1 C# 3.0らしいプログラミングとは?
    1.はじめに/本書の位置づけ
    2.1.1 意外性あり? 本書で解説すること/C# 3.0の適用範囲/筆者の来歴
    3.1.2 C# 3.0らしいソースコードとは?
    4.1.3 コードの遅延実行という例
    5.1.4 インターフェースとの比較
    6.1.5 後退するクラスの立場
    7.1.6 クラスベースとプロトタイプベース
    8.1.7 クラスベースの問題点/【C#olumn】クラスの問題とは何か?
    9.1.8 JavaScriptとの相違点
  10.まとめ/【C#olumn】金のハンマーと銀の弾丸―クラス至上主義
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間