2013-05-09 34 views
5

Vì vậy, tôi đã đọc một số Hiệu quả Java! Và một trong những phần đầy cảm hứng nhất của cuốn sách là phần Object/Builder bất biến, nơi Bloch viết về "Builder" - class thay vì chỉ POJOs.Thiết kế đối tượng mô hình Java

LƯU Ý: Tôi đang nói về các đối tượng mô hình ở đây: ví dụ: Điều hoặc Xe.

Đây là cách tôi đã viết các đối tượng này trước đây:

public class Car { 

    private String name; 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

Bây giờ như bạn thấy thiết kế này là thiếu ở một số phương diện, nó đòi hỏi mutability và bạn phải xây dựng các đối tượng với lần đầu tiên các nhà xây dựng sau đó thiết lập tên. Bây giờ tất nhiên bạn có thể thực hiện trường cuối cùng name và sử dụng nó làm đối số trong hàm dựng nhưng sau đó nếu bạn có một đối tượng lớn bao bọc một số lượng SQL - Bảng thì bạn sẽ có một hàm tạo xấu xí như sau:

public Car(int horsepowers, String name, String brand, int yearManufactured, 
    User owner, List<User> previousOwners) { 
    //Set the values 
} 

Điều này trở nên không thể đọc được khi tạo đối tượng và đây chỉ là sáu trường!

Vì vậy, Bloch gợi ý như sau (với tính bất biến)

public class Car { 

    public static class Builder { 

     private String name; 

     public Builder setName(String name) { 
      this.name = name; 
      return this; 
     } 

     public Car build() { 
      reeturn new Car(this); 
     } 
    } 

    private final String name; 

    private Car(Builder builder) { 
     name = builder.name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

//Construction example 
Car car = new Car.Builder().setName("Speedy").build(); 

Bây giờ điều này cho chúng ta không thay đổi! Và nếu bạn có một số đối tượng không có tính nguyên thủy hoặc không thay đổi, chỉ cần sao chép chúng trong các bộ định dạng của Builder và sao chép chúng một lần nữa trong các getters của Car.

Nhưng nó rất dài dòng và tôi đã sử dụng các đối số hàm tạo nếu lớp đó đủ nhỏ. Nếu một lớp cần một trường có thể thay đổi, tôi chỉ làm cho trường đó có thể thay đổi, nếu lớp đó có đủ thuộc tính (> 4 cái gì đó).

Một vấn đề khác là khi làm việc với Android và lớp học có ví dụ Bitmap, thì bạn phải trả về bitmap thực và không sao chép nó vì điều đó khá hiệu quả - tốn kém.

Tôi đã thấy hàng loạt câu hỏi như thế này nhưng tôi dường như không tìm được câu trả lời hay cho câu hỏi này: có bất kỳ tiêu chuẩn nào về thiết kế này không và thiết kế của chúng như thế nào? Những lợi ích/sự lừa dối là gì?

Cảm ơn trước!

EDIT:

Câu hỏi đặt ra là:

các tốt nhất cách để xây dựng một mô hình đối tượng cần được bất biến và với A) một số ít các lĩnh vực và B) lớn là gì số trường? Làm thế nào để xử lý vấn đề Bitmap được đề cập ở trên và các vấn đề tương tự? Làm cho một số trường nhất định có thể thay đổi được?

Xin lỗi vì đã mơ hồ.

+0

tôi nghĩ rằng điểm của 'Builder' là khi bạn đang đối phó với bất biến đối tượng với một số trường bắt buộc và tùy chọn. Vì bạn sẽ khai báo các trường là 'final'. Vì vậy, nó không áp dụng cho mọi thiết kế. – Sam

Trả lời

4

Sách Design Patterns là alpha và omega của mẫu thiết kế hiện tại. Nó không phải là mới tuy nhiên nhưng có vẻ như nó đã vượt qua thời gian thử nghiệm.

Bạn có thể đọc các ví dụ thực tế chi tiết về từng mẫu thiết kế, cách chúng liên hệ với nhau, cách thức và thời điểm sử dụng chúng và giải thích kỹ lưỡng cho từng mẫu. Mẫu Builder được bao gồm trong khóa học.

Để trả lời câu hỏi của bạn, tôi có thể trình bày quan điểm của tôi mặc dù tất nhiên họ không có thẩm quyền.

Tôi nghĩ rằng nếu bạn có một số lượng nhỏ các trường bạn có thể sử dụng hàm tạo. Nếu bạn lấy checkstyle ví dụ, nó sẽ cảnh báo hơn 7 thông số.

Nếu bạn biết chắc chắn rằng bạn sẽ sắp xếp lại lớp đó sớm hoặc bạn sẽ phải mở rộng lớp đó, tôi nghĩ rằng kiểu Builder là tốt hơn vì dễ dàng hơn để cấu trúc lại. Refactoring constructors là không bao giờ vui vẻ.

Nếu bạn có trên 7 tham số, tôi nghĩ Trình xây dựng sẽ tốt hơn nhiều. Tôi đã sử dụng nó trong dự án hiện tại tôi đang làm việc trên rộng rãi.

Xin lưu ý rằng bằng cách sử dụng mẫu Trình tạo, bạn không nói rằng "Được rồi, tôi là một người xây dựng đối tượng không thay đổi". Bạn nói rằng "Được rồi, tôi đang xây dựng các đối tượng tham số". Do đó, không phải là vấn đề mà bạn có một tập hợp các trường có thể thay đổi trong lớp của bạn. Tuy nhiên, nếu bạn đặt tên cho lớp của mình là ImmutableFooDTO và sau đó bạn thêm các trường có thể thay đổi sẽ dẫn đến nhầm lẫn.

Vì vậy, nếu có một tập hợp các trường không được thay đổi thì hãy đánh dấu chúng cuối cùng và sử dụng hàm tạo/trình tạo và cung cấp các bộ định sẵn cho các biến thể có thể thay đổi.

+0

Xin chào! Yeah Tôi đã đọc một Java tương đương nhưng đó là xây dựng-mô hình, như bạn thấy điều này là một chút ít ràng buộc. Nó không thực sự trả lời câu hỏi. Nhưng cảm ơn bạn đã trả lời. –

+0

Vui lòng xem lại câu hỏi của bạn: "có tiêu chuẩn nào về các thiết kế này và thiết kế của chúng như thế nào? Lợi ích/sự thiếu sót là gì?" Tôi đã trả lời câu hỏi của bạn. Tôi không thấy bất kỳ dấu hỏi nào khác ở đó. –

+0

Xin chào, Tôi biết về câu hỏi và tôi đánh giá cao phản hồi của bạn. Nhưng vấn đề ở đây là * khi * sử dụng mô hình nào: * Trình dựng * giải thích ở trên hoặc hàm tạo lập phương, làm thế nào để xử lý các trường không thể thay đổi/có thể thay đổi được.Tôi không thể chấp nhận câu trả lời của bạn chỉ vì bạn liên kết với một cuốn sách mà mỗi người công nghiệp "tiêu chuẩn" nhưng vẫn không bao gồm tất cả các khía cạnh tôi đã đề cập trong bình luận của tôi ở đây và trong câu hỏi của tôi ở trên. –

2

Tôi nhập vào đây như là một "câu trả lời" để tôi có không gian để giải thích, nhưng đây thực sự chỉ là một bình luận về chủ đề bắt đầu bởi Adam Aroid.

Johan, trước hết tôi cho rằng bạn đang nói về Mục 2 trong Java hiệu quả.

Lưu ý rằng những gì được trình bày ở đó là một dạng của mẫu Builder mà Adam Aroid đã đề cập. Josh Bloch đề cập trực tiếp điều này ngay trước khi ông trình bày mã cho điều này trong Java hiệu quả: "Nó là một dạng của mẫu Builder [Gamma95, trang 97]." (Đó là trang 13.) Sau đó, ông đề cập đến một cách để sử dụng một mẫu khác (từ cùng một cuốn sách): "Một người xây dựng có tham số đã được đặt làm cho một nhà máy Tóm tắt tốt [Gamma95, trang 87].

Johan, câu hỏi mà bạn hỏi là quá rộng đối với không gian ở đây.Tôi nghĩ câu trả lời hay nhất là câu trả lời của Adam Aroid, đây là một số nghiên cứu và sau đó áp dụng nghiên cứu đó để đạt được một số kinh nghiệm. tôi sẽ bỏ phiếu của Adam câu trả lời lên

+0

Cảm ơn tín dụng. –

-1

Hãy thử với mã này:.

public static boolean isEmailValid(String email) { 

    boolean isValid = false; 

    String expression = "^[\\w\\.-][email protected]([\\w\\-]+\\.)+[A-Z]{2,4}$"; 
    CharSequence inputStr = email; 

    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE); 
    Matcher matcher = pattern.matcher(inputStr); 
    if (matcher.matches()) { 
     isValid = true; 
    } 
    return isValid; 
}