セッターとゲッターは必要なのか?
セッターとゲッターは必要か?
そもそもセッターとゲッターとは?
プログラミングを始めるとそのうち「セッターとゲッター」という言葉を耳にすると思います。
セッターとゲッターとは、オブジェクト指向で使うメソッドで、そのクラス内の変数(フィールド)に値を代入したり、参照するためのメソッドとなります。
実際、この説明を聞いて、
「セッターとゲッター使わなくても代入参照できるよね?」
と思った人もいると思います。
そうなんです。セッターやゲッターを実装しなくても、変数に代入や参照はできます!!
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○○」となるので、見たときに何をしているのかが分かりやすくなります。
つまり、セキュリティを意識しなければセッターとゲッターは必要ありません。
ここで、セッターとゲッターのメリットとデメリットをまとめたいと思います。
- メリット
- デメリット
・保守性が上がる
・代入値を制限することが可能
・何をしているかが分かりやすい
・コードが長くなってしまう。
・変数の操作がしにくくなる。
ネットなどで検索すると、「セッターとゲッターは必要か?」という記事を多く見られます。実際私も未だに「要るのか?」と思って実装しています(笑)
なので、セッターとゲッターの実装は、セキュリティをとるかコードの短さを優先するかになります。
まとめ
ということで今回は、「セッターとゲッター」についてまとめました。
個人で開発するときはセッターとゲッターを実装するのは面倒なので放置してしまいます。しかし、セキュリティを考えるなら実装するべきなのでしょうね。
しかし、全ての変数にセッターとゲッターを実装した場合はものすごいコードの長さになってしまいます。そのため、実装するものとしないものを判断する必要があるかもしれません。
難しい問題ですね、、、
今回はこの辺で、ではまた!
コメント
コメントを投稿