まず話をわかりやすくするためにサンプル

class Test {
 int field;
 public int Field {
  get { return field; }
  set { field = value; }
 }
}

これが setter / getter。
これの素晴らしい所はパブリックフィールドと全く同じように扱えること。
Test t = new Test();
t.Field = 20;
最初はパブリックフィールドにしておいて、あとから変えることもできる。



さて、ここからわかることは、実は関数と変数(フィールド)っていうのは等価であるということ。
変数への読み書き時に、setter / getter を定義 できたり、PHPの__get、__setのようなフックを仕込めたり
Object.observe() のようなオブジェクトの変更を監視できる機能があるのが前提だが、

関数と変数は等価である。これを強く言いたい。
言い換えると、どちらか一つあれば十分なのである。


コンピュータから見ればね(笑)

俺らは人間なんで、関数と変数を分けて考えてる。関数は処理、変数は属性。

つまり、等価であるから、片方だけあれば十分とは考えずに、
オブジェクト指向としてオブジェクトには処理と属性があると認識してるので両方共必要なんだ。