표시하는 코드에서 유효성 검사 문제는이 개체 인스턴스를 만드는 코드와 다시 통신하지 않습니다. 그것은 아마 좋지 않습니다.
변화 1 : 메소드/생성자 내에서 예외를 잡을 경우
, 호출자에게 다시 뭔가를 통과해야합니다. 모든 것이 작동하면 true로 설정된 필드 isValid
을 입력 할 수 있습니다.
private boolean isValid = false;
public FileDataValidator(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
isValid = true;
}
catch(InvalidFormatException e)
{
isValid = false;
}
}
public boolean isValid() {
return isValid;
}
변화 : 2 :
을 아니면 예외 또는 다른 예외가 호출자에게 전파 할 수는 같을 것이다. 나는 종교를 처리하여 예외에 따라 작품을 어떤 비 확인 예외로 표시하지만, 할 수있다 :
public FileDataValidator(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
변화 3 :
내가 언급 할 세 번째 방법은 다음과 같은 코드를 가지고있다. 호출 코드에서 생성자를 호출 한 다음 작동하거나 작동하지 않는 build()
함수를 호출해야합니다. 오른쪽은하지만 예외가 나에게 올바른 방법을 보이는 경우
물론
public FileDataValidator() {
// maybe you need some code in here, maybe not
}
public void build(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
의 build()
기능을 사용하면 볼 부르는 isValid()
방법을 사용할 수 있습니다 여기에
String[] lineData = readLineData();
FileDataValidator onePerson = new FileDataValidator();
try {
onePerson.build(lineData);
} catch (InvalidDataException e) {
// What to do it its bad?
}
클래스 코드 빌드 기능.
4 변형
내가 언급 할 네 번째 방법은 내가 가장 좋아하는 것입니다. 이런 코드가 있습니다. 호출 코드에서 생성자를 호출 한 다음 작동하거나 작동하지 않는 build()
함수를 호출해야합니다.
JaxB와 JaxRS의 작동 방식은 다음과 같습니다. 이는 사용자가 가지고있는 것과 비슷한 상황입니다.
- 외부 데이터 원본 - 파일이 있으며 XML 또는 JSON 형식의 수신 메시지가 있습니다.
- 오브젝트를 빌드하는 코드 - 코드를 가지고 있기 때문에 코드의 라이브러리는 다양한 JSR의 스펙에 따라 작동합니다.
- 유효성 검사는 개체 건물과 관련이 없습니다.
호출 코드 :
public class Person {
private Name name;
private Age age;
private Town town;
... lots more stuff here ...
}
그리고 유틸리티 코드를 구축하고 검증하기 : 여기
String[] lineData = readLineData();
Person onePerson = new Person();
FileDataUtilities util = new FileDataUtilities();
try {
util.build(onePerson, lineData);
util.validate(onePerson);
} catch (InvalidDataException e) {
// What to do it its bad?
}
데이터가 사는 클래스 코드
public FileDataValidator() {
// maybe you need some code in here, maybe not
}
public void build(Person person, String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
setNameFromData(person);
setAgeFromData(person);
setTownFromData(person);
}
public boolean validate(Person person) {
try
{
validateName(person);
validateAge(person);
validateTown(person);
return true;
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
더 많은 정보는 API의 경우'e'로 할 것이고,'printStackTrace'는 우스운 냄새가납니다. 확실히 당신은 코드의 사용자가 예외를 만나게하여 그것에 대해 뭔가를 할 수있게해야합니까? 그것이 예외 사항입니다. –
'validateXXX' 연산을 변경하여 부울을 반환하고'valid'라는 변수를 세 가지'validateXXX' 호출이 모두 유효하면되도록 설정하지 마십시오. 그런 다음 var를 메소드'isValid'로 노출 시키십시오. – cmbaxter
[Command Pattern] (http://en.wikipedia.org/wiki/Command_pattern)으로 무엇인가를하면 도움이 될 것입니다. 즉, 여러 번 호출 할 메서드를 인스턴스화하고 유효성을 검사 할 데이터를 전달한 다음 해당 메서드가 예외를 throw하도록합니다. –