Tại sao tôi thấy rất nhiều lớp khả thi mà không có nhà nước?


18

Tôi đang thấy rất nhiều lớp khả thi trong thế giới C ++ và Java không có bất kỳ trạng thái nào.

Tôi thực sự không thể hiểu tại sao mọi người làm điều đó, họ chỉ có thể sử dụng một không gian tên với các hàm miễn phí trong C ++ hoặc một lớp với hàm tạo riêng và chỉ các phương thức tĩnh trong Java.

Lợi ích duy nhất tôi có thể nghĩ đến là bạn không phải thay đổi hầu hết mã của mình nếu sau đó bạn quyết định rằng bạn muốn triển khai khác trong một số tình huống. Nhưng đó không phải là một trường hợp thiết kế sớm? Nó có thể được biến thành một lớp sau này, khi / nếu nó trở nên phù hợp.

Tôi có nhận được điều này sai? Có phải là OOP không nếu tôi không đặt mọi thứ vào các đối tượng (tức là các lớp khởi tạo)? Vậy thì tại sao có nhiều không gian tên và lớp tiện ích trong các thư viện chuẩn của C ++ và Java?

Cập nhật: Tôi chắc chắn đã thấy rất nhiều ví dụ về điều này trong các công việc trước đây của mình, nhưng tôi đang vật lộn để tìm các ví dụ nguồn mở, vì vậy có lẽ nó không phổ biến như vậy. Tuy nhiên, tôi tự hỏi tại sao mọi người làm điều đó, và nó phổ biến như thế nào.


2
Khó trả lời mà không định lượng "quá phổ biến." Tôi không thể nói rằng tôi thấy điều đó rất thường xuyên. Cân nhắc thay đổi Q thành một cái gì đó như "các lớp không có ngà hữu ích như thế nào?"
Caleb

@Caleb Tôi sẽ tìm ví dụ trong các dự án nguồn mở. Tôi chắc chắn đã nhìn thấy nó rất nhiều tại các cửa hàng Java mà tôi đã làm việc.
futlib

@futlib: vâng, nó là phổ biến. stackoverflow.com/questions/4692845/ Mạnh
Hoàng Long

Bạn có xem xét lớp chỉ chứa ví dụ. EntityManager không chứa trạng thái?
user470365

Câu trả lời:


22

Tôi đang thấy rất nhiều lớp khả thi trong thế giới C ++ và Java không có bất kỳ trạng thái nào.

Một số lý do sở hữu để tạo ra các lớp không có ngà của riêng họ:

  • Nhà nước là hoặc có thể được chứa trong một siêu lớp.

  • Lớp thực hiện một số giao diện và cần có thể thực hiện được để các thể hiện có thể được truyền cho các đối tượng khác.

  • Lớp dự định sẽ được phân lớp.

  • Cách tiện dụng để nhóm chức năng liên quan. (Có, có thể có nhiều cách tốt hơn hoặc khác nhau để làm như vậy.)

Tôi có nhận được điều này sai? Có phải là OOP không nếu tôi không đặt mọi thứ vào các đối tượng (tức là các lớp khởi tạo)?

OOP là một mô hình, không phải là quy luật tự nhiên. Có một số ngôn ngữ mà mọi thứ đều là đối tượng, vì vậy bạn thực sự không có lựa chọn nào khác. Các ngôn ngữ khác (ví dụ C) không cung cấp bất kỳ hỗ trợ nào cho OOP, nhưng bạn vẫn có thể lập trình theo kiểu hướng đối tượng. Tôi muốn nói rằng bạn có thể có OOP nếu bạn không làm mọi thứ trong lớp ... bạn có thể nói rằng bạn chỉ có ít OOP hơn trong trường hợp đó.


4

Caleb và Robert Harvey đã chỉ ra các lớp tiện ích là gì và một số lý do chính đáng để có các lớp "không có dữ liệu". Những mô tả đó là tại chỗ, nhưng đối phó với các khía cạnh tích cực.

Tôi muốn chỉ đề cập rằng việc lạm dụng các lớp tiện ích chắc chắn có thể là một mô hình chống OO (xem mô tả của c2wiki ). Trích dẫn này tóm tắt nó độc đáo:

Một số lượng lớn các lớp như vậy (đặc biệt là các lớp chỉ có một phương thức duy nhất) chỉ ra rằng các nhà thiết kế đang suy nghĩ lộn ngược, tức là. nghĩ về điều đó có thể được thực hiện cho một đối tượng hơn là những gì có thể được thực hiện bởi đối tượng.

Nếu bạn đang tuyên bố đang thực hành thiết kế hướng đối tượng, nhưng cơ sở mã của bạn bao gồm hầu như toàn bộ các lớp tiện ích, tôi sẽ nói rằng bạn chắc chắn đang làm gì đó sai. Đã nói điều này, một cách tiếp cận chức năng cũng có nhiều giá trị, và cũng có thể là tuyệt vời để làm việc với. Chỉ cần không yêu cầu theo dõi người này, trong khi thực hiện một cách nửa vời.


2

Các lớp tiện ích trong Java và C ++ được sử dụng để duy trì một thư viện các phương thức lấy một hoặc nhiều tham số đầu vào và trả về một kết quả. Họ không có nhu cầu giữ trạng thái, nếu họ chỉ trả về một giá trị. Về mặt đó, các phương thức này có thể được coi là một hình thức thô sơ của lập trình chức năng, với tất cả các lợi thế của chúng (không có vấn đề gì với sự tương tranh, vì một điều).

Trong mọi trường hợp, các lớp này chỉ phục vụ để nhóm các phương thức liên quan lại với nhau trong một container, các phương thức không yêu cầu khởi tạo một đối tượng để hoạt động đúng. Một ví dụ về một lớp như vậy là một lớp Toán có chứa các hàm SINE và COSINE (và các phép toán khác).


2

Rất nhiều lớp trong số đó tương tác với dữ liệu, ngay cả khi chúng không chứa nó một cách rõ ràng và cần thực hiện theo cách yêu cầu nhiều phiên bản đồng thời được kích hoạt. Ví dụ: bean phiên phi trạng thái tương tác với thủ tục lưu trữ cơ sở dữ liệu, chuyển dữ liệu đến cho gói PL / SQL và chuyển kết quả trở lại ứng dụng gọi điện. Điều đó cần tồn tại trong nhiều trường hợp, nhưng bản thân nó không chứa bất kỳ trường dữ liệu nào.


0

Trong các ngôn ngữ hướng đối tượng nơi các lớp không phải là đối tượng, bạn có thể làm nhiều hơn với một đối tượng hơn là một lớp.

Bạn có thể truyền một đối tượng làm tham số, bạn có thể thay thế một đối tượng tương thích loại, bạn có thể thực hiện giao diện (tôi tưởng tượng có những ngôn ngữ trong đó các lớp là đối tượng nhưng bạn có thể thực hiện một số điều này, nhưng trong mọi trường hợp ...) . Tất cả những điều này là khá quan trọng vì vậy quyết định mặc định thường là làm cho một lớp có thể thực hiện được.

Đối với một số lớp, các khả năng được cấp bởi khởi tạo dường như không cần thiết. Bạn có thể sẽ không cần phải trao đổi một triển khai Cosine cho một ví dụ khác. Hóa ra, hầu hết các chức năng tiện ích không cần các khả năng này, do đó, hầu hết là các chức năng tiện ích có các lớp không thể thực hiện được.

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.