OOとは
はじめに
実際にやっていない状態で、学んだ知識たちって定着できてない、、
今見返すと理解できる!説明できそう!なことをもう少し広い範囲で復習していってます。
オブジェクト指向とは?
オブジェクト指向プログラミング(Object-Oriented、OO)とは?
一連の処理に使う「変数」や「関数」をひとまとめにして
利用できるように名前をつけてテンプレ化しておこう!という考え方。
なぜオブジェクト思考が必要なのか?
同じような処理をなん度も書くのはめんどくさいから!
一度書いたプログラムをテンプレ化しておくことができ、
それを再利用することで、次はより少ないコードで実現できるメリットがある。
使わなくても別に問題はないが、使えばより便利になる技術。
良いコードを書くことがオブジェクト指向につながる!
関数とは何が違うんだ?
関数とは再利用できそうな処理を関数として定義しておくことで、
次からはその関数を呼び出すだけで処理を行なってくれる便利な仕組み。
関数は、あくまで1つの処理を行なってくれるものでしかありません!
実際のプログラムでは、1つの処理だけでなく色々なデータを準備したり、
いくつもの処理手順を行うことがあり、それら一連の処理セットが色々な場所で再利用されるような場合もあります。
処理に必要な変数や関数を煩雑に管理するのではなく、
ある「役割」を行う「物(オブジェクト)」として名前をつけて定義しておこう。
そうすれば再利用しやすい!というプログラミング手法が「オブジェクト志向」
クラスとインスタンス
定義されたテンプレのことを「クラス」
クラスには、処理に必要な「データ(変数)群」と「処理(関数)群」が含まれます。
クラスの中では、それぞれ「プロパティ(変数)」「メソッド(関数)」と呼ばれます。
クラスはあくまでテンプレート!
このテンプレを元にして、実際のデータをセットしたものを作成する形になります!
これをインスタンスと言います。
金型(クラス)を元に、製品(インスタンス)を作るようなイメージです!
オブジェクト指向のメリット
オブジェクト指向とは、単純な関数とは異なり
必要な「データ」や「処理」をひとまとめにして管理できるというメリットがあります。
オブジェクトとしてひとまとめに管理されているため、
このオブジェクト自体を変数として丸ごと持ち運んだりといった扱い方も可能!
オブジェクト指向の三原則
カプセル化
データ(オブジェクトの属性)とそれに関連するメソッドを一緒に束ねること。
外部から直接データにアクセスできないようにして、不適切な変更を防ぐための重要な技術です。
継承
新しいクラスが既存のクラスの属性とメソッドを継承できる概念。
これにより、一般的なクラスからより特殊化したクラスを作成でき、コードの再利用性を高めます。
ポリモーフィズム
異なるクラスのオブジェクトが同じインターフェースまたはメソッドを共有できる概念。
これにより、同じ名前のメソッドが異なるオブジェクトに対して異なる動作を行うことが可能となります。
抽象化
複雑なシステムを単純な公開インターフェースを通じて操作できるようにする概念。
これにより、プログラマーは詳細を気にせずに問題解決に専念できます。
Rubyは純粋なオブジェクト指向プログラミング言語であり、
その全ての値(数値や文字列など)がオブジェクトとして扱われます。
Rubyではこれらの特性を活用して、コードの構造化、再利用、保守性の向上などを目指します。
例えば、犬をモデル化したいと考えてみましょう。
犬は名前と年齢を持ち、特定の行動(たとえば吠える)ができます。
これをOOPの視点から見ると、犬は一つの「オブジェクト」であり、
名前と年齢は「属性」、吠える行動は「メソッド」となります。
class Dog
def initialize(name, age)
@name = name
@age = age
end
def bark
puts "#{@name} says woof!"
end
end
他は何がある?
プログラミング言語はその特性や設計哲学によって様々な分類をされます!
手続き型プログラミング
このタイプの言語は、プログラムの状態を変更する一連の手続き(手順や操作)で考えます。
手続き型プログラミングではプログラムがどのように動くべきかを記述します。
C言語やPascalはこのタイプに分類されます。
オブジェクト指向プログラミング
オブジェクト指向プログラミング言語では、プログラムをオブジェクトという単位で管理し、
そのオブジェクト間のインタラクションによって全体の動作を組み立てます。
RubyやJava、Pythonなどがこれに分類されます。
関数型プログラミング
関数型プログラミング言語では、計算を数学的な関数の評価としてモデル化します。
HaskellやErlang、そして一部のJavaScriptやPythonの機能などがこのタイプに含まれます。
これらのカテゴリは相互に排他的なものではなく、多くの言語は複数の特性を持ち、
特定の課題を解決するためのツールとして利用されます!
たとえば、PythonやJavaScriptはオブジェクト指向と関数型の両方の特性を持っています。
また、最近の言語では、これらの異なるパラダイムを組み合わせて、
より効果的なプログラミングスタイルを提供しています👀
Discussion