🐙

改めて 型 と オブジェクト指向 について考えてみる(例:C#)

2023/02/24に公開

目次

型の全体像

型やクラスは、人によってあいまいな言葉の定義で使われている。
これが型やクラスを分かりにくく理解しにくくしているように思う。

よって下記になるべく整理した全体像を図解した。
「すべては型であり、すべてはObjectである」という前提から、型の種類が諸々分岐していく。
最終的に個別具体的な設計図としての型の定義に行きつき、インスタンス化して使用される。

ちなみにクラスというものは、参照型で設計されている型の種類のことである。
同じ階層の比較として、値型で設計されている型の種類があり、こちらは構造体、列挙型がある。
型=クラスではない。あくまで public class Hogehoge{} のように classキーワードで宣言された型がクラスである。
(と定義するのが最も整理しやすかった。)

オブジェクト指向とオブジェクト

C# はオブジェクト指向という考えを基にして設計されている言語である。
オブジェクトとは、「データ」と「手続き」を一つのまとまりとして考え、一体化したものである。なんとも抽象的な概念である。

例えば、従業員というものをオブジェクト指向で考えてみる。
先ほどの考えを参照すると、「従業員のデータ」と「従業員の手続き」をひとまとまりにして、一体化したものが「従業員オブジェクト」である。

従業員のデータとはどんなものがあるか。

  • 従業員番号
  • 名前
  • 所属部署
  • 雇用日
  • 基本給
    などがある。

従業員の手続きとはどんなものがあるか

  • 従業員情報を表示する手続き
  • 1月の給与を計算する手続き
  • 勤務日数を計算する手続き
  • 残業手当の計算をする手続き
  • 保険料を計算する手続き
    などが考えられる。

このように、データと手続きをひとまとまりにしたものが、従業員オブジェクトである。
だから何だよという話ではあるが、こういうまとまりにしておくことで、システム開発をする場合に便利ということである。
具体的には、従業員に関わるデータを使ったり、従業員に関わる手続きをしたい場合は、すべてこのオブジェクトを参照すればいいということが確定する。

実際のオブジェクトのサンプル

実際にC#上でのオブジェクトのサンプルを見てみる、

Objectオブジェクト(ややこしい)

実際に.NET Framework 上に定義されているObjectオブジェクトの定義が下記。
こちらは手続きのみが用意されており、データは存在していない。
Object型はすべての型の大元であるので、すべての型に共通の手続きが入っている。

ToString()などは、文字に変換するという手続きであり、継承によりすべてのオブジェクトがこの手続きを持つ。

Int32オブジェクト

Objectオブジェクトと同様に.NET Framework 上に定義されている Int32オブジェクトの定義が下記。
こちらはデータと手続きがどちらも用意されている。
数値に関するデータと数値に関わる手続きが用意されている。

従業員オブジェクトを定義してみる

.NET Framework 上には定義されていないが、システム開発をする上で用意したいオブジェクトは自分で用意する。
先ほどの例で出した従業員オブジェクトを作成してみる。

  public class Employee
  {
    // -----データ(プロパティ)-----
    public int EmployeeId { get; set; } // 従業員番号
    public string Name { get; set; } // 氏名
    public string Department { get; set; } // 所属部署
    public DateTime HireDate { get; set; } // 雇用日
    public int BaseSalary { get; set; } // 基本給

    // -----手続き(メソッド)-----
    // 従業員の情報を表示する
    public void DisplayInfo()
    {
    }
    // 給与を計算する
    public int CalculateSalary()
    {
    }
    // 勤務日数を計算する
    public int GetWorkDays(DateTime startDate, DateTime endDate)
    {
    }
  }

データと手続きを言い換える

データと手続きをまとめたものをオブジェクトと表現すると行った。
しかし実際のプログラミングでは、別名で言い換える。

データとは、プロパティ(属性)であり、
手続きとは、メソッド(関数)である。

専門用語として利用されるので本来の意味を忘れがちになるが、本質は「データ」と「手続き」である。

まとめ

オブジェクト指向プログラミングでは、オブジェクトというまとまりを作って開発をしていく。
すでにフレームワークに用意されているオブジェクトを使ったり、自作のオブジェクトを定義して使ったりする。
オブジェクトの中には、データと手続きがあり、これらを使うことで実際のシステム動作が実装される。

様々な型が存在しており、それをうまく使って開発をする(ざっくり)。

Discussion