Tôi hiểu khái niệm về một đối tượng và là một lập trình viên Java, tôi cảm thấy mô hình OO xuất hiện khá tự nhiên đối với tôi trong thực tế.
Tuy nhiên gần đây tôi thấy mình suy nghĩ:
Đợi một chút, những lợi ích thực tế của việc sử dụng một đối tượng so với việc sử dụng một lớp tĩnh (với sự đóng gói và thực hành OO thích hợp) là gì?
Tôi có thể nghĩ về hai lợi ích của việc sử dụng một đối tượng (cả hai đều có ý nghĩa và mạnh mẽ):
Đa hình: cho phép bạn trao đổi chức năng linh hoạt và linh hoạt trong thời gian chạy. Cũng cho phép dễ dàng thêm chức năng mới 'các bộ phận' và các lựa chọn thay thế cho hệ thống. Ví dụ: nếu có một
Car
lớp được thiết kế để làm việc vớiEngine
các đối tượng và bạn muốn thêm một Công cụ mới vào hệ thống mà Xe có thể sử dụng, bạn có thể tạo mộtEngine
lớp con mới và chỉ cần truyền một đối tượng của lớp này vàoCar
đối tượng mà không cần phải thay đổi bất cứ điều gì vềCar
. Và bạn có thể quyết định làm như vậy trong thời gian chạy.Có thể 'truyền chức năng xung quanh': bạn có thể truyền một đối tượng xung quanh hệ thống một cách linh hoạt.
Nhưng có bất kỳ lợi thế hơn cho các đối tượng trên các lớp tĩnh?
Thông thường khi tôi thêm 'bộ phận' mới vào một hệ thống, tôi làm như vậy bằng cách tạo một lớp mới và khởi tạo các đối tượng từ nó.
Nhưng gần đây khi tôi dừng lại và nghĩ về nó, tôi nhận ra rằng một lớp tĩnh sẽ làm giống như một đối tượng, ở rất nhiều nơi mà tôi thường sử dụng một đối tượng.
Ví dụ: tôi đang làm việc để thêm cơ chế lưu / tải tệp vào ứng dụng của mình.
Với một đối tượng, dòng mã gọi sẽ như thế này: Thing thing = fileLoader.load(file);
Với một lớp tĩnh, nó sẽ trông như thế này: Thing thing = FileLoader.load(file);
Có gì khác biệt?
Khá thường xuyên, tôi không thể nghĩ ra lý do để khởi tạo một đối tượng khi một lớp tĩnh cũ đơn giản sẽ hoạt động giống nhau. Nhưng trong các hệ thống OO, các lớp tĩnh khá hiếm. Vì vậy, tôi phải thiếu một cái gì đó.
Có bất kỳ lợi thế hơn cho các đối tượng khác từ hai mà tôi liệt kê? Vui lòng giải thích.
EDIT: Để làm rõ. Tôi thấy các đối tượng rất hữu ích khi hoán đổi chức năng hoặc truyền dữ liệu xung quanh. Ví dụ tôi đã viết một ứng dụng tạo nên giai điệu. MelodyGenerator
có một số lớp con tạo ra các giai điệu khác nhau và các đối tượng của các lớp này có thể hoán đổi cho nhau (mẫu Chiến lược).
Các giai điệu cũng là đối tượng, vì nó hữu ích để vượt qua chúng. Hợp âm và Cân cũng vậy.
Nhưng những gì về phần 'tĩnh' của hệ thống - điều đó sẽ không được thông qua? Ví dụ: cơ chế 'lưu tệp'. Tại sao tôi nên thực hiện nó trong một đối tượng, mà không phải là một lớp tĩnh?
FileLoader
một cái mà đọc từ ổ cắm? Hoặc một giả để thử nghiệm? Hoặc một trong đó mở một tập tin zip?
System.Math
trong .NET là một ví dụ về một thứ có ý nghĩa hơn như một lớp tĩnh: bạn sẽ không bao giờ cần phải trao đổi nó hoặc chế nhạo nó và không có thao tác nào có thể trở thành một phần của một thể hiện. Tôi thực sự không nghĩ rằng ví dụ 'tiết kiệm' của bạn phù hợp với dự luật đó.
Thing
sao?