勉強法オブジェクト指向の三大要素は継承カプセル化ポリモーフィズムです。中でもポリモーフィズムが最も強力かつ難解な技術と言われています。Rubyの開発者まつもとゆきひろさんも「オブジェクト指向プログラミングを構成するテクニックのうち,ポリモーフィズムは最も重要なものと言えます。MSDNでも「ポリモーフィズムは、オブジェクト指向プログラミングにおいて最も重要な概念であるともいわれています。プログラミングについて)。ポリモーフィズムを理解した時、悟りを開いたかのように「オブジェクト指向ってそういうことかぁ!!」と心から腑に落ちたのを覚えています。ポリモーフィズムの説明として、Animalクラスを継承したCatクラスの鳴くメソッドを呼び出すと「ニャ~」と鳴く、Dogクラスの場合、「ワン」と吠えるみたいなものをよく目にします。何なの?って感じですよね。このような説明では実際のプログラミングにどう使えばいいのかがわかりません。この記事ではもっと実践的な実際に使える例を紹介します。「ポリモーフィズムとは、呼び出す側のコードを共通化する技術である」です。「なんじゃそりゃ?」と思われた方も安心してください。この記事を読み終わるころには「なるほど、そういうことか!」と納得されるはずです。重複のあるサンプルコードを手続き的なやり方とポリモーフィズムを使ったやり方で共通化していきます。そのアプローチの違いを見ることでポリモーフィズムを理解できます。ポリモーフィズムで処理の流れを共通化するポリモーフィズムを使えば手続き型言語の数倍共通化できる!デザインパターンはポリモーフィズムのパターン23個のデザインパターンの内Singleton、Facadeなどを除くほとんどのパターンはポリモーフィズムをどう使うかのパターンです。ポリモーフィズムのパターンも大きく分けて以下の2つに分類できます。Methodパターンを覚えれば、ポリモーフィズムを理解できるんです。おすすめ本は結城浩さんのJava言語で学ぶデザインパターン入門です。私はこの本を読んでポリモーフィズムを悟りました。この本を読めばいいんですけど、けっこう分厚い本なので読むのも大変です。この記事ではコンパクトにエッセンスを凝縮して解説します。この本は分厚いけど、文章が読みやすいので、読むのはそれほど大変ではありません。重複したコードを共通化する方法は多数ありますが、本質的には以下の2つに絞られます。重複したコードをメソッド/関数に切り出して共通化するポリモーフィズムで処理の流れを共通化するあと、もう一つ入れるとすればAOPで前後処理を追加するっていう方法がありますが、今回は省きます。次の2つのプログラムから重複ロジックを抽出して共通化を施してみましょう。{out.close();}}}}↓2つ目がこちら。似ているコードですが、少しだけ違います。コードが重複しています。{out.close();}}}}どちらもファイルを読むファイルの内容を解析する解析結果をファイルに出力するというプログラムです。ファイルオープン/クローズ、例外処理などが重複しています。共通化を施すためのサンプルコードなのでわざと冗長な書き方をしている部分もありますが効果を分かりやすくするための演出なのでJavaをディスる主旨はありません。重複したコードをメソッド/関数に切り出して共通化するまずは多くの人にとってなじみのある手続き型言語的なアプローチで共通化してみましょう。重複したコードをメソッドに切り出します。ファイルをオープン・クローズするコードをメソッドに切り出してみましょう。out;}}FileUtilという共通クラスにメソッドを切り出しました。このクラスを使うようにAppLogAnalyzerとWebLogAnalyzerを書き換えましょう。{out.close();}}}}重複コードが減って多少すっきりしましたが、try-catchのコードが重複しています。手続き型言語的アプローチだとここまでが限界なのですが、オブジェクト指向言語の機能を使って、これらを共通化できないでしょうか?やり方が思いつきませんか?ここでポリモーフィズムの出番なのです。ポリモーフィズムで処理の流れを共通化するJavaでポリモーフィズムを使うためには抽象クラスかインターフェースを使います。このサンプルプログラムの場合、処理の流れに2つのパターンがあります。ファイルを閉じるなんらかの~という部分以外は同じ流れになっていることが分かります。そこでなんらかの処理をする部分を抽象メソッドとして抽出して、共通の処理の流れの中から、抽象メソッドを呼び出すつくりにします。抽象メソッドはサブクラスで実装するのでサブクラスが何かによって、「なんらかの処理」が具体的な処理に決まります。Methodパターンと言います。out);}このFileAnalyzerクラスをAppLogAnalyzerとWebLogAnalyzerに継承させて、抽象メソッド(何らかの処理だったもの)を具体化するために実装します。"weblogAnalyze.txt");}}FileAnalyzerのanalyzeFileメソッドで処理の全体フローを記述しています。フローの中で異なる部分を抽象メソッド呼び出しすることでサブクラスの固有処理に遷移します。このプログラムの場合、全体の流れはいっしょなんだけど、集計ロジックが異なっています。AppLogAnalyzerがエラーと警告の件数をカウントしてるのに対してWebLogAnalyzerは会社情報ページのアクセス数をカウントしています。その固有ロジックを抽象メソッドに切り出しています。手続き型のアプローチだと共通部分をメソッドに切り出していましたが、ポリモーフィズムを使う場合は固有部分を抽象メソッドに切り出します。真逆のアプローチです。これらは補完関係にあるのでどちらが偉いというわけではありません。処理の流れは似ているんだけど一部分だけ違うっていう場合はポリモーフィズムを使って処理の流れを共通化するアプローチが有効です。単純に重複コードがある場合はそれらをメソッドに切り出して使用する手続き型のアプローチが有効です。いわゆるフレームワークというものは必ずポリモーフィズムを使用しています。ライブラリは固有ロジックから呼び出されますが、フレームワークの場合、フレームワークが固有ロジックを呼び出します。呼び出される側のコードを共通化したのがライブラリ呼び出す側のコードを共通化したのがフレームワークなんです。Control、IoC)ってやつなんです。ポリモーフィズムを使えば手続き型言語の数倍共通化できる!いかがだったでしょうか?ポリモーフィズムを使えば、重複ロジックをメソッドに切り出すよりも多くのコードを共通化できることがお分かりいただけたかと思います。AppLogAnalyzerとWebLogAnalyzerを最初のバージョン、手続き型アプローチで共通化を施したバージョン、ポリモーフィズムで共通化を施したバージョンとで見比べてみてください。ポリモーフィズムバージョンのコードは驚くほど短くなっています。AppLogAnalyzerは68行から36行へ、WebLogAnalyzerは64行から33行へと減っています。処理の流れは似ているんだけど一部分だけ違う例外をとらえる処理を共通化したいそんな場合、ポリモーフィズムが効きます。してくれるプログラミングスクールです。最高過ぎですよ!企業の協賛金で運営されいているから無料で受講できるんだそうです。正社員就業率96.2%とのことで、すばらしいシステムですね。30代の方にはプログラマカレッジは20代限定なので30代の方にはゼロスクがおすすめです。35歳以下なら無料で受講できます。全国展開しているので地方の方でも利用できます。自宅で学びたい派ならUdemyという動画講座がおすすめです。時々特別セールがあって驚くほどの低価格で受講できるので、是非チェックしてみてください。つまづいた時に質問したくなったらプログラマー専用の質問サイトteratailで質問すれば教えてもらえます。プログラマー版Yahoo知恵袋って感じのサイトです。エンジニア未経験の人でも利用できる転職エージェントワークポートは未経験の人の転職活動も支援してくれますし、全国の求人を扱っているので地方在住の方にもご利用いただけます。お給料をもらいながら社内研修でプログラミングを学べる会社が狙い目です。(26)プロフィールやまろうと申します。ITエンジニアを十数年やってます。スマホゲームと幅広い分野で仕事をしてきました。そこで培ったエンジニアの本質的な仕事力や転職ノウハウを書いています。プロフィール詳細やまろうのYoutubeチャンネルIT関連のことから人生哲学までざっくばらんに話してます。