2015-12-04 14 views

Trả lời

30

Chúng ta đang nói về kiến ​​trúc phần mềm và như mọi khi chúng ta đang nói về kiến ​​trúc phần mềm, có hàng nghìn cách làm điều gì đó và nhiều ý kiến ​​về cách tốt nhất là gì. Nhưng không có cách nào tốt nhất, mọi thứ đều có lợi thế và bất lợi. Giữ nó trong tâm trí!

Thông thường bạn có các lớp khác nhau:

  • Một lớp kiên trì để lưu trữ dữ liệu
  • lớp kinh doanh để hoạt động trên dữ liệu
  • Một lớp trình bày để lộ dữ liệu

Thông thường, mỗi lớp sẽ sử dụng loại đối tượng riêng của mình:

  • Persistence Layer: Repositories, Tổ chức
  • Business Layer: Dịch vụ, Domain Objects
  • Presentation Layer: kiểm soát, DTOs

Điều này có nghĩa mỗi lớp sẽ chỉ làm việc với các đối tượng riêng của mình và không bao giờ vượt qua chúng để một lớp khác.

Tại sao? Vì bạn muốn mỗi lớp được tách ra khỏi các lớp khác. Nếu bạn sẽ sử dụng các thực thể trong bộ điều khiển của bạn, bản trình bày của bạn sẽ phụ thuộc vào cách dữ liệu của bạn được lưu trữ. Nó rất là tệ. Chế độ xem của bạn không liên quan gì đến cách dữ liệu được lưu trữ. Nó thậm chí không nên biết rằng hoặc làm thế nào dữ liệu được lưu trữ.

Hãy nghĩ rằng: Bạn thay đổi mô hình cơ sở dữ liệu của mình, ví dụ: bạn thêm một cột mới vào một trong các bảng cơ sở dữ liệu của bạn. Nếu bạn truyền các thực thể cho bộ điều khiển của bạn (hoặc tệ hơn: bộ điều khiển của bạn cho thấy chúng dưới dạng JSON), một thay đổi tại cơ sở dữ liệu sẽ dẫn đến thay đổi trong bản trình bày của bạn. Nếu các thực thể được hiển thị trực tiếp dưới dạng JSON, điều này thậm chí có thể dẫn đến những thay đổi trong JavaScript hoặc một số ứng dụng khách khác đang sử dụng JSON. Vì vậy, một thay đổi đơn giản trong cơ sở dữ liệu có thể yêu cầu thay đổi trong giao diện người dùng JavaScript, bởi vì bạn ghép các lớp của bạn rất chặt chẽ. Bạn chắc chắn không muốn điều đó trong một dự án thực sự.

Làm cách nào? Bạn nghi ngờ rằng đây là thực tế, vì vậy chỉ cần một ví dụ nhỏ về cách để làm điều đó trong (giả) mã:

class Repository { 
    public Person loadById(Long id) { 
     PersonEntity entity = loadEntityById(id); 
     Person person = new Person(); 
     person.setId(entity.getId()); 
     person.setName(entity.getFirstName + " " + entity.getLastName()); 
     return person; 
    } 
} 

Trong ví dụ này, kho của bạn sẽ sử dụng các đơn vị nội bộ. Không có lớp nào khác biết hoặc sử dụng thực thể này! Chúng là một chi tiết thực hiện của lớp đặc biệt này. Vì vậy, nếu kho lưu trữ được yêu cầu trả về một "người", nó hoạt động trên thực thể, nhưng nó sẽ trả về một đối tượng miền. Vì vậy, các lớp miền mà làm việc với repo được lưu trong trường hợp các thực thể cần phải được thay đổi. Và như bạn có thể thấy trong trường hợp của tên, tên miền và cơ sở dữ liệu có thể khác nhau. Trong khi cơ sở dữ liệu lưu trữ tên trong tên và họ, tên miền chỉ biết một tên duy nhất. Đó là một chi tiết của sự kiên trì như thế nào nó lưu trữ tên.

Cũng vậy với bộ điều khiển và DTO, chỉ một lớp khác.

+1

Cảm ơn bạn đã giải thích rất rõ ràng. Tôi sẽ xem xét ** lợi thế và bất lợi ** ở đây cho thiết kế tiếp theo. Đối với dự án hiện tại của tôi, tôi không cần nhiều sự tách rời này ở lớp Persistence. Hiện tại tôi chuyển đổi các thực thể trong bộ điều khiển của tôi, Có vẻ như tôi di chuyển một bước xấu, tôi nên làm điều đó tại các lớp dịch vụ. –

Các vấn đề liên quan