Có thích hợp cho một lớp chỉ là một tập hợp thông tin không có logic?


8

Giả sử tôi có một lớp Personmà có các biến Ví dụ age, weightheight, và một lớp Fruitmà có các biến dụ sugarContenttexture. Các Personlớp học không có phương pháp tiết kiệm setters và thu khí, trong khi Fruitlớp có cả setters và thu khí phương pháp logic như thế calculateSweetness. Là Fruitlớp học loại thực hành tốt hơn so với Personlớp học. Điều tôi muốn nói là điều này Personcó vẻ như lớp học không có nhiều mục đích; nó tồn tại chỉ để tổ chức dữ liệu, trong khi Fruitlớp tổ chức dữ liệu và thực sự chứa các phương thức cho logic.


Vì vậy, một người có setters cho chiều cao, cân nặng và / hoặc chiều cao, phải không? Setters sẽ là vô nghĩa trừ khi có logic thao túng các thuộc tính này ở đâu đó. Đó có phải là logic trong một lớp học chính xác?
ĐẾN TỪ

@COMEFROM: bạn nói đúng, đó là câu hỏi được hỏi ở đây. Tuy nhiên, trong các hệ thống thông tin, không có gì lạ khi toàn bộ mục đích của một số thuộc tính là chúng được lưu trữ, hiển thị và báo cáo trong hệ thống đó, không có logic thực sự (quy trình kinh doanh thực sự sử dụng các thuộc tính đó có thể tồn tại bên ngoài hệ thống thông tin).
Doc Brown

@Doc Brown: Tôi biết và tôi đồng ý. Tôi không thấy có gì sai với các lớp không có logic nhưng việc có setters trong lớp như vậy là hơi đáng ngờ. Tôi sẽ kiểm tra nơi những setters là cần thiết. Giống như bạn đã viết: thêm các chức năng cho một lớp khi cần thiết. Một setter là một chức năng.
ĐẾN TỪ

Câu trả lời:


8

Nếu người của bạn thực sự không làm gì cả, thì không cần phải có bất kỳ hành động nào trên đó. Có thể có các lớp chỉ thu thập dữ liệu và sau đó sẽ có các lớp hoạt động trên dữ liệu này. Trong trường hợp của bạn, có thể bạn không có bất kỳ hành động nào đối với một người, nhưng có thể có hành động đối với nhóm người, như Tính toán Bảo hiểmHeight (). Trong trường hợp này, thật hợp lý khi chỉ có Người mà không có hành động và sau đó có một lớp khác (có thể là bạn) hoạt động trên đó.


1
Tôi không nói rằng việc chia dữ liệu và logic của bạn thành các lớp khác nhau trong một hệ thống OOP được thiết kế đúng là "phổ biến". Ví dụ của bạn, tôi mong đợi CalculateAverageHeight()là một phương thức tĩnh trong Personđó có một bộ sưu tập các Personđối tượng. Theo cách đó, mặc dù CalculateAverageHeight()không thể áp dụng cho một trường hợp riêng lẻ Person, bạn vẫn giữ nó gần với dữ liệu mà nó hoạt động.
TMN

1
@TMN - Xin lỗi vì từ thông dụng. Nó không phổ biến, nhưng có thể. Tôi không đồng ý rằng Tính toán chiều cao trung bình có liên quan chặt chẽ với lớp người. Hãy xem xét một hàm khác HighD mậtArea (), tìm ra đó là khu vực mà phần lớn dân số cư trú. Chức năng này chỉ cần trường địa chỉ của người. Không cần ràng buộc điều này chặt chẽ với lớp Người.
Manoj R

4

Thật khó để đi kèm với một quy tắc nói rằng tất cả các lớp phải có một số logic. Trong các lớp học chung mà không có bất kỳ logic nào được coi là AnemiaDomainModel .

Thậm chí sau đó, tốt hơn là tổ chức dữ liệu nếu thông tin liên quan ngày càng lớn. Ví dụ trong trường hợp này, bạn vẫn có thể cần một bộ sưu tập Person hơn nhiều bộ sưu tập không liên quan.


3
Tôi không nghĩ điều này (AnemiaDomainModel) luôn đúng chỉ vì bạn không có logic. Trên thực tế, tôi nghĩ rằng nhiều loại Thực thể cơ bản chỉ là thế này: một tập hợp tất cả thông tin liên quan đến một đối tượng cụ thể, nhưng không có bất kỳ logic cụ thể nào được kết nối với nó. Một người chỉ ... là vậy, thật khó để tranh luận rằng bạn không nên có một lớp để đại diện cho một Người.
Peter Rowell

@ Peter Rowell: Thực thể (đậu) từ J2EE được đề cập đặc biệt trong bài viết.
Jayan

1
Bạn cũng có thể đã triển khai mẫu thiết kế lệnh
Eoin

Một định nghĩa hoạt động tốt của Mô hình miền thiếu máu là một miền nơi các quy tắc kinh doanh phải tồn tại để thực thi tính toàn vẹn dữ liệu trong một đối tượng, nhưng các quy tắc đó không được gói gọn trong cùng một đối tượng . Nếu một đối tượng không cần logic để duy trì một trạng thái nội bộ phù hợp, chẳng hạn như một mẫu tiền, sau đó nó không nên đã nói logic. Tuy nhiên, nếu Hóa đơn có thuộc tính dữ liệu Tổng phụ phải luôn là tổng của Chi phí mở rộng của chi tiết đơn hàng (mỗi chi tiết lần lượt là Đơn giá * Số lượng), thì các thuộc tính đó phải được tính và không thể giải quyết trực tiếp.
KeithS

Nếu bạn có nhiều lớp giống như vậy, bạn có một vấn đề. Tuy nhiên, đôi khi bạn chỉ muốn tổ chức một số mục dữ liệu nhưng không có phương pháp nào không có ý nghĩa hơn ở nơi khác.
Loren Pechtel

3

Các DataTransferObject là một ví dụ tốt về một lớp học mà không có logic, chỉ dữ liệu. Đó là mục đích của nó, mặc dù; rõ ràng đây là một ngoại lệ đối với quy tắc chung rằng tất cả các lớp nên thực hiện logic nghiệp vụ ảnh hưởng đến trạng thái bên trong của chúng. Có một lớp có trạng thái bên trong bị thay đổi bởi logic bên ngoài thường là mùi thiết kế. Điều đó không phải lúc nào cũng sai, nhưng hầu như luôn luôn là điều mà bạn nên xem xét tái cấu trúc.


3

Đảo ngược câu hỏi, nhìn vào đầu kia. Nếu bạn có một tập hợp thông tin rõ ràng thuộc về nhau, bạn có nên tách nó ra chỉ vì không có phương thức nào bạn có thể thêm vào lớp đó không? Bạn có nên bị buộc phải phát minh ra các phương thức tùy ý chỉ để biện minh cho lớp học?


2

Các mô hình không có kết thúc với chính chúng - bạn nên thêm các chức năng cho một lớp khi bạn thực sự cần chúng trong chương trình của mình, không phải đoán rằng bạn sẽ cần chúng trong tương lai. Vì vậy, điều tự nhiên là tại một thời điểm bạn có các lớp không có phương thức "thực" và sau đó, khi bạn xác định rằng việc thêm phương thức vào lớp là hợp lý, bạn thực hiện chính xác điều đó. Chất lượng của một mô hình không được đo bằng "tôi có phương pháp ở đây và không có phương pháp nào ở đó" - chất lượng được đo bằng "tôi có tất cả các phương thức mà ứng dụng của tôi thực sự cần trong đó không".

Ví dụ, khi ứng dụng của bạn trong phiên bản 1.0 cần một cái gì đó giống như calculateSweetnesscho a Fruit, nhưng không có thao tác nào Personngoài việc lấy và đặt các thuộc tính, thì mô hình của bạn sẽ phản ánh chính xác điều đó bằng cách không có bất kỳ logic nào trong lớp Person. Trong phiên bản 2.0, việc thêm một số logic cũng có thể hợp lý Person, vì vậy khi bạn ở thời điểm đó, hãy thêm các phương thức được đề cập.


1

Tôi nghĩ điều này phụ thuộc vào ngôn ngữ và cách bạn đang sử dụng ngôn ngữ.

Trong trường hợp tầm thường, một số ngôn ngữ nhấn mạnh vào mọi thứ trong một lớp, vì vậy, các tập hợp các hằng số phải đi vào một lớp mà sau đó có thể có hoặc không có logic, trong các ngôn ngữ khác, chúng có thể kết thúc trong một không gian tên thay thế.

Trong các ngôn ngữ đa mô hình, nó cũng có thể phụ thuộc vào mô hình mà bạn muốn thiết kế của bạn tuân thủ. Mượn ví dụ về Tính toán Bảo hiểmHeight (), vì có lẽ nó sẽ nằm trong lớp PersonCollection, tuy nhiên, điều đó giả định trước một giải pháp OOP. trong thiết kế nhiều chức năng hơn, bạn có thể sử dụng hàm bậc cao hơn với bộ sưu tập chung, ví dụ như trong C #

List<Person> personList = GetListOfPeople();
personlist.Average(p => p.Height);

và sau đó logic không nằm trong PersonCollection hoặc thậm chí tĩnh trong Person. Thực tế, các hàm bậc cao hơn và các kiểu dữ liệu chung nói chung có nghĩa là bạn có nhiều khả năng kết thúc với các đối tượng chỉ là các túi dữ liệu, vì logic đang hoạt động ở mức độ trừu tượng cao hơn mô hình dữ liệu cụ thể của bạn .


1

Nghe có vẻ như những gì bạn đang nói là một POD (dữ liệu cũ đơn giản). Các ngôn ngữ khác nhau có thể biểu diễn những ngôn ngữ này theo những cách khác nhau - ví dụ, đó có thể là một lớp với các thành viên công cộng hoặc một cấu trúc chỉ có các thành viên công cộng trong C ++.

Sắp xếp dữ liệu là một lý do hoàn toàn hợp lệ để một lớp tồn tại - nó thường có thể làm cho mã sạch hơn và dễ đọc hơn. std::pairtrong STL của ST ++ là một ví dụ điển hình về cấu trúc chỉ tồn tại để tổ chức dữ liệu - đơn giản là một cấu trúc chứa hai giá trị của bất kỳ loại nào có tên firstsecond. Có lẽ là một trong những lớp hữu ích nhất trong toàn bộ STL (theo ý kiến ​​của tôi dù sao đi nữa :))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.