パブリック変数にノーと言う!(c≧)



c≧のプロパティは何ですか?
親愛なる読者
ソフトウェアを書く間、私は簡単な規則に従います.

#1: There should be NO public variables in a class. Only private ones are allowed.



しかし、なぜ私はそのルールに従いますか?
私が説明している間、しばらくの間私と耐えてください.
さて、この規則に従っていると仮定して起動しましょう.また、クラスのパブリック変数/フィールドを使用しません.
しかし、すぐ後に、あなたは明らかな問題に直面するでしょう.
どのようにクラスの外からオブジェクトのフィールドにアクセスまたは操作するには?Or
どのように自分の他のどこからクラスのメンバーを読むのだろうか?

使用方法!
Javaは、ほとんどすべてのOOP言語がそれを奨励しています!
たとえば、クラスの選手にフィールド'スコア'があります.
public class Player {
     private float score;
}
プライベートなので、' Player 'クラスだけが操作できます.しかし、あなたが外のクラスからそれにアクセスしたいならば、どうですか?
このようなGETメソッドを設定する必要があります.
public class Player {
     private float score;
     public void SetScore(float value){
         score = value;
     }
     public float GetScore(){
         return score;
     }
}

でもどうして?
賢明な質問は、なぜ我々はこれらのようなアクセッサとmutator(ゲッター&セッター)メソッドを書くすべてのトラブルを通過する必要がありますか?
なぜ我々のフィールド'公共'をしないと直接アクセスできますか?
それに対する答えは情報のより良い制御にある.
またはOOP条件では、強力なカプセル化と抽象化の組み合わせを可能にします.
たとえば、いくつかの外部クラス(HighScoremanagerのような)から' Score 'フィールドにアクセスする必要がありますが、内部のいくつかの動作に基づいてスコアを計算しているため、外部クラスでその値を変更する必要はありません.
何をするつもりですか.どのように、あなたは若干の外側のクラスがその価値を変更するのを防ぎますか?
'スコア'フィールドが公開されている場合、他のオブジェクトは簡単にアクセスできますが、その値も変更できます.
これは、ゲッターとセッターメソッドがあなたを助けることができる理由です!
他のフィールドの値を操作しない場合は、そのgetterを書き、setterメソッドを書きません.
public class Player {
     private float score;

     public float GetScore(){
         return score;
     }
}
Getterセッターを使用して取得する他の機能は、アクセスしたり変異したりする前に値を観察して準備することです.
たとえば、あなたは5桁の小数点精度で' float '型のスコアを追跡しているが、外側のクラスでは、単にそれを送信する前に値を準備することができます丸められた値を必要とする
public class Player {
     private float score;
     public float GetScore(){
         float value = (float)Math.Round(score,2);
        return value;
    }
}
同様に、いくつかの外部クラスによってフィールドが変異または変更されるたびに、特定のアクションをしたいかもしれません.
public void SetScore(float value){
        UpdateStats();            
        score = value;
    }
ここでは、外部クラスが' score 'フィールドを変更するたびに、メソッドを呼び出します.

さて、なぜ我々は把握することができます.
  • ゲッター&セッターは重要です.
  • なぜ我々は常に我々のフィールドをプライベートにする必要があります.また、Getterセッターを使用して外部世界に公開します.
  • どのようにして他のフィールドに対してアクセッサ(getter method)やmutator(setter method)を与えることでフィールドを変更することができないか.

  • プロパティについて話しましょう
    単一のクラスに複数のフィールドを持っていると仮定すると、あなたが公開したいすべてのフィールドに対して多くのボイラープレートコードを記述しなければならないということではないでしょうか?
    例えば、あなたが5つのフィールドを持っていて、そのクラスの外から少なくとも3つにアクセスする必要があるなら、そのクラスの全体的な足跡も同様に線形に成長します.
    例えば、
    public class Player {
        private float score;
        private int id;
        private string name;
        private string[] powers;
        private Vector3 position;
        public float GetScore(){
            return score;
        }
        public void SetScore(float value){
            score = value;
        }   
        public string[] GetPowers(){
            return powers;
        }
        public void SetPowers(string[] powers){
            this.powers = powers;
        }
        public Vector3 GetPosition(){
            return position;
        }
    
        public void SetPosition(Vector3 position){
            this.position = position;
        }
    }
    
    ここでは、我々が公開するために必要な各フィールドについて、我々は2つのメソッドを書いた.3フィールドでは6つのメソッドを書かなければなりませんでした.
    今、ほとんどの言語(Javaを含む)はこのような厄介な解決策で動かされていますが、C Chorzは非常にエレガントなソリューションを提供します.

    プロパティを使用すると非常にエレガントです!
    個別のゲッターメソッドとセッターメソッドを明示的に実装する場合に比較します.
    ここでは、上記の非常に同じコードの例ですが、プロパティを使用します.
    public class Player {
        public float Score {get; set;}
        private int id;
        private string name;
        public string[] Powers {get; set;}
        public Vector3 Position {get; set;}
    }
    
    違いに気がつきましたか.我々のクラスの全体的な足跡は、現在非常により小さいです!
    場合によっては、任意の外部クラスによってのみアクセスされるが、展開されないプロパティが必要です.
    public class Player {
        public float Score {get; private set;}
        private int id;
        private string name;
        public string[] Powers {get; set;}
        public Vector3 Position {get; set;}
    }
    
    ここで、' set 'の前に' private 'アクセス修飾子を追加しました.
    したがって、プレイヤークラスだけがこのプロパティを突然変異させることができ、外側の世界に変異することは不可能です.
    あなたが気づいていたかもしれないいくつかの他の変更もあります、私が公開するために必要とされたプロパティは現在' public 'に設定されます.
    私は、彼らの名前が現在大文字で始まるように変えました、そして、それは彼らがちょうどちょうどフィールドであると思われないので、もう一つです!それらは現在性質と考えられる.
    したがって、彼らはフィールドの代わりにプロパティの命名規則に従う必要があります.
    ここで、それらをアクセスしたり変異したりする前に値を準備する必要があると仮定すると、どのようにプロパティを使用して行うことができますか?
    以下に例を示します.
    public float Score { 
            get{
                float value = (float)Math.Round(Score,2);
                return value;
            } 
            private set{
                UpdateStats();                
                Score = value;
            }        
        }
    
    ここでは、' score 'プロパティのgetter & setterを拡張して、それをアクセスしたり変異したりする前に値を準備します.
    明示的なゲッターセッターメソッドのプロパティを使用する別のクールな機能は、フィールドのようなプロパティに値を割り当てることができます.例えば、以下のようなメソッドを使う代わりに-
    public void MyMethod(){
    Player obj = new Player();  
    
          //Getting the value
          float myScore = obj.GetScore();
    
          //Setting the value
          obj.SetScore(10);
        }
    
    これはエレガントな解決策です.
    public void MyMethod(){
            Player obj = new Player();
    
            //Getting the value
            float myScore = obj.Score;
    
            //Setting the value
            obj.Score = 10;
        }
    
    我々が割り当てるか、変数またはフィールドから値を取り出す方法のように!

    This is my first article on this platform! I will greatly appreciate your feedback & criticism. 😁


    @Zainjerで私に連絡してください