【Ruby入門】クラスとオブジェクト
  • facebookページ
  • twitterページ
  • 2017.12.18

    【Ruby入門】クラスとオブジェクト

    ここ最近のプログラム言語を習得する上で避けて通れない、クラスとは何かを解説します。

    クラス、さらにオブジェクト指向まで解説すると、本が1冊書けてしまいます。

    プログラム言語の本を読み進めてつまずくポイントは、クラスやオブジェクトともいえます。

    しかしプログラミングで必要なレベルのクラスの知識を習得するのは、そう大変ではありません。

    巷ではクラスはたい焼きの型、オブジェクトはたい焼きといったたぐいの「行き過ぎた比喩」が横行しています。

    そもそもプログラミングとはまったく関係のないたとえ話で解説すること自体に無理があります。たとえ話を理解したところで本筋の理解にはつながりません。

    そのような解説を読んで理解しようとして、プログラムと結びつけて考えることができず、何がなんだか分からないうちに挫折したという方も多いのではないでしょうか?

    本記事ではRubyを使う上で最低限の知識にとどめて解説をします。

    最初はコードを使いません。Ruby特有の知識も避けて解説します。

    挫折した方も、ぜひ再チャレンジしてください!

    ちなみに書籍の解説では、たい焼きやたこ焼きのいずれかを使った解説が多いです。筆者の好みや出身(関東?関西?)が関係しているのでしょうか・・・

    さらに余談ですが、オブジェクト指向を理解できた方が、理解していない方から「クラスってなんですか?」という質問を受けると「そうだな、いってみればたい焼きの型とたい焼きだな。つまり・・・」と答えるようになるのは不思議です。

    クラスとは何か?

    クラスとは、メソッドや変数を寄せ集めたもので、そこからオブジェクトを生成し・・・という話は置いておきましょう。

    ざっくりいうと、今の段階ではパーツの寄せ集めという理解で結構です。

    分かりにくい解説に共通しているのは、クラス(というよりオブジェクト指向は、といった方が良いかも知れませんが)には、以下の2つの側面があることを説明していないからです。

    • 開発の側面
    • 設計の側面

    順に解説していきます。

    開発の側面

    (文中ではメソッドという用語を使いますが、難しければ今のところは「関数」と置き換えてください)

    プログラミングにおいて変数やメソッドを宣言し、さらにそれらを複数のメソッドで共有するというのは普通にありますよね。

    変数とメソッドがひとまとまりになっていれば、重複して宣言することがないので便利です。

    そのまとまりがクラスです。

    ある特定の操作に関わる変数やメソッドを1つのクラスにまとめる、ということがよく行われます。

    今まで出てきたクラスとして「Stringクラス」があります。Stringクラスには文字数をカウントしたり、大文字にしたり・・・という操作(メソッド)がまとめられています。

    それらを私たちは簡単に使える、ということです。

    例えば、文字列変数strの長さを調べるときには、「str.length」として簡単に呼び出せましたよね。

    もう1つ、フレームワークを使うときもクラスを強く意識します。

    Webシステム開発において、Ruby on RailsやLaravel、Springといったフレームワークを使うのが普通です。

    フレームワークが基本部分(例えばデータベースへのアクセスやHTMLのレンダリングなど)をクラスとして提供していて、プログラマは各システムの固有の部分のみをコーディングする、といったことがよくあります。

    よく聞かれるのは、共通関数で良いのでは?という意見です。

    しかし共通関数とクラスとはまったく異なります。処理をまとめるというくらいしか同じ点はありません。

    共通関数とのちがいは、後ほど解説します。

    設計の側面

    次に設計の側面です。

    図書館の書籍管理を例にして考えましょう。

    1冊の本には、だいたい以下のような属性(プロパティ)が存在します。

     

    • No.
    • タイトル
    • 著者
    • 出版社
    • 出版年月日
    • ページ数

     

    書籍管理でいうとあとは冊数や貸し出し中の数、といったところでしょうか。

    では、これをプログラムで管理するとしましょう。

    はい、1冊目。

     

    • No.1
    • タイトル:Ruby入門
    • 著者:honda
    • 出版社:株式会社ポテパン
    • 出版年月日:2017年12月1日
    • ページ数:200

     

    次に2冊目。

     

    • No.2
    • タイトル:PHP入門
    • 著者:ポテパンライター2
    • 出版社:株式会社ポテパン
    • 出版年月日:2017年12月10日
    • ページ数:150

     

    そして3冊目・・・と続きます。

    これをすべて変数で宣言する、というのは非現実的です。図書館なら蔵書数が何万になるのが普通です。ということは、上記の属性×蔵書数の変数・・・気が遠くなりそうです。

    それを回避するために、こんなことをしてはどうでしょうか?

     

    • すべての本に共通する属性を「型」としてまとめる
    • 使うたびに型を実体化する

     

    では型から実体の本を作成してみましょう。

    まずはNo.1の本のみ、図にしてみます。

    この調子で、複数の本を扱ってみましょう。

    これだと、あつかう本の数だけ実体化できるので便利ですよね。

    必要な分だけ実体化して使えばよいわけで、変数地獄に陥ることもありません。

    すでに図で出てきましたが、この「型」がまさしくクラスというわけです。

    これも図で出てきましたが、実体化したモノを「インスタンス」といい、実体する行為を「インスタンス化」といいます。

    インスタンス化できることが、クラスと共通関数の大きな違いですよね。

    プログラム設計ではこの話とは逆、つまり実在するモノから共通点を抽出しクラスを定義します。これを「汎化」といいます。

    もうちょっとクラスを拡張(メソッド)

    どうせだったら、クラスに関数を追加しましょう。

    Bookクラスに本ごとの貸出可能数を得る関数があれば便利ですよね。

        

    クラスをインスタンス化すれば、本ごとの貸出可能数を得ることができます。

    インスタンスに紐付いた関数を「メソッド」といいます。

    先に述べた関数とメソッドはちがうという理由はここにあります。

    関数は単独で存在するもので、メソッドはインスタンスに紐づくものです。

    ゲッターセッターアクセサーにカプセル化

    インスタンスの中にある変数に直接アクセスするのは、いろいろと問題があります。

    例えば以下のような例です。

        

    実際の貸出可能数以上に貸出を受け付けてしまい、貸出できません。

    よって、変数にアクセスするためのメソッドを用意し、そのメソッド経由でアクセスするのが普通です。

    さらにそのメソッドに、妥当でない数値が入って来ればエラーとして遮断する、という機能をそなえると安心です。

    このように、変数にアクセスするためのメソッドをアクセサーといいます。

    言語によっては、変数から値を得るメソッドをゲッター(getter)、変数に値をセットするメソッドをセッター(setter)と呼びます。

    アクセサーを関所とし、外部からのアクセスを遮断し、値と手続き(メソッド)をひとまとめにすることをカプセル化といいます。

    まとめ

    クラスとオブジェクトについて、ほんの入口だけですが解説しました。

    いきなりすべてを理解しようとせず、今のところはこれで十分です。

    なんとなく、分かったような分からないような、という感じではないでしょうか?

    今後、実際にプログラムで解説していきます。

    プログラムをみると、より理解が進むはずです。

    めげずに、次に進んでくださいね!


    他のRuby入門記事はこちら

    【Ruby入門】Rubyとは何か?学習方法や将来性まで考えました!

    【Ruby入門】Ruby on Railsをやってみよう!

    【Ruby入門】環境構築(Mac/Win)

    【Ruby入門】nokogiriでスクレイピング

    【Ruby入門】データベース

    【Ruby入門】gemとライブラリ

    【Ruby入門】エラーと例外処理

    【Ruby入門】モジュール(module)とMix-in

    【Ruby入門】Procクラスとラムダ(lambda)

    【Ruby入門】ブロック

    【Ruby入門】メソッド

    【Ruby入門】クラスをコーディング(2) オブジェクト指向

    【Ruby入門】クラスをコーディング(1) classを作る

    【Ruby入門】クラスの継承、オーバーライド

    【Ruby入門】クラスとオブジェクト

    【Ruby入門】ディレクトリ(フォルダ)の作成、削除

    【Ruby入門】ファイルの移動、コピー、削除

    【Ruby入門】入力と出力

    【Ruby入門】Rubyの正規表現

    【Ruby入門】正規表現で置換する

    【Ruby入門】正規表現とは何か?

    【Ruby入門】文字列の結合などの操作

    【Ruby入門】CSVの基本と操作

    【Ruby入門】JSONの基本と操作

    【Ruby入門】乱数(Random)などの数値計算用クラスや端数処理

    【Ruby入門】日付の基本と操作(Time, Date)

    【Ruby入門】数値の数え上げ「upto」と四捨五入

    【Ruby入門】文字列の標準ライブラリnkfとヒアドキュメント

    【Ruby入門】数値の基本とメソッド (timesメソッド他)

    【Ruby入門】ハッシュ(hash)をeachで取り出す!その他ハッシュの応用に

    【Ruby入門】ハッシュ(hash)とシンボルの基本

    【Ruby入門】文字列の基本と表示メソッド

    【Ruby入門】Rubyの繰り返しを極める!様々な繰り返しのバリエーション

    【Ruby入門】最初はこれだけ!まずは手を動かしたい人のRuby入門

    【Ruby入門】ifとelseについて

    【Ruby入門】配列と操作(基本編)

    【Ruby入門】eachメソッドの使い方と応用例


    ポテパンが提供するサービスについて

    本メディア「ポテパンスタイル」を運営する株式会社ポテパンは、エンジニアキャリア領域で複数サービスを提供しています。

    ポテパンフリーランス

    ポテパンフリーランス

    フリーランスエンジニアの方に高単価案件をご紹介しております。弊社ではフリーランス案件を常時300件ほど保有しており、その中からあなたに適した案件をご案内いたします。また、これから独立してフリーランスになる方の無料個別相談も承っております。フリーランスになった後の案件獲得方法やお金面(税金や保険など)についてお答えいたします!

    ポテパンキャリア

    ポテパンキャリア

    エンジニア職専門の転職エージェントです。ポテパンキャリアでは、技術のわかるエージェントがあなたの転職をサポートします。エージェント自身がエンジニアなので、あなたと同じ目線で仕事内容や今後のキャリアについて一緒に考えることができます。

    ポテパンキャンプ

    ポテパンキャンプ

    ポテパンキャンプでは、RubyにてゼロからオリジナルのECサイトを作り上げてる3ヶ月間の実践型カリキュラムを提供しております。すでに本スクールの卒業生は、エンジニア職として様々な企業様に就職しております。なお、本スクールは受講料10万円と他社スクールに比べ格安となっており、またポテパンからご紹介させていただいた企業へ就職が決まった場合は、全額キャッシュバックいたします。



    株式会社ポテパンは、企業とエンジニアの最適なマッチングを追求しています。気になるサービスがあれば、ぜひ覗いてみてください!

    ポテキャンバナー ポテキャリバナー

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア

    関連ワード

    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE