2008-09-20 34 views
217

Tôi đã quen với mô hình Java, nơi bạn có thể có một lớp công khai cho mỗi tệp. Python không có hạn chế này, và tôi tự hỏi thực hành tốt nhất để tổ chức các lớp học là gì.Tôi nên đặt bao nhiêu lớp vào một tệp?

+5

Tôi nghĩ đây là câu hỏi * hợp lý * với các yêu cầu và quy ước của các ngôn ngữ khác, và câu trả lời * là "xác định mô-đun và gói Python> và hơn thế nữa, đó là vấn đề ưu tiên (/ ý kiến)" - * câu trả lời đó * không phải là ý kiến ​​của mình – d3vid

Trả lời

268

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 để nó có ý nghĩa "". Khác là một thư mục, được gọi là "gói".

Mô-đun là một điều riêng biệt có thể có một hoặc hai tá lớp liên quan chặt chẽ. Bí quyết là một mô-đun là thứ bạn sẽ nhập, và bạn cần nhập khẩu đó để hoàn toàn hợp lý với những người sẽ đọc, duy trì và mở rộng phần mềm của bạn.

Quy tắc này là: mô-đun là đơn vị sử dụng lại.

Bạn không thể dễ dàng sử dụng lại một lớp học. Bạn sẽ có thể tái sử dụng 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) là một mô-đun hoặc một gói mô-đun.

Ví dụ: bạn đang làm việc trên thứ gì đó đọc bảng tính, thực hiện một số phép tính 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 suy nghĩ về cách nhập làm cách tổ chức mã của bạn theo 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 quan trọng. Điều quan trọng là tổ chức tổng thể mà bạn đang mô tả với các tuyên bố import của mình.

+16

Haha, tôi thích "cảm giác" trong các trích dẫn. – cdleary

+21

@cdleary: Cảm giác của một người là sự điên rồ của một người khác. Thông thường, bạn có thể xác định các mô-đun hợp lý. Tuy nhiên, trong một ứng dụng lớn, luôn có nhiều tham số phân tích và một người sẽ phân chia sợi tóc trên việc cắt và dicing chức năng của người khác. –

+4

Các đề xuất ở trên phù hợp với http://docs.python-guide.org/en/latest/writing/structure/ –

5

Tôi muốn đặt nhiều lớp có thể được nhóm hợp lý trong tệp đó mà không làm cho tệp quá lớn và phức tạp.

35

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 loạt các lớp học đơn giản, ngắn gọn được nhóm hợp lý lại với nhau, hãy quăng vào một nhóm 'em'. Nếu bạn có các lớp hoặc lớp phức tạp, không có ý nghĩa như một nhóm, hãy chuyển một tệp cho mỗi lớp. Hoặc chọn một cái gì đó ở giữa. Refactor khi mọi thứ thay đổi.

13

Nó hoàn toàn phụ thuộc vào dự án lớn như thế nào, các lớp học bao lâu, nếu chúng sẽ được sử dụng từ các tệp khác và vân vân.

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).

Nó sẽ là ngu ngốc để tách từng thành các file riêng biệt - nhưng vì họ có thể được sử dụng từ các tập tin khác nhau, đặt tất cả những trong một tệp riêng data_model.py sẽ có ý nghĩa, vì vậy tôi có thể làm from mypackage.data_model import SomeData, SomeSubData

Nếu bạn có một lớp với rất nhiều mã trong nó, có thể chỉ với một số hàm mà nó sử dụng, nên chia lớp này và các hàm trợ giúp thành một tệp riêng biệt.

Bạn nên cấu trúc chúng để bạn làm from mypackage.database.schema import MyModel, không phải from mypackage.email.errors import MyDatabaseModel - nếu bạn nhập mọi thứ từ ý 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 chính xác.

Python Modules documentation có một số thông tin hữu ích về cách tổ chức các gói.

+0

liên kết bị hỏng đến tài liệu Mô-đun Python. Có lẽ [Phần 6.4 Mô-đun.Gói] (http://docs.python.org/2/tutorial/modules.html#packages) là liên kết dự định bây giờ không? – cod3monk3y

10

Tôi tình cờ thích mô hình Java vì lý do sau.Việc đặt mỗi lớp trong một tệp riêng lẻ sẽ thúc đẩy tái sử dụng bằng cách làm cho các lớp dễ xem 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, có thể không rõ ràng đối với các nhà phát triển khác có thể sử dụng lại các lớp đó 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 học của bạn có thể có thể được tái sử dụng, tôi sẽ đặt nó trong tập tin riêng của mình.

7

Tôi thấy mình phân chia mọi thứ khi tôi cảm thấy khó chịu với các bigness của tệp và khi cấu trúc mong muốn của sự liên quan bắt đầu xuất hiện tự nhiên. Thường thì hai giai đoạn này dường như trùng khớp nhau.

Có thể rất khó chịu nếu bạn chia nhỏ mọi thứ quá sớm, bởi vì bạn bắt đầu nhận ra rằng một trật tự hoàn toàn khác về cấu trúc là bắt buộc.

Mặt khác, khi bất kỳ tệp .java hoặc .py nào nhận được tới hơn 700 dòng, tôi bắt đầu cảm thấy khó chịu khi liên tục cố nhớ "bit cụ thể" ở đâu.

Với sự phụ thuộc vòng tròn của Python/Jython cũng có vai trò: nếu bạn cố gắng chia quá nhiều khối xây dựng cơ bản hợp tác thành các tệp riêng biệt, "hạn chế"/"không hoàn hảo" của ngôn ngữ này dường như buộc bạn phải nhóm những thứ, có lẽ là một cách hợp lý.

Để tách thành các gói, tôi không thực sự biết, nhưng tôi muốn nói có lẽ cùng một quy tắc gây 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 mức mô đun.

Các vấn đề liên quan