TomoProgの技術書

底辺プログラマーが達人プログラマーになるまで

アクセス修飾子(public, private, protected)について考えてみる

皆さん
こんにちは、こんばんは
TomoProgです。

ブログを更新すると書いてから、すでに半月以上経過していました。
更新頻度はあまり気にせず、ゆるりと書いていこうと思います。

今回はアクセス修飾子がなんで必要なのかを考えてみました。

それでは頑張っていきましょう。

なぜアクセス修飾子が必要なの?

自分なりの見解ですが、アクセス修飾子を適切に設定することにより、

  1. 外部からアクセスされてはまずい変数、メソッドへのアクセスを遮断できる
  2. 保守を容易にする

以上の2つ、特に2つめが重要だと考えています。

例えば、以下のようなプログラムで考えてみます。

using System;
using System.Collections.Generic;

public class Book
{
    public string Title { get; private set; }
    
    public Book(string title)
    {
        Title = title;
    }
}

public class BookStore
{
    private List<Book> _stock;    // 在庫
    
    public BookStore()
    {
        _stock = new List<Book>();
    }
    
    // 在庫補充
    public void Restock(Book book)
    {
        _stock.Add(book);
    }
    
    // 在庫表示
    public void PrintStock()
    {
        foreach(Book b in _stock)
        {
            Console.WriteLine(b.Title);
        }
    }
}

public class Hello
{
    public static void Main()
    {
        var store = new BookStore();

        var rubyBook = new Book("Hello Ruby World");
        var csBook = new Book("Hello c# World");
        var pythonBook = new Book("Hello Python World");
        
        store.Restock(rubyBook);
        store.Restock(csBook);
        store.Restock(pythonBook);
        
        store.PrintStock();
    }
}

本の在庫を補充して在庫を表示するというプログラムです。

BookStoreクラスの_stock変数がもしpublicだった場合、以下のようなことが可能になります。

public class BookStore
{
    public List<Book> _stock;    // 在庫(publicに変えた)
    ・・・
}

public class Hello
{
    public static void Main()
    {
        var store = new BookStore();
        var rubyBook = new Book("Hello Ruby World");
        var csBook = new Book("Hello c# World");
        var pythonBook = new Book("Hello Python World");
        
        store.Restock(rubyBook);
        store.Restock(csBook);
        store.Restock(pythonBook);
        store._stock.Add(new Book("Hello C++ World"));  // 強引に在庫を増やす
        
        store.PrintStock();
    }
}

Restockメソッドを使わずに在庫に直接アクセスして商品を追加できてしまいました。
追加に限らず、削除や編集も容易にできてしまいます。

また、在庫を変更している箇所を探そうと思った場合、メソッドだけでなく、_stock変数も考慮して探さなければいけません。

アクセス修飾子を適切に設定することで、影響範囲を限定し、保守しやすいコードを心がけていきましょう。

それではまた。

TomoProg

GitHub
TomoProg (TomoProg) · GitHub

Twitter
TomoProg (@tomoprog_xxx) | Twitter