Trong mã bạn hiển thị, các vấn đề xác thực không giao tiếp ngược lại mã đang tạo đối tượng đối tượng này. Đó có lẽ không phải là một điều TỐT.
Biến thể 1:
Nếu bạn nắm bắt được ngoại lệ bên trong phương pháp/constructor, hãy chắc chắn để vượt qua một cái gì đó lại cho người gọi. Bạn có thể đặt một trường isValid
được đặt thành true nếu tất cả hoạt động. Điều đó sẽ trông như thế này:
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;
}
Biến thể 2:
Hoặc bạn có thể cho phép các ngoại lệ hay một số ngoại lệ khác tuyên truyền để người gọi. Tôi đã cho thấy nó như là một ngoại lệ không được kiểm tra nhưng làm bất cứ điều gì làm việc theo xử lý tôn giáo ngoại trừ của bạn:
public FileDataValidator(String[] lineData){
this.lineData = lineData;
removeLeadingAndTrailingQuotes();
try
{
validateName();
validateAge();
validateTown();
}
catch(InvalidFormatException e)
{
throw new com.myco.myapp.errors.InvalidDataException(e.getMessage());
}
}
Biến thể 3:
Phương pháp thứ ba tôi muốn đề cập đến có mã như thế này. Trong mã gọi, bạn phải gọi hàm khởi tạo và sau đó gọi hàm build()
sẽ hoạt động hay không.
String[] lineData = readLineData();
FileDataValidator onePerson = new FileDataValidator();
try {
onePerson.build(lineData);
} catch (InvalidDataException e) {
// What to do it its bad?
}
Đây là mã lớp:
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());
}
}
Tất nhiên, build()
chức năng có thể sử dụng một phương pháp isValid()
mà bạn gọi điện để xem có phù hợp của nó nhưng một ngoại lệ dường như đúng cách để tôi cho chức năng xây dựng.
Biến thể 4:
Phương pháp thứ tư tôi muốn đề cập đến là những gì tôi thích nhất. Nó có mã như thế này. Trong mã gọi, bạn phải gọi hàm khởi tạo và sau đó gọi hàm build()
sẽ hoạt động hay không.
Loại này theo cách hoạt động của JaxB và JaxRS, đây là tình huống tương tự với những gì bạn có.
- Nguồn dữ liệu bên ngoài - bạn có tệp, họ có thư đến ở định dạng XML hoặc JSON.
- Mã để tạo các đối tượng - bạn có mã của mình, chúng có thư viện mã hoạt động theo các đặc điểm kỹ thuật trong các JSR khác nhau.
- Xác thực không được gắn với việc xây dựng các đối tượng.
Mã gọi:
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?
}
Đây là mã lớp học, nơi các dữ liệu sống:
public class Person {
private Name name;
private Age age;
private Town town;
... lots more stuff here ...
}
Và mã tiện ích để xây dựng và xác nhận:
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());
}
}
Điều quan trọng hơn là bạn sẽ làm gì với 'e' trong trường hợp API,' printStackTrace' có mùi buồn cười. Chắc chắn bạn nên cho phép người dùng mã gặp phải ngoại lệ để họ có thể làm điều gì đó về nó? Đó là những ngoại lệ. –
Tại sao không thay đổi các hoạt động 'validateXXX' để trả về các boolean và sau đó thiết lập một biến gọi là' valid' là nếu cả ba lệnh 'validateXXX' đều hợp lệ. Sau đó, lộ ra rằng var ra với một phương pháp 'isValid' – cmbaxter
Làm một cái gì đó với [Command Pattern] (http://en.wikipedia.org/wiki/Command_pattern) có thể giúp đỡ ở đây; tức là, khởi tạo một phương thức bạn sẽ gọi nhiều lần, truyền dữ liệu để xác nhận hợp lệ và để phương thức đó thực hiện thao tác ném ngoại lệ. –