Tôi đã quen với mô hình Java nơi bạn có thể có một lớp chung cho mỗi tệp. Python không có hạn chế này và tôi tự hỏi đâu là cách thực hành tốt nhất để tổ chức các lớp học.
Tôi đã quen với mô hình Java nơi bạn có thể có một lớp chung cho mỗi tệp. Python không có hạn chế này và tôi tự hỏi đâu là cách thực hành tốt nhất để tổ chức các lớp học.
Câu trả lời:
Một tệp Python được gọi là "mô-đun" và đó là một cách để tổ chức phần mềm của bạn sao cho nó có ý nghĩa ". Một cái khác là một thư mục, được gọi là "gói".
Một mô-đun là một điều khác biệt có thể có một hoặc hai chục lớp liên quan chặt chẽ. Mẹo nhỏ là mô-đun là thứ bạn sẽ nhập và bạn cần nhập đó để hoàn toàn hợp lý với những người sẽ đọc, bảo trì và mở rộng phần mềm của bạn.
Quy tắc là thế này: một mô-đun là đơn vị tái sử dụng .
Bạn không thể dễ dàng sử dụng lại một lớp duy nhất. Bạn sẽ có thể sử dụng lại một mô-đun mà không gặp bất kỳ khó khăn nào. Mọi thứ trong thư viện của bạn (và mọi thứ bạn tải xuống và thêm vào) là một mô-đun hoặc một gói mô-đun.
Ví dụ: bạn đang làm việc trên một cái gì đó đọc bảng tính, thực hiện một số tính toán và tải kết quả vào cơ sở dữ liệu. Bạn muốn chương trình chính của bạn trông như thế nào?
from ssReader import Reader
from theCalcs import ACalc, AnotherCalc
from theDB import Loader
def main( sourceFileName ):
rdr= Reader( sourceFileName )
c1= ACalc( options )
c2= AnotherCalc( options )
ldr= Loader( parameters )
for myObj in rdr.readAll():
c1.thisOp( myObj )
c2.thatOp( myObj )
ldr.laod( myObj )
Hãy nghĩ về việc nhập như là cách để tổ chức mã của bạn trong các khái niệm hoặc khối. Chính xác có bao nhiêu lớp trong mỗi lần nhập không thành vấn đề. Vấn đề là tổ chức tổng thể mà bạn miêu tả bằng các import
tuyên bố của mình .
Vì không có giới hạn nhân tạo, nó thực sự phụ thuộc vào những gì dễ hiểu. Nếu bạn có một nhóm các lớp khá ngắn, đơn giản được nhóm lại với nhau một cách hợp lý, hãy ném vào một nhóm chúng. Nếu bạn có các lớp hoặc lớp lớn, phức tạp không có ý nghĩa như một nhóm, hãy truy cập một tệp cho mỗi lớp. Hoặc chọn một cái gì đó ở giữa. Tái cấu trúc khi mọi thứ thay đổi.
Tôi tình cờ thích mô hình Java vì lý do sau. Đặt mỗi lớp trong một tệp riêng lẻ sẽ thúc đẩy việc sử dụng lại bằng cách làm cho các lớp dễ nhìn hơn khi duyệt mã nguồn. Nếu bạn có một nhóm các lớp được nhóm thành một tệp duy nhất, có thể không rõ ràng đối với các nhà phát triển khác rằng có các lớp ở đó có thể được sử dụng lại đơn giản bằng cách duyệt cấu trúc thư mục của dự án . Vì vậy, nếu bạn nghĩ rằng lớp của bạn có thể được sử dụng lại, tôi sẽ đặt nó vào tệp riêng của nó.
Nó hoàn toàn phụ thuộc vào mức độ lớn của dự án, thời gian của các lớp, nếu chúng sẽ được sử dụng từ các tệp khác, v.v.
Ví dụ, tôi thường sử dụng một loạt các lớp để trừu tượng hóa dữ liệu - vì vậy tôi có thể có 4 hoặc 5 lớp chỉ có thể dài 1 dòng ( class SomeData: pass
).
Sẽ thật ngu ngốc khi chia từng tệp này thành các tệp riêng biệt - nhưng vì chúng có thể được sử dụng từ các tệp khác nhau, nên đặt tất cả các data_model.py
tệp này vào một tệp riêng sẽ có ý nghĩa, vì vậy tôi có thể làmfrom mypackage.data_model import SomeData, SomeSubData
Nếu bạn có một lớp có nhiều mã trong đó, có thể với một số hàm chỉ sử dụng, thì nên chia lớp này và các hàm trợ giúp thành một tệp riêng.
Bạn nên cấu trúc chúng để bạn thực hiện from mypackage.database.schema import MyModel
, chứ không phải from mypackage.email.errors import MyDatabaseModel
- nếu bạn nhập những thứ có ý nghĩa và các tệp không dài hàng chục nghìn dòng, bạn đã sắp xếp nó một cách chính xác.
Các tài liệu Python module có một số thông tin hữu ích về việc tổ chức các gói.
Tôi thấy mình bị chia tách mọi thứ khi cảm thấy khó chịu với sự vô dụng của các tập tin và khi cấu trúc mong muốn của sự liên quan bắt đầu xuất hiện một cách tự nhiên. Thường thì hai giai đoạn này dường như trùng khớp.
Nó có thể rất khó chịu nếu bạn phân chia mọi thứ quá sớm, bởi vì bạn bắt đầu nhận ra rằng cần phải có một trật tự cấu trúc hoàn toàn khác.
Mặt khác, khi bất kỳ tệp .java hoặc .py nào nhận được hơn 700 dòng, tôi bắt đầu thấy khó chịu khi liên tục cố gắng nhớ "bit cụ thể" đó ở đâu.
Với sự phụ thuộc vòng tròn Python / Jython của các câu lệnh nhập dường như cũng đóng một vai trò: nếu bạn cố tách quá nhiều khối xây dựng cơ bản thành các tệp riêng biệt thì "hạn chế" / "không hoàn hảo" của ngôn ngữ này có thể buộc bạn phải nhóm các thứ, có lẽ một cách hợp lý
Khi chia thành các gói, tôi thực sự không biết, nhưng tôi có thể nói có lẽ cùng một quy tắc phiền toái và sự xuất hiện của cấu trúc hạnh phúc hoạt động ở tất cả các cấp độ mô đun.
Tôi có thể nói là đặt càng nhiều lớp càng tốt để được nhóm lại trong tệp đó mà không làm cho nó quá lớn và phức tạp.