特集
私がJavaからC#に乗り換えた10の理由
日本ユニシス 尾島 良司 |
|
|
私が思うC#の“正しい”使い方
前項で挙げた10の乗り換え理由は、C#の設計思想が表面に表れた結果だと考える。私は、個々の機能が気に入ったからC#に乗り換えたわけではない。前項ではC#の観点からJavaを批判したが、実はこれは正しい行為ではない。C#とJavaの設計思想は異なるのだ。異なる思想のものを自分の思想で批判すれば、相手の方が劣るという結論が出るに決まっている。
そう、私はC#の底に流れる設計思想が自分のし好にマッチしたから乗り換えたのだ。本項では、前項で述べた項目を基にC#の設計思想を推測し、C#の“正しい”使い方について考察する。道具は設計思想に沿って使わなければ真価を発揮できない。私は、設計思想に沿った使い方こそが“正しい”使い方だと考える。
さて、私が思うに、C#の設計思想とは「実行効率の重視」と「実装効率の重視」そして誤解を恐れず書くなら「オブジェクト指向の軽視」である。以下にそれぞれについて簡単に述べて本稿を終わりとしよう。
■実行効率の重視
struct、property、virtualとoverrideでは、実行効率が重視されていた。C#では、実行効率を向上させるための手段が豊富に用意され、実行効率とオブジェクト指向の選択となった場合には実行効率を選択している。われわれも実行効率を念頭に置いてプログラミングすべきだろう。
以下に、どのようなプログラミングをすればよいのか、具体例を挙げる。
インターフェイスとクラスであれば、特別なメリットがない限りはクラスを中心に考えてよいだろう。.NET Frameworkクラス・ライブラリには、クラス中心の名前空間(ex. System)と、インターフェイス中心の名前空間(ex. System.Collections)がある。.NET FrameworkではインターフェイスにはIをプレフィックスに付けるという命名規約があるので、名前を見ればどれがインターフェイスかはすぐに分かる。リファレンスを見るとインターフェイスが少ないことに驚くだろう。
staticなメソッドを使って構造化プログラミングするのも“あり”だろう。オブジェクト指向は道具であり、万能な道具などは存在しない。オブジェクト指向が向かないような部分であれば、staticなメソッドを使ってオブジェクト指向とは無縁にプログラミングしてもよいだろう。
if文やswitch文を多用するより、インターフェイスとポリモルフィズムを使用する方式が望ましいだろう。ポリモルフィズムの方が、ifやswitchよりも実行効率がよいためだ。有効な場所で使わないのであれば、オブジェクト指向という道具がある意味がない。
C#でプログラミングする際に重要なのは、実行効率を常に念頭に置くということである。われわれは、原理や理念だけであるべき姿を導くのではなく、実際に得られるメリットを基準に実装方式を選択しなければならないのである。
■実装効率の重視
delegate、property、custom attribute、thread、interface、#if、Visual Studio .NETでは、実装効率が重視されていた。実装効率を向上させるためなら、あらゆる手段を選択する。これがC#の基本姿勢だといってよいだろう。われわれはこれらの手段を最大限に活用するように自分を律するべきだろう。
以下に、どのようなプログラミングをすればよいのか、具体例を挙げる。
-
デリゲートで済む場合にはインターフェイスを作らない。インターフェイスが必要となるのは複数のメソッドがコンテキストを共有する場合だけである。設計によって単体のメソッドで済むようにできる場合は多い。そのような場合にメソッドを1つしか持たないインターフェイスを使う必要はない。
-
ミドルウェアやフレームワークを作成する場合には、積極的にカスタム属性を用いるべきであろう。オブジェクト指向には、継承関係のないクラス群に機能を追加することはできないという問題がある。この問題を解決するためには「アスペクト指向」が必要だ。しかし、現在のアスペクト指向環境はまだ使い勝手に難がある。カスタム属性を使用するなら、アスペクトの追加はできないしWeaving(アスペクトを挿入)可能なポイントは限られてしまうが、実用には十分なだけの柔軟性を得ることが可能なのである。
-
もちろんオブジェクト指向で実装の効率を向上させるというのも“あり”だ。オブジェクト指向は実装の効率を向上させる。ifやswitchを書くよりポリモルフィズムを使用した方がコード量を減らせる。ライブラリをクラスとして提供すれば、利用者側はコンテキストを保守する作業から解放される。
C#でプログラミングする際に重要なのは、道具を限定しないことだ。実装効率を向上させる道具があるなら、それがどんなものであっても使う。われわれはさまざまな技術を習得し、局面ごとに最適な解を選択していかなければならないのだ。
■オブジェクト指向の軽視
struct、delegate、property、custom attribute、thread、interface、virtualとoverrideは、オブジェクト指向を軽視した結果であると考える。
誤解しないでほしい。C#はオブジェクト指向ではないといっているわけではない。実際、C#でJavaと同程度にきれいにオブジェクト指向を採用したコードを作れる。C#ではオブジェクト指向以外の方式も積極的に採用しているので、相対的にオブジェクト指向の地位が下がっているといいたいのである。
C#においては、オブジェクト指向は道具の1つでしかない。structは詰まるところ構造体で、オブジェクト指向で取り扱うことは難しい。オブジェクト指向をいくら拡大解釈してもデリゲートは導けない。.NET Frameworkクラス・ライブラリのADO.NETはデータをオブジェクト指向で扱わないで2次元の表として扱う。
重要なことは、手段と目的を混同しないということだ。オブジェクト指向は手段であって目的ではない。われわれは、オブジェクト指向が有効な場合には積極的に活用し、そうでない場合には別の手段を採用するだけの柔軟性を身に付けなければならないのである。
INDEX | ||
[特集]私がJavaからC#に乗り換えた10の理由 | ||
1.struct、delegate | ||
2.property、custom attribute、thread | ||
3.interface、virtualとoverride、#if、Visual Studio .NET、Javaが嫌になった | ||
4.私が思うC#の“正しい”使い方 | ||
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|