🏀

オブジェクト指向(OOP)における見方解釈

に公開

はじめに

オブジェクト指向はプログラム初学者にとって理解が難しい概念と思います。実際、私もプログラムの勉強開始当時は、オブジェクト指向がまったく理解できずにおりました。よく見かける例では、動物クラスや犬クラス、猫クラス、などに例えられて説明している記事を見かけます。ですが、当時は1ミリも理解できませんでした。といいますか、オブジェクト指向って必要ですか?とさえ感じてました。なんなら今でも曖昧なまま進めている節さえあります。
そんななか、一気に点と点がつながるような、しっくりきたオブジェクト指向の説明がありますので、それをベースにして私の見方解釈を紹介できればと考えます。

想定読者

  • オブジェクト指向プログラミング初学者

環境

.NET C#をベースに記載します。

オブジェクト指向とは

オブジェクト指向とは、プログラムを設計・構築する際の考え方で、現実世界の事物を「オブジェクト」としてモデル化し、そのオブジェクト同士のやり取りを通じてシステムを構築する方法です。オブジェクトは、データ(属性)とそれに関連する処理(メソッド)をまとめたもので、プログラムの部品として再利用や拡張が容易になります。

(AI検索引用)

上記、いまはなんとなくでもわかりますけど、当時は本当にわかりませんでした。

見方解釈概念図

オブジェクト指向を使用しないプログラムの見方

プログラムの処理を上から下へ、順番に処理実行していくだけ、というイメージです。

オブジェクト指向を使用するプログラムの見方

もちろんながらプログラムの処理は上から下へ処理されますが、プログラムの処理を行っていく中で、オブジェクトはメモリ上に作られたり消えたりしながら一緒に流れていくイメージです。
私の乱暴な解釈を記載させてていただきますと、
オブジェクト自体が一種の変数であり、その変数オブジェクトにふるまい(メソッド処理など)をクラスで定義できる、という説明が一番しっくりきています。

具体例

完全無欠のBlazorの初期サンプルプログラムで恐縮ですが、以下を例にコメントを加えて説明とします。
要点だけ言ってしまうと、データ1レコードを一つのオブジェクトとして見るべし!、という話です。

Weather.razor
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates fetching data from the server.</p>
@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th>Temp. (C)</th>
                <th>Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                @*ここで1つのforecastオブジェクトを1行表示する*@
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}

@code {
    private WeatherForecast[]? forecasts;

    //ページ(コンポーネント)の初期化時に実行されるメソッド
    protected override async Task OnInitializedAsync()
    {
        // 上記図でいうプログラム処理の流れの部分

        // weather.jsonからWeatherForecastオブジェクトの配列として取得する。
        // weather.jsonには、WeatherForecastクラスの各メンバー変数に格納される値が記載されている。
        // WeatherForecastがインスタンス化され、複数のオブジェクトがforecastsの配列に格納される。
        forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json");

        // 1つのWeatherForecastをインスタンス化します。
        var newForecast = new WeatherForecast
        {
            Date = DateOnly.FromDateTime(DateTime.Now),
            TemperatureC = 25,
            Summary = "Sunny"
        };
        // 既存のforecasts配列にnewForecastオブジェクトを追加します。
        forecasts = forecasts!.Append(newForecast).ToArray();
    }
    // クラス
    public class WeatherForecast
    {
        public DateOnly Date { get; set; }
        public int TemperatureC { get; set; }
        public string? Summary { get; set; }
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
    }
}

サンプルデータjson weather.json

weather.json
[
  {
    "date": "2022-01-06",
    "temperatureC": 1,
    "summary": "Freezing"
  },
  {
    "date": "2022-01-07",
    "temperatureC": 14,
    "summary": "Bracing"
  },
  {
    "date": "2022-01-08",
    "temperatureC": -13,
    "summary": "Freezing"
  },
  {
    "date": "2022-01-09",
    "temperatureC": -16,
    "summary": "Balmy"
  },
  {
    "date": "2022-01-10",
    "temperatureC": -2,
    "summary": "Chilly"
  }
]

実行結果:
weather.jsonの内容と追加したWeatherForecastが表示されます。

まとめ

オブジェクト指向について、私の解釈を元に記載しました。いまとなっては当たり前な話なんですが、オブジェクト指向を勉強し始めた当初はなかなかしっくりこなかったため、初心に立ち返って記載しました。本記事の内容が、オブジェクト指向を理解する手助けとなれば幸いです。

参考

  • オブジェクト指向(OOP)を解説してみる

https://zenn.dev/cloud_ace/articles/29748ac0537c7f

  • 【プログラミング初心者】オブジェクト指向とは?分かりやすく解説

https://tech-dream.school/archives/5528

Discussion