2010-03-09 30 views
10

Tôi đang tạo mô hình miền trong hệ thống của mình. Khi thiết kế các đối tượng mô hình của tôi, tôi có nên tạo giao diện cho từng đối tượng thực thể không? Mọi người đã nói với tôi rằng tầng web của chúng tôi không nên quan tâm đến việc thực hiện một thực thể và chúng tôi có thể trao đổi các triển khai, nhưng tôi không chắc chắn điều đó sẽ xảy ra.Các đối tượng mô hình có giao diện không?

Ví dụ, nếu chúng ta có một lớp giáo viên duy trì một danh sách của sinh viên, phương pháp getStudents có thể thể là:

public List<Student> getStudents() { 
     return this.students; 
} 

hay này:

public List<Student> getStudents() { 
    return someExternalService.retrieveStudents(); 
} 

Tôi hiểu lợi ích này, nhưng thực hành chung là gì?

+0

"thực hành chung" không nhất thiết phải giống như "thực hành tốt", đặc biệt là khi nói đến thiết kế OO :) – skaffman

+3

Tôi không nhận được ví dụ của bạn. Câu hỏi của bạn là liệu Giáo viên có nên thực hiện một số giao diện hoặc sử dụng sự phụ thuộc thông qua giao diện không? Tôi có những câu trả lời khác nhau cho hai trường hợp này. Văn bản của bạn làm cho tôi nghĩ rằng bạn đang suy nghĩ trước đây, nhưng ví dụ làm cho tôi nghĩ rằng bạn muốn sau này. Nó là gì? –

+0

Martinho, câu hỏi của tôi là liệu Giáo viên có nên thực hiện một giao diện và có các lớp TeacherImpl kết quả không. – sma

Trả lời

7

Trừ khi bạn có lý do chính đáng để nghĩ rằng bạn sẽ cần phải hoán đổi mô hình, tôi sẽ không lo lắng về nó. Dựa trên nguyên tắc YAGNI (You ain't gonna need it)

+0

Cảm ơn câu trả lời. Tôi đồng ý với cả hai. Tôi thực sự có một tiếp theo để điều này mà tôi sẽ gửi như một câu hỏi riêng biệt. Nó liên quan đến mô hình hiệp hội. – sma

+4

Theo ý kiến ​​của tôi, YAGNI áp dụng nhiều chức năng hơn là thiết kế. Giao diện không đóng góp vào mã bloat hoặc biến chứng trong thử nghiệm, ví dụ; theo kinh nghiệm của tôi, đó là sự vắng mặt của các giao diện vì lợi ích của sự tiện lợi đó là vấn đề. –

+0

@Noel - Tôi nghĩ rằng bạn đang đúng về nguồn gốc của nó nhưng tôi nghĩ rằng nó có thể là một hữu ích để tránh over-kỹ thuật. Tôi đã tìm thấy một vài dịp để nói với ai đó "Bạn sẽ không cần điều đó" và họ có thể từ chối yêu cầu của bạn và đưa ra lý lẽ tốt cho việc bổ sung, hoặc họ thấy họ không thể biện minh và quyết định/nhận ra không thực sự là một yêu cầu. Tôi đồng ý trong trường hợp này không có hại lớn trong việc thêm giao diện nhưng nó có thể dẫn đến nhiều mã được thêm vào "chỉ trong trường hợp". – David

2

Không có dự án nào tôi từng thấy hoặc tham gia có giao diện cho thực thể tên miền.

Nhưng trong một trong những dự án của tôi, tôi có giao diện NamedEntity:

public interface NamedEntity { 
    int getId(); 
    String getName(); 
} 

Tất cả các đơn vị miền thực hiện giao diện này. Nó đã cho tôi một khả năng không tạo ra các trình biến đổi jsf khác nhau cho các thực thể khác nhau nhưng tạo ra một trình biến đổi sử dụng giao diện này thay vì các lớp miền cụ thể.

+0

Ví dụ hay. Nitpick: bạn nói không ai trong số các dự án bạn đã nhìn thấy hoặc tham gia có hiện tượng đó, và sau đó bạn nhanh chóng cung cấp một ví dụ về một ... –

+0

Lỗi này cho thấy lỗi (hoặc đơn giản là hành vi không rõ ràng) trong đếm danh tiếng SO. – Roman

+0

Tôi đồng ý. Tôi thực sự không muốn có một giao diện nhưng những người khác thì không đồng ý. – sma

1

Tôi không thể nói đến thực tiễn chung, nhưng khó có thể che giấu việc triển khai.

Đó là về việc chính thức hóa giao diện làm cơ sở cho tài liệu và hợp đồng.

Khi trừu tượng hóa mô hình của bạn thành các giao diện, bạn đang tạo tài liệu cho các nhà phát triển ứng dụng khách dịch vụ. Tùy thuộc vào phong cách phát triển của bạn, bạn có thể hoặc chưa có mô tả chính thức về dịch vụ của mình (ví dụ: mô tả dựa trên WSDL). Giao diện có thể lấp đầy nhu cầu đó.

+0

Thực tế là phần nào áp dụng cho tình huống của tôi. Có các nhà phát triển ứng dụng khách dịch vụ dựa trên các dịch vụ của các đối tượng mô hình của tôi, vì vậy có lẽ cách tiếp cận giao diện không phải là một điều xấu. – sma

0

Quan điểm chung của tôi là tôi sẽ không tạo bộ giao diện một-một cho các mô hình miền, vì điều này không có gì khác ngoài cấu trúc lớp của mô hình miền của bạn. Nó không thêm bất cứ điều gì hữu ích.

Hai trường hợp tôi có thể nghĩ đến ngay nơi tôi sẽ xem xét giao diện giới thiệu là:

  1. một giao diện mô tả hợp đồng/hành vi của một số tập các lớp trong mô hình miền, nơi nó rất hữu ích để mô hình hành vi đó independantly của các lớp mà thực hiện nó
  2. bạn cần để lộ mô hình tên miền của bạn cho các khách hàng bên ngoài và muốn ẩn chi tiết thực hiện từ họ

Nói cách khác, thêm giao diện nếu chúng giúp bạn mô tả hành vi hoặc giúp bạn ẩn chi tiết triển khai từ khách hàng. Các lý do khác có thể hợp lệ, nhưng đó là hai lý do khiến bạn bận tâm.

+0

Vâng, tôi hoàn toàn đồng ý. Điều này thực sự bắt đầu như số 2, nơi chúng tôi đã trưng bày mô hình miền cho các máy khách bên ngoài. Cách tiếp cận đó đã chuyển từ bây giờ và bây giờ tôi bị mắc kẹt với một giao diện cho mọi đối tượng mô hình. Tôi xem xét việc loại bỏ nó, nhưng muốn kiểm tra với cộng đồng trước. – sma

1

Tôi nghĩ có sự khác biệt quan trọng giữa việc có giao diện cho dịch vụ để truy xuất đối tượng và chính đối tượng mô hình đó.

Khi chạy dịch vụ để tải một đối tượng mô hình có thể khác nhau tùy theo nơi bạn đang yêu cầu dữ liệu. Nhưng định dạng và loại đối tượng dữ liệu được mong đợi sẽ không thay đổi, bất kể bạn tạo đối tượng này như thế nào. Do đó, các đối tượng mô hình mang trạng thái sẽ không cần một giao diện, nhưng các lớp dịch vụ để tạo và tải các đối tượng mô hình này cần giao diện.

Lý do duy nhất cho các đối tượng mô hình có giao diện sẽ có ý nghĩa nếu đối tượng mô hình không chỉ là một loại bean đơn giản của đối tượng mà còn thể hiện một số loại hành vi.

0

Trích xuất một giao diện là một trong các phép tái cấu trúc đơn giản nhất; trường hợp xấu nhất đó là một tên lớp -> di chuyển phương pháp. Nỗ lực thay đổi tâm trí của bạn, một khi bạn đã tìm được lý do để làm như vậy, là tối thiểu. Tôi đã luôn thấy rằng nếu một quyết định dễ thay đổi, nó củng cố YAGNI và KISS nhiều hơn nữa. Đối số phản đối là không có nhiều nỗ lực để tạo ra một giao diện ban đầu, điều đó đúng, nhưng việc bảo trì tăng lên theo thời gian nếu quyết định được thực hiện nhiều lần - thường không được sử dụng.

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