2016-06-20 1 views
1

何度も私はクラスの公共のプロパティは大きな偽物だと読んだことがありますが、データの変換/変換が行われない理由はわかりません。私は公共施設の実際の生活の例が悪い

public class Employee 
{ 
    public String firstName; 
    public String lastName; 
    private int ssn = 0; 
    public boolean setSsn(String s) 
    { 
     //makes perfect sense why something like an ssn would use a getter setter 
     //some code to validate ssn 
     if(!validSsn(s)){ 
      ssn = 0; 
      return false; 
     } 
     ssn = raw; 
     return true; 
    } 
    public String getSsn() 
    { 
     return ssn; 
    } 
    private boolean validSsn(String s) 
    { 
     //validation goes here 
     retrun val; 
    } 

    //I don't understand why I should make firstName private 
    // and then write 
    public void setFirstName(String s) 
    { 
     firstName = s; 
    } 
    public String getFirstName(String s) 
    { 
     return firstName; 
    }  
} 

を書き何かの

の例では、なぜ、「他の人があなたのコードを使用するときに問題が発生するため、」これが問題を引き起こし、具体的に説明してください、ではないでしょうシナリオを提供してください?なぜそれは問題を引き起こすのですか?事前に建設的な批判と詳細な回答をお寄せいただきありがとうございます。D

+1

firstNameが設定されたときにエラーをチェックするにはどうすればよいですか?または、設定後にロックします。あなたはその設定方法にそのロジックを持たないので、あなたの例では必要ないでしょうが、場合によってはそのロジックが必要かもしれません。 –

+0

'employee.firstName =" \ n ";' –

+0

パブリックプロパティが悪いのではなく、public ***フィールド***はカプセル化を中断し、クラスの知識なしにデータを変更できるようにします。フィールドの値を気にしなければ、大したことではありません。しかし、あなたがそこにいることに頼っている、あるいは他の方法で一定の価値を持っているのであれば、フィールドでそれを強制する方法はありません。 – dbugger

答えて

4

コードが生産されたとします。 firstNamelastNameに直接アクセスするEmployeeクラスを使用するフロントエンドを作成します。

6か月が経過し、名前のフィールドに検証を追加するという新しいビジネス要件があります。

どこに追加しますか?フィールドを非公開にしてsetメソッドを追加する必要があります。これによって私と他のすべての人がコードを使ってアプリケーションを書き直すようになります。

最初にデータを適切にカプセル化していれば、コードでライブラリの新しいバージョンを使用して再コンパイルするだけで済みます。

+1

ありがとう、これは私の質問に答える。しかし、とにかく新しい例外をキャッチする必要はありませんか?確かに、 "setFirstName()"ステートメントを変更しないでください。ただし、名前が無効であれば、それについて何をしますか?なぜ、JavaにC#スタイルのget/setができないのですか? '( –

+1

エラーの場合にフィールドを設定しないなど、代替メカニズムを追加することができます。 – Hafnernuss

+0

@JesseAdamあなたは既にssnフィールドの検証を受けているので、私はすでに一般的な "キャッチを置いていただろうと仮定しています例外の表示エラー、ユーザーの再入力の仕組み "コードに再度触れる必要はないという保証はありませんが、適切なカプセル化はコードに適切な量の将来の校正を行うのにはほとんど手間がかかりません。 – azurefrog