2009-12-20 5 views
1

저는 PHP로 몇 년 동안 일한 후에 Java에 익숙하지 않습니다. Java로 작업 할 때 몇 가지 모범 사례와 표준에 대한 아이디어를 얻으려고합니다. .Java에서 인수 힌트에 정수 제한을 적용하는 방법

정수형 인수의 범위에 제한을 적용하기 위해 전체 클래스를 사용자 지정 형식으로 사용하는 것이 좋은지 궁금합니다.

class Person() { 
    private int age; 

    public Person(int age) { 
    if(age < 0) { 
     throw new IllegalArgumentException(); 
    } 
    this.age = age; 
    } 

    public int getAge() { 
    return age; 
    } 
} 

또는 : : 예를 들어

class Person() { 
    private Age age; 

    public Person(Age age) { 
    this.age = age; 
    } 

    public int getAge() { 
    return age.toInt(); 
    } 
} 


class Age() { 
    private int age; 

    public Age(int age) { 
    if(age < 0) { 
     throw new IllegalArgumentException(); 
    } 
    this.age = age; 
    } 

    public toInt() { 
    return age; 
    } 
}  

또한, 두 번째 예제에서 나는 편리 Person.getAge()의 int로 시대 객체를 변환하고 있습니다 만 Person의 생성자가 Age 객체를 사용하기 때문에 어떻게 든 잘못 생각됩니다. 이견있는 사람?

감사합니다.

+0

'null'을 확인하지 않는 것이 중요합니다. 또는 하위 클래스 - 클래스를 '최종'으로 만들고 생성자를 숨기고 생성 메소드를 추가하는 것이 좋습니다 ("에이전시 객체"를 "인턴"하는 데 유용 할 수도 있습니다). –

답변

4

두 번째 예제는이 경우 하나의 제약 조건이있는 단일 정수만 있으므로이 경우에는 약간 과잉이라고 생각합니다. Age에는 이와 관련된 동작이 없습니다. 이들 중 하나가 다른 경우, 예를 들어, 상호 연관된 제약 조건이있는 데이터가 더 많은 경우,이를 각각의 클래스로 분리하는 것이 좋습니다. 따라서 두 번째 디자인은 실제로 잘못이 아니며이 장난감 예제에는 적합하지 않습니다.

두 번째 예제에서 Person.getAge 메서드는 int 대신 Age 개체를 반환합니다. 다시 말하지만,이 장난감 예제를 사용하면 차이점을보기가 더 어려워 지지만, int을 반환하면 PersonAge 사이의 커플 링이 너무 복잡하게 느껴집니다.

1

첫 번째 예는 괜찮습니다. 또한 javadoc에서 던져진 예외를 설명해야하므로 클래스 사용자는이 동작 기능을 알 수 있습니다.

4

나는 객체 지향 언어가 무엇을 의미하는지에 대해 제한을 두거나 행동을 캡슐화하는 것과 관련 있다고 생각합니다. 그것은 복소수, ints, 문자열과 같은 프리미티브와 클라이언트에서 세부 사항을 캡슐화하고 숨기는 더 나은 추상화를 대표하는 객체라는 측면에서 세계에 대해 덜 생각하는 데 익숙해 져 가고 있습니다.

첫 번째 예도 들어 있습니다. 나는 또한 "나이"데이터 회원을 가지지 않는 것이 좋습니다, 매년 바뀌기 때문에. birthDate를 가지고 현재 나이를 계산하는 것이 더 좋습니다.

+0

나는이 대답으로 조금 혼란스러워합니다. 첫 번째 단락은 원시 타입에서는 생각해서는 안되지만 첫 번째 예제를 추천하려고합니다. 나는 birthDate가 나이보다 나은 점에 동의하지만 나는 단지 질문을 설명하기 위해 나이 예제를 사용하고있었습니다. 감사! – jcoffey

1

귀하의 나이 개념이 프로젝트에서 널리 퍼지지 않는 한 첫 번째 버전을 사용합니다.이 경우 두 번째 방법으로 돌아가서 일관성을 유지하고 getAge에서 Age 객체를 반환해야합니다. 캡슐화 된 int를 얻으려면 연령에 쉽게 접근 할 수 있어야합니다.

1

Peron 인스턴스가 필요없이 "연령"기능을보다 쉽게 ​​테스트 할 수 있도록 Age 클래스의 두 번째 버전을 선호합니다. 또한 Warrenty와 같은 다른 곳에서 Age를 사용할 수 있습니다.

연령대에 int를 사용하는 것은 일반적으로 좋은 아이디어가 아닙니다. 일들이 시간이 지남에 따라 나이가 더 많아지기 때문입니다. "creation date"는 좀 더 일반적인 목적입니다 (Age 클래스에서 int 대신 Date를 사용하십시오).

또한 "새로운 IllegalArgumentException을 던지면 ("나이가 < 0 일 수는 없지만 "+ age);"라고 말하면 많은 시간을 절약 할 수 있습니다. 문제의 가치가 무엇인지 알 수 있습니다 (값이 무엇인지 알 때 나쁜 데이터를 쉽게 추적 할 수있게 해줍니다).

0

첫 번째 사람도 제 투표를 받게됩니다.

여기에 예제가 있는지 확실하지 않지만 나이를 범위를 벗어나 설정하는 것이 프로그래밍 오류 일 것이라고 생각하지 않습니다. IllegalArgumentException를 throw하면 (자), 프로그래밍 에러가 발생했을 경우에보다 의미가 있습니다. Null 또는 음수 나이가 예외 목록을 만들 수 있습니다.

게시물 제목을 기준으로 상한에 대해 동일한 작업을 수행해야하는지 고려해 보는 것이 좋습니다. 나이를 어떻게 설정 하느냐에 따라 (나이 예제를 사용하여) 오브젝트 유효성 검사기가 상한선을 더 잘 적용 할 수 있다고 주장합니다. 검증은 객체 사용자에 대한 피드백이 반드시 프로그래밍 오류가 아니기 때문에 반응 (예 : 지속성) 전에 캡처 될 수 있지만 사용자가 먼저 다루거나 통지해야하는 상황에서 적용되어야합니다.

관련 문제