2013-03-03 5 views
12

MVC 패턴을 따르는 웹 응용 프로그램을 만들고 있습니다.생성자에서 매개 변수의 유효성을 검사해야합니까?

효과적인 자바에서 저자는 새로운 객체를 만들 때 클래스의 생성자에서 매개 변수의 유효성을 검사합니다.

그러나 타사에서 사용할 API를 만들지는 않습니다. 내 수업은 서버에 제출하기 전에 검증 된 양식의 입력 필드에서 매개 변수를 받아들입니다.

그래서이 경우 필자는 실제 수업에서 작성자가 언급 한 방식으로 수업을 작성해야합니까, 아니면 쓸모가 없습니까?

+0

저자가 생성자의 매개 변수를 확인하기 위해 언급 한 내용을 어디서 읽었습니까? – Kwadz

답변

9

책을 읽고 내용을 구현하는 것만 큼 명확하지 않습니다. 특정 상황에서 지식을 생각하고 적용해야합니다.

정말 어떻게 클래스의 변수를 초기화하고 바로 객체 생성 한 후이를 사용에 따라 달라집니다

일부 포인터 :

  • 를 변수가 어떤 방법으로 사용하려는 경우 클래스 나 객체가 구조 바로 직후에 재사용 될 경우 (대부분의 경우), 불필요한 예외를 피하기 위해 필요한 값이 비어 있거나 null이 아닌지 확인해야합니다.

  • 입력 매개 변수의 유효성을 검사하는 두 번째 시간은 올바른 값을 특정 내부 변수로 설정할 때입니다. 매개 변수를 특정 값 범위로 제한해야하는 경우 유효성을 검사하는 것이 중요합니다.

예 :

public Employee(int salary) { 
if(salary >= this.salaryCap) 
    this.salary = salary; 
} 
    :

    int salary = 0; 
    int salaryCap = 1000; 
    

    창조하는 동안, 당신은 급여 금액에 전달 유효성을 검사 할 수 있습니다 :

    우리가 객체의 샐러리 캡을 말해봐
  • 클래스 관계는 또한 th의 유효성을 검사할지 여부를 결정합니다. e 값 또는 아닙니다. 예를 들어 상속 체인에서 매개 변수가 전달되면 유효성을 검사하는 데 시간이 걸릴 것입니다. 특히 상속 체인에있는 다른 개체의 상태에 영향을주는 경우 특히 그렇습니다.

예 :

나는 슈퍼 생성자를 호출하기 위해, 내가 입력 검증 유혹하고있을 때마다

:

public Employee(int salary) { 
super(salary); //validate salary against known constraints 
} 
  • 변수가에서 오는을?소스 (예 : sql 매개 변수 등)를 신뢰하지 않으면 추가 코드를 실행하기 전에 유효성을 검사하고 입력을 sanitize해야합니다. 이렇게하면 보안 공격을 예방할 수 있습니다.

  • 생성자에서 유효성 검사와 매개 변수 검사를 수행하는 데 항상 지쳐 있습니다. 나는 getters와 setter가 입력을 검증하는 것을 선호한다. 그렇게하면, 객체 생성시에 어떤 일이 발생한다면, 적어도 상태가 쉽게 결정될 수없는 완전한 일관성없는 객체보다 반 작업 객체의 보장이 있습니다. 물론 이것은 컨텍스트에 따라 다르며 제약 조건이 엄격하면 객체 생성을 중지하고 클라이언트 (사용자, 호출 객체 등)에게 유효한 입력 매개 변수를 묻는 메시지를 표시 할 수 있습니다.

게터/세터를 사용하면, 저 오브젝트가 실제로 오브젝트가 제공하는 외부 인터페이스를 호출하여 단계별로 구성되어 있다는 것이다 예외가 발생 작성 중에 검증을 구속 이외 수득 장점, 객체를 사용할 수 없거나 불안정하게 만듭니다. 그래서 그 대신이의

:

public Employee(int salary) { 
if(salary >= this.salaryCap) 
    this.salary = salary; 
} 

나는이 선호 :

public class Employee { 
public void setSalary(int salary) { 
    if(salary >= this.salaryCap) 
     this.salary = salary; 
} 
} 

후자는 나에게 능력을 제공을하는 완전히 객체 생성에 영향을 미치지 않습니다 호출자에게 유효한 예외로 종료 (나는 생성자에서 예외를 던지는 것을 좋아하지 않는다).

간단히 말해, 변수에 제약 조건이 있습니까? 그렇다면 내부 데이터 속성으로 설정하기 전에 해당 제약 조건의 유효성을 검사하십시오.

+10

들어오는 매개 변수가 유효하지 않은 경우 개체를 작성하지 않아도됩니다. [IllegalArgumentException] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/IllegalArgumentException.html)을 던지고 깨진 클래스 invariant가있는 객체를 생성하지 않아야합니다. 호출자가 잘못된 매개 변수를 제공하는 경우 올바른 컨텍스트를 사용하여 처리해야하는 매개 변수가 있어야합니다.이 매개 변수는 사용자로부터 새로운 입력을 수집하고 그 후에 인스턴스화를 다시 시도하는 것을 포함합니다. – Jazzepi

-4

이전에 이미 확인 된 입력란의 유효성을 검사하는 것처럼 들립니다. 그럴 경우, 시간 낭비 일뿐입니다 (작성시와 실행시 모두). 귀하의 양식 (클라이언트 측 자바 스크립트) 필드를 확인하지 않은 경우 그것은 말이 될 것입니다. 그렇지 않으면 건너 뛸 수 있습니다.

+4

Trusting * clientside * 유효성 검사는 수행 할 수있는 최악의 작업 중 하나입니다. – PeeHaa

+0

네, 맞습니다. 그래서 나는 서버에서도 그걸 확인합니다. –

+0

포인트를 차감하는 경우 "매우 나쁨"뿐만 아니라 이유를 설명해야합니다. 작성자가 구독하는 시나리오에서 유효성 검사가 "복잡하다"(즉,이 전자 메일이 이미 db에 있습니까?)처럼 들리지는 않습니다. 또한 웹 이외의 다른 API가 서버에 액세스하는 것처럼 들리도 않습니다. 그렇다면 왜 클라이언트 측만을 검증하는 것이 "좋지"않습니까? – ShinySpiderdude

1

처음에는 유효성 검사가 수행 된 이후에 매개 변수의 유효성을 검사 할 필요가 없습니다. 그러나 클래스가 다른 상황에서 사용될 것이라는 점을 고려해야합니다. 생성자의 입력이 유효 할 때마다 확신 할 수 없습니다.

1

필드가 올바르게 채워지지 않은 경우 도메인의 데이터 유효성을 검사하고 (사용자 지정) 예외를 반환하는 것이 좋습니다. 이렇게하면 전체 유효성 검사 프로세스를 다시 수행하지 않고도 다른 UI를 구현할 수 있으므로 가능한 한 많이 분리하는 것이 가장 좋습니다.

관련 문제