0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyで理解するポリモーフィズムから、Goのインターフェースへ①

Last updated at Posted at 2021-03-18

#何を書くか
私は現在、Go言語の学習に取り組んでいます。
そこで、**「インターフェース」**という概念を学びました。

##何やこれ
正直、教本を読んでも全然なんのこっちゃと言った感じだったので、こちらの記事を覗いてみました。

すると

interface(インターフェース) を利用することで、オブジェクト指向言語でいうところのポリモーフィズムと同様の機能を実現できます。

との説明がありました。ふむふむ。ポリモーフィズムね。

何だそりゃ。

##ということで
Rubyの学習も兼ねて、まずはオブジェクト指向のポリモーフィズムを理解し、それからインターフェースを学習していこうと思います。

一応二部作の予定で書いていきます。
1部目の今回は、ポリモーフィズムについて、自分が調べただけつらつらとお話ししていこうと思います。

#ポリモーフィズムとは
**オブジェクト指向言語(Rubyが持つプログラミング言語が持つ概念的な捉え方)**には、守べき設計方針と呼べるような三大要素が存在します。

「カプセル化、継承、ポリモーフィズム」

の3つです。

まず、ポリモーフィズムは、オブジェクト指向言語を利用する際に、押さえておかないといけない考えであることがわかります。

それでは、なぜポリモーフィズムを守らないといけないのでしょうか。

その前に、まずは、直訳から見ていきましょう。

##ポリモーフィズム(Polymorphism)の直訳
この単語は、二つにわけて考えます。
poly = 「多様な、多くの」
morphism = 「変化」

まとめると、多くの変化、多様な変化と言ったところでしょうか。
より端的な言葉でまとめるために、この記事では**「多様性」**で統一しようと思います。

余談ですが、メタモルフォーゼというものがありましたね。
あれも、変身する時に用いられる宣言だったように、"morphos"には変化みたいな意味があることは間違いなさそうです。

メタモルフォーゼ(ドイツ語: Metamorphose)は変化、変身の意。

##ポリモーフィズムが守られるわけ
さて、ポリモーフィズムは、多様性である。ということが理解できました。
しかし、もちろんこれだけでは、意味がわかりませんので、具体的な例も交えながらポリモーフィズムを理解していきましょう。

例えば、動物を例にとってみましょう。

犬は、「ワン!」と鳴きます。
このことをプログラム化してみましょう。

dog.rb
class dog
  def cry 
    puts "ワン!"
  end
end

こんな感じになるでしょう。

猫はどうでしょう。
同じ「鳴く」という動作は持っていますが、「ニャン」と鳴きます。

このことをプログラム化してみましょう。

cat.rb
class cat
  def cry 
    puts "ニャン"
  end
end

こんな感じになるでしょう。

##共通しているものはまとめようよう、の前に
以上の二つの例を見てもらうと、cryというメソッドが共通していることがわかると思います。
なんとなく、一つにまとめられそうだな、とも考えた方もいるかもしれませんが、ここからがポリモーフィズムの考え方の真骨頂なので落ち着いて考えてください。

先ほど、ポリモーフィズムは多様性であると述べました。
今回も、「鳴く」という行為に、「ワン!」とか「ニャン」とかいう、多様性を見て取ることができました。

このように、**「一つにまとめても、その後の展開によって多様性が担保されそうな状況で、コードをすっきりさせようぜ!という目的で考えるべきなのが、ポリモーフィズム」**です。

まだ、だいぶわかりにくいかもしれないので、実際のコードを元に考えていきましょう。

##プログラミングの特性を利用する

先ほどオブジェクト指向言語の守るべき3ヶ条をあげました。

「カプセル化、継承、ポリモーフィズム」

でしたね。そこで、継承を利用して、先ほどのcryメソッドを継承させる形で記述してみましょう。

animal.rb
class Animal

  attr_accessor :name

  def cry(say="")
    "#{self.name}: #{say}"
  end

end

class Dog < Animal
  def cry(voice='ワン!')
    super #(voice="ワン!")を引数にして、メソッドを呼び出す。
  end
end

class Cat < Animal 
  def cry (voice='ニャン')
    super #(voice="ニャン")を引数にして、メソッドを呼び出す。
  end
end
  


my_dog = Dog.new
my_dog.name = 'ジョン'

your_cat = Cat.new
your_cat.name = 'パトリシア'

my_dog.cry     #=>ジョン: ワン!
your_cat.cry     #→パトリシア: ニャン

という風に、共通していたcryメソッドを、上位のAnimalクラスで宣言しました。このクラスを、Dog, Catそれぞれのクラスが継承し、それぞれ中身を作ってインスタンスを形成できるようにしました。

呼び出されたクラス(Animal)は、呼び出し元(Dog, Cat)で、それぞれに適した振る舞いを行う。
このように

「中に入るものによって同じ関数でも違う処理を行える」というプログラミング言語自体の特徴

そのものを、ポリモーフィズムと呼ぶのです。

##まとめ
####- ポリモーフィズムは、オブジェクト指向の「全てをモノとして捉える」という考え方に必須のものである。
現実のものには、共通する部分が何かしらある。それを多様なものによって用いられるような形でまとめておこう。

####- Rubyでは特に、上位クラスへのメソッド共通化でその特徴が現れる。
共通するところはまとめて、それぞれのオブジェクトに対応できるような(=多様な利用に備えられるような)形でプログラムを生成していこう。

  • コードがきれいにまとまる
  • プログラムの変更に強くなる柔軟性

というメリットにつながる。

以上の事実が、ポリモーフィズムをオブジェクト指向が3ヶ条に据えるわけなんだと思います。

##最後に
最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ!」というご意見、「そこどうなっているの?」というご質問など、お待ちしております。

##参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?