セッターとゲッターは必要なのか?

セッターとゲッターの必要性

セッターとゲッターは必要か?

そもそもセッターとゲッターとは?

プログラミングを始めるとそのうち「セッターゲッター」という言葉を耳にすると思います。
セッターとゲッターとは、オブジェクト指向で使うメソッドで、そのクラス内の変数(フィールド)に値を代入したり、参照するためのメソッドとなります。
実際、この説明を聞いて、
「セッターとゲッター使わなくても代入参照できるよね?」
と思った人もいると思います。
そうなんです。セッターやゲッターを実装しなくても、変数に代入や参照はできます!!
C#で書くと以下のようなコードになります。

 class Test
 {
    public static void Main( string[] args )
    {
        A a = new A();
        a.number = 10;
        System.Console.WriteLine( "number=" + a.number );
    }
 }
        
 class A 
 {
     int number = 0;
 }
        
実行すると、「number=10」と表示されます。
A a = new A();」でAクラスをインスタンス化し、「a.number=10」でAクラスの変数numberに10を代入しています。
そして、「a.number」でAクラスのnumberの値を参照します。

このように、セッターやゲッターを使用しなくても、インスタンスの変数を操作することは可能です。
しかし、このままだとセキュリティ的に問題があります。「a.number」に代入する際に自分の好きな値を格納することが可能なのです。
開発者の意図しない値を代入されてしまうと、プログラムが正常に動作しないときが出てしまうのです。
ここで、Aクラスの変数numberをprivateにすることで、外部からの操作が不可能になります。
しかし、これでは他のクラスからの代入参照ができなくなってしまいます。ですが、操作したときも存在します。
ここで、セッターゲッターを実装します!!

 class Test
 {
    public static void Main( string[] args ) 
    {
        A a = new A();
        a.setNumber( 10 );
        System.Console.WriteLine( "number" + a.getNumber() );
    }
 }
        
 class A
 {
    private int number = 0;
    
    public void setNumber( int _number )
    {
        this.number = _number;
    }

    public int getNumber()
    {
        return this.number;
    }
 }
        
a.setNumber( 10 )」で引数10をAクラスの変数numberに代入し、「a.getNumber()」でAクラスの変数numberを参照しています。
このように、セッターゲッターを実装し、変数への代入参照を行います。

ちなみに、今回は分かりやすくセッターゲッターをメソッドで実装しましたが、C#なら以下のように書くのが一般的ですかね、

 class A
 {
    private int number = 0;

    public int Number
    { 
        set { this.number = value } 
        get { return this.number }
    }
 }
        
こうすると呼び出しもとでは、
 a.Number = 10;
 System.Console.WriteLine( "number=" + a.Number );
        
のように変数と同様に呼び出すことが可能です。


セッター、ゲッター要るの?

上記の2つのコードを見比べてどう思いますか?
色々感じるところはありますが、まず、ソースコードが長くなっていますよね。
変数1つに対して、セッターゲッターが1つずつ必要になります。今回の場合はコードが8行も長くなってしまいました。これでは、コードの可読性が下がってしまいます。
では、なぜセッターとゲッターを実装するのでしょうか?
理由の1つは、保守性です。今回のコードの2つ目に注目すると変数がprivateになっています。privateにすることで、外部のクラスから操作が不可能になります。
こうすることで、セキュリティが高くなります。
しかし、このままでは外部クラスから操作できないので、セッターゲッターが必要になるのです!
さらに、セッターメソッド内でif文などを追加することで、開発者が意図しない値の代入を制限する事ができます。
例えば、先ほどのセッターを以下のように書き換え、値を制限を行います。

 public void setNumber( int _number )
 {
     if( 0 <= _number && _number < 10000 ) {
        this.number = _number;
     }
 } 
        
また、「set○○」や「get○○」となるので、見たときに何をしているのかが分かりやすくなります。
つまり、セキュリティを意識しなければセッターゲッターは必要ありません。

ここで、セッターゲッターのメリットとデメリットをまとめたいと思います。

  • メリット
  • ・保守性が上がる
    ・代入値を制限することが可能
    ・何をしているかが分かりやすい

  • デメリット
  • ・コードが長くなってしまう。
    ・変数の操作がしにくくなる。

以上のようにセッターゲッターの実装にはメリットデメリットが存在します。
ネットなどで検索すると、「セッターゲッターは必要か?」という記事を多く見られます。実際私も未だに「要るのか?」と思って実装しています(笑)
なので、セッターゲッターの実装は、セキュリティをとるかコードの短さを優先するかになります。


まとめ

ということで今回は、「セッターゲッター」についてまとめました。
個人で開発するときはセッターゲッターを実装するのは面倒なので放置してしまいます。しかし、セキュリティを考えるなら実装するべきなのでしょうね。
しかし、全ての変数にセッターゲッターを実装した場合はものすごいコードの長さになってしまいます。そのため、実装するものとしないものを判断する必要があるかもしれません。
難しい問題ですね、、、
今回はこの辺で、ではまた!

コメント

このブログの人気の投稿

PowerAppsで座席表を作成する

Power AutomateでTeamsのキーワードをトリガーにする

Power Automateで文字列抽出