Có bao nhiêu lớp tôi nên đặt trong một tệp? [đóng cửa]


274

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.


8
Tôi nghĩ rằng đây là một 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 các mô-đun và gói Python> và ngoài ra đó là vấn đề ưu tiên (/ ý kiến)" - câu trả lời đó không phải là ý kiến
david.libremone

Câu trả lời:


333

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 importtuyên bố của mình .


24
Haha, tôi thích "ý nghĩa" trong trích dẫn.
cdleary

27
@cdleary: Ý thức của một người là sự điên rồ của 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 chiều phân tích và một người sẽ chia tóc cho người khác cắt và cắt nhỏ chức năng.
S.Lott

4
Các đề xuất trên phù hợp với docs.python-guide.org/en/latest/wr/structure
Mayank Jaiswal

4
Câu trả lời không thực sự trả lời câu hỏi, về khả năng đọc, thật khó để đọc các tệp có hơn 500 dòng trong đó.
Vedmant

38

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.


23

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


2
Tôi hoàn toàn đồng ý với bạn. Có một vài lớp công khai trong một tệp duy nhất là trực quan và làm cho mã khó nắm bắt, giống như ai đó muốn ẩn cấu trúc và có cảm giác bị làm cho nhột. Đặc biệt nếu bạn đến từ Java sang Python.
WebCome

Đặc biệt nếu bạn đến từ Java sang Python. Họ đã từng ném nhiều lớp trong một tệp bằng Python)
WebComer

14

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.pytệ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.


1
liên kết bị hỏng đến tài liệu Mô-đun Python. Có lẽ Mục 6.4 Modules.Packages là liên kết dự định bây giờ?
cod3monk3y

9

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.


6

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.