2016-06-20 3 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

공개 속성이 나쁘지는 않습니다. 공개 *** 필드 ***는 캡슐화를 중단하고 클래스의 지식없이 데이터를 변경할 수 있도록합니다. 필드 값을 신경 쓰지 않는다면 큰 문제가 아닙니다. 그러나 당신이 거기에 있기 위해 그들에게 의지하거나 다른 방법으로 어떤 가치를 지니고 있다면, 그것을 현장에서 시행 할 방법이 없습니다. – dbugger

답변

4

코드가 제작 단계에 있다고 상상해보십시오. firstNamelastName에 직접 액세스하는 Employee 클래스를 사용하는 프런트 엔드를 작성합니다.

6 개월이 지나면 이름 필드에 유효성 검사를 추가하는 새로운 비즈니스 요구 사항이 있습니다.

어디로 추가 하시겠습니까? 필드를 비공개로 설정하고 set 메소드를 추가해야 할 것입니다. 그러면 나와 다른 모든 사람들이 코드를 사용하여 앱을 다시 작성해야합니다.

데이터를 올바르게 캡슐화했다면 코드의 새 버전 라이브러리를 사용하여 다시 컴파일하면됩니다.

+1

감사합니다.이 질문에 대한 답변입니다. 그러나 어쨌든 새 예외를 잡을 필요가 없습니까? 물론, 당신은 "setFirstName()"문을 변경하는 것을 피할 것이지만, 이름이 유효하지 않다면, 그것에 대해 무엇을 할 것입니까? Java에서 C# 스타일 get/set을 사용할 수없는 이유는 무엇입니까? '( –

+1

오류의 경우 필드를 설정하지 않는 것과 같은 대체 메커니즘을 추가 할 수 있습니다. 대체 기능이 무엇이든간에 setter 및 getter를 사용하면 훨씬 유연하게 작업 할 수 있습니다. 클래스 내부의 논리를 숨기고 깨끗하고 멋진 인터페이스를 제공합니다. 공개 필드는 단지 추한 것입니다. – Hafnernuss

+0

@JesseAdam 이미 ssn 필드에 대한 유효성을 확인 했으므로 이미 일반 "catch 예외, 표시 오류, 사용자에게 다시 프롬프트하기 "메커니즘을 사용할 수 있습니다. 코드를 다시 만질 필요는 없다고 보장 할 수는 없지만 적절한 캡슐화는 코드에 적절한 양의 미래 보장을 적용하는 데 거의 아무런 노력을하지 않습니다. – azurefrog