Viết ra các danh từ, động từ, tính từ của bạn là một cách tiếp cận tuyệt vời, nhưng tôi thích nghĩ về thiết kế lớp như đặt câu hỏi những dữ liệu nào nên được ẩn ?
Hãy tưởng tượng bạn có một Query
đối tượng và một Database
đối tượng:
Đối Query
tượng sẽ giúp bạn tạo và lưu trữ một truy vấn - lưu trữ, là chìa khóa ở đây, vì một chức năng có thể giúp bạn tạo một truy vấn dễ dàng như vậy. Có lẽ bạn có thể ở lại : Query().select('Country').from_table('User').where('Country == "Brazil"')
. Nó không quan trọng chính xác cú pháp - đó là công việc của bạn! - chìa khóa là đối tượng đang giúp bạn ẩn thứ gì đó , trong trường hợp này là dữ liệu cần thiết để lưu trữ và xuất ra một truy vấn. Sức mạnh của đối tượng đến từ cú pháp sử dụng nó (trong trường hợp này là một chuỗi thông minh) và không cần biết những gì nó lưu trữ để làm cho nó hoạt động. Nếu được thực hiện đúng, Query
đối tượng có thể xuất các truy vấn cho nhiều hơn một cơ sở dữ liệu. Nó bên trong sẽ lưu trữ một định dạng cụ thể nhưng có thể dễ dàng chuyển đổi sang các định dạng khác khi xuất ra (Postgres, MySQL, MongoDB).
Bây giờ chúng ta hãy suy nghĩ thông qua các Database
đối tượng. Điều này ẩn và lưu trữ những gì? Rõ ràng là nó không thể lưu trữ toàn bộ nội dung của cơ sở dữ liệu, vì đó là lý do tại sao chúng tôi có cơ sở dữ liệu! Vậy vấn đề là gì? Mục tiêu là để ẩn cách thức cơ sở dữ liệu hoạt động khỏi những người sử dụng Database
đối tượng. Các lớp tốt sẽ đơn giản hóa lý luận khi thao tác trạng thái nội bộ. Đối với Database
đối tượng này, bạn có thể ẩn cách các cuộc gọi mạng hoạt động, hoặc truy vấn hoặc cập nhật hàng loạt hoặc cung cấp một lớp bộ đệm.
Vấn đề là Database
đối tượng này là LỚN. Nó đại diện cho cách truy cập cơ sở dữ liệu, vì vậy dưới vỏ bọc, nó có thể làm mọi thứ và mọi thứ. Rõ ràng việc kết nối mạng, bộ nhớ đệm và xử lý theo khối khá khó đối phó tùy thuộc vào hệ thống của bạn, vì vậy việc ẩn chúng đi sẽ rất hữu ích. Nhưng, như nhiều người sẽ lưu ý, một cơ sở dữ liệu cực kỳ phức tạp và càng xa các cuộc gọi DB thô mà bạn nhận được, càng khó điều chỉnh hiệu năng và hiểu cách mọi thứ hoạt động.
Đây là sự đánh đổi cơ bản của OOP. Nếu bạn chọn sự trừu tượng đúng, nó làm cho việc mã hóa trở nên đơn giản hơn (Chuỗi, Mảng, Từ điển), nếu bạn chọn một sự trừu tượng quá lớn (Cơ sở dữ liệu, Trình quản lý email, Trình quản lý mạng), nó có thể trở nên quá phức tạp để thực sự hiểu cách thức hoạt động của nó hoặc làm gì chờ đợi. Mục tiêu là để che giấu sự phức tạp , nhưng một số phức tạp là cần thiết. Một nguyên tắc nhỏ là bắt đầu tránh Manager
các đối tượng, và thay vào đó tạo các lớp giống như structs
- tất cả những gì họ làm là giữ dữ liệu, với một số phương thức trợ giúp để tạo / thao tác dữ liệu để giúp cuộc sống của bạn dễ dàng hơn. Ví dụ, trong trường hợp EmailManager
bắt đầu với một hàm được gọi là sendEmail
lấy một Email
đối tượng. Đây là một điểm khởi đầu đơn giản và mã rất dễ hiểu.
Ví dụ của bạn, hãy nghĩ về những gì dữ liệu cần phải được cùng nhau để tính toán những gì bạn đang tìm kiếm. Ví dụ, nếu bạn muốn biết một con vật đi được bao xa, bạn có thể có AnimalStep
và AnimalTrip
(các bộ sưu tập các lớp AnimalSteps). Bây giờ, mỗi Chuyến đi có tất cả dữ liệu Bước, sau đó nó sẽ có thể tìm ra thứ gì đó về nó, có lẽ có AnimalTrip.calculateDistance()
ý nghĩa.