[OOP] public, private and protected


Reference
Private and protected properties and methods
OOPの1つの重要な観点は、外部インタフェースを内部インタフェースから分離し、そのアクセス性を制限することである.
A real-life example
コーヒーマシンを例にとります.このコーヒーマシンの外部には、ユーザーと接触できるインタフェースがいくつか存在します.これはボタンかもしれないし、スクリーンかもしれない.ユーザーはいくつかのインタフェースを操作するだけで最終的な結果を得ることができます.コーヒーですが、コーヒーマシン自体の観点から見ると、ボタンを押すだけでは足りません.キー動作を起点として,多くの内部有機接続インタフェースが相互作用し,ユーザの予想した結果を生成するには複雑なプロセスが必要である.しかし、ユーザーはこれらを知らなければなりませんか?いいえ、ユーザーは数回の操作で良いコーヒーを得ることができます.さらに,これらの内部インタフェースが容易に露出すれば,ユーザに残されるのは複雑さとリスクの増加だけである.最終的に,OOPの観点から,これはインタフェース分離の必要性をもたらし,この論文の主題の3つのフィールドを例として用いることができる.
Internal and external interface
OOPでは、PropertyとMethodを2つのグループに分けることができます.
  • 内部インタフェース:クラス内部の他のメソッドからアクセスできますが、外部からのアクセスは許可されません.
  • 外部インタフェース:外部からアクセス可能.
  • 内部インタフェースは、オブジェクトを起動するために使用されます.細部は互いに動作させるために使われているだけで、外部への接近は完全に遮断されています.外部で使用できるのは外部インタフェースだけで、隔離によりオブジェクトが正常に動作し、安定性が保証されます.
    JSには、2つのオブジェクトフィールド(property、メソッド)があります.
  • Public:随所にアクセス可能で、外部インタフェースを構成します.
  • プライベート(#):クラス内部アクセスのみで、内部インタフェースを構成します.
  • このほか、機能部分はサポートされていませんが、広く使用されている「保護()」フィールドがあります.このフィールドにはpublicとprivateの中間的な性質があり、この特徴は他の言語を真似て内部クラス+継承クラスにアクセスできるように「約束」されています.
    Getter & Setter
    既存のgetter&setter(コンセプト)のクリーンアップ
    最近、getter&setter関数はget.../set...によく用いられている.名前自体はもっと長くできますが、複数のパラメータを受け入れることができるので、より柔軟に使用できます.しかし、従来のget/setも簡潔性を提供しているので、この部分は開発者の好みの違いである.
    Private field
    privateフィールドは、接頭辞として#(ハッシュ)を使用します.このアイテムを貼り付ける変数またはメソッドは外部からアクセスできませんが、このフィールドを含むメソッドを外部で使用することには影響しません.
    class Test {
    	#privated = true;
        
        #fixPrivated() {
    		this.#privated = false;
    	}
        
        setPrivated() {
        	this.#fixPrivated();
        }
    }
    
    let test = new Test();
    test.#privated; // Error
    test.#fixPrivated(); // Error
    test.setPrivated(); // Success
    Summary
    OOPの観点から,この界面の分離を「カプセル化」と呼ぶ.