Viết ra 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 học khi đặt câu hỏi dữ liệu nào cần được ẩn?
Hãy tưởng tượng bạn có một đối tượng Query
và một đối tượng Database
:
Đối tượng Query
sẽ giúp bạn tạo và lưu trữ một truy vấn - cửa hàng, là chìa khóa ở đây, như một chức năng có thể giúp bạn tạo một giống như một cách dễ dàng . Có thể 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 nội dung nào đó, trong trường hợp này là dữ liệu cần thiết để lưu trữ và xuất một truy vấn. Sức mạnh của đối tượng xuất phát từ cú pháp của việc sử dụng nó (trong trường hợp này là một số 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 ngay, đối tượng Query
có thể xuất các truy vấn cho nhiều cơ sở dữ liệu sau đó. Nó trong nội bộ 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 (Postgres, MySQL, MongoDB).
Bây giờ, hãy nghĩ qua đối tượng Database
. Điều này ẩn và lưu trữ những gì?Rõ ràng 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ó một cơ sở dữ liệu! Vậy vấn đề là gì? Mục tiêu là để ẩn cách cơ sở dữ liệu hoạt động từ những người sử dụng đối tượng Database
. Các lớp học tốt sẽ đơn giản hóa lý luận khi thao tác trạng thái bên trong. Đối với đối tượng Database
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 hàng loạt hoặc cập nhật hoặc cung cấp lớp lưu trong bộ nhớ cache.
Vấn đề ở đây là đối tượng Database
là HUGE. Nó đại diện cho cách truy cập một cơ sở dữ liệu, vì vậy dưới sự che chở nó có thể làm bất cứ điều gì và mọi thứ. Rõ ràng mạng, bộ nhớ đệm, và xử lý theo lô là khá khó để đối phó với tùy thuộc vào hệ thống của bạn, do đó, ẩn chúng đi sẽ rất hữu ích. Tuy nhiên, như nhiều người sẽ lưu ý, một cơ sở dữ liệu cực kỳ phức tạp, và hơn nữa từ các cuộc gọi DB thô bạn nhận được, thì càng khó điều chỉnh hiệu suất và hiểu cách mọi thứ hoạt động.
Đây là sự cân bằng 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 đơn giản hơn (String, Array, Dictionary), nếu bạn chọn một sự trừu tượng quá lớn (Database, EmailManager, NetworkingManager), nó có thể trở nên quá phức tạp để thực sự hiểu nó hoạt động như thế nào chờ đợi. Mục tiêu là để ẩn 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 các đối tượng Manager
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 pháp 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
, hãy bắt đầu bằng hàm có tên sendEmail
có đối tượng Email
. Đâ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 suy nghĩ về dữ liệu nào cần phải ở bên 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 con vật đang đi xa bao xa, bạn có thể có các lớp học AnimalStep
và AnimalTrip
(bộ sưu tập của AnimalSteps). Bây giờ mỗi chuyến đi đều có tất cả các dữ liệu của Bước, sau đó nó sẽ có thể tìm hiểu về nó, có lẽ AnimalTrip.calculateDistance()
có ý nghĩa.
Bạn cũng có thể muốn xem xét sử dụng cơ sở dữ liệu (như sqlite: http://docs.python.org/library/sqlite3.html). Bạn có thể viết một chương trình đọc các tệp dữ liệu khổng lồ của bạn và chuyển đổi nó thành các hàng trong các bảng cơ sở dữ liệu. Sau đó, như là một giai đoạn thứ hai, bạn có thể viết các chương trình mà rút ra dữ liệu ra khỏi cơ sở dữ liệu để làm phân tích thêm. – unutbu
[Ý bạn là một cái gì đó như tôi đã hỏi ở đây] (http://stackoverflow.com/questions/3738269/how-to-insert-arrays-into-a-database) @ubutbu? Tôi dự định sẽ làm điều đó, nhưng trước tiên tôi muốn có thể xử lý tất cả dữ liệu theo cách có tổ chức hơn –