Berapa banyak kelas yang harus saya masukkan ke dalam satu file? [Tutup]

274

Saya sudah terbiasa dengan model Java di mana Anda dapat memiliki satu kelas publik per file. Python tidak memiliki batasan ini, dan saya bertanya-tanya apa praktik terbaik untuk mengatur kelas.

brianegge
sumber
8
Saya pikir ini adalah pertanyaan yang masuk akal mengingat persyaratan dan konvensi bahasa lain, dan jawabannya adalah "<mendefinisikan modul dan paket Python> dan di luar itu masalah preferensi (/ pendapat)" - bahwa jawaban itu sendiri bukan pendapat
david.libremone

Jawaban:

333

File Python disebut "modul" dan itu salah satu cara untuk mengatur perangkat lunak Anda sehingga masuk akal. Lain adalah direktori, yang disebut "paket".

Modul adalah hal yang berbeda yang mungkin memiliki satu atau dua lusin kelas yang terkait erat. Kuncinya adalah bahwa modul adalah sesuatu yang akan Anda impor, dan Anda memerlukan impor itu agar masuk akal bagi orang-orang yang akan membaca, memelihara, dan memperluas perangkat lunak Anda.

Aturannya adalah ini: modul adalah unit penggunaan kembali .

Anda tidak dapat dengan mudah menggunakan kembali satu kelas. Anda harus dapat menggunakan kembali modul tanpa kesulitan. Semua yang ada di perpustakaan Anda (dan semua yang Anda unduh dan tambahkan) adalah modul atau paket modul.

Misalnya, Anda sedang mengerjakan sesuatu yang membaca spreadsheet, melakukan beberapa perhitungan, dan memuat hasilnya ke dalam basis data. Seperti apa program utama Anda?

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 )

Pikirkan impor sebagai cara untuk mengatur kode Anda dalam konsep atau potongan. Persisnya berapa banyak kelas dalam setiap impor tidak masalah. Yang penting adalah keseluruhan organisasi yang Anda gambarkan dengan importpernyataan Anda .

S.Lott
sumber
24
Haha, saya suka "rasa" dalam kutipan.
cdleary
27
@cdleary: Indera seseorang adalah kegilaan orang lain. Biasanya, Anda dapat mendefinisikan modul yang masuk akal. Namun, dalam aplikasi besar, selalu ada beberapa dimensi analisis dan satu orang akan memecah rambut orang lain yang mengiris dan mengupas fungsi.
S.Lott
4
Rekomendasi di atas sesuai dengan docs.python-guide.org/en/latest/writing/structure
Mayank Jaiswal
4
Jawaban yang sebenarnya tidak menjawab pertanyaan, bagaimana dengan keterbacaan, sulit untuk membaca file dengan lebih dari 500 baris di dalamnya.
Vedmant
38

Karena tidak ada batasan buatan, itu benar-benar tergantung pada apa yang dapat dipahami. Jika Anda memiliki banyak kelas yang cukup pendek dan sederhana yang secara logis dikelompokkan bersama, lemparkan ke mereka. Jika Anda memiliki kelas besar atau kompleks atau kelas yang tidak masuk akal sebagai grup, buka satu file per kelas. Atau pilih sesuatu di antaranya. Refactor saat keadaan berubah.

Chris Upchurch
sumber
23

Saya menyukai model Java karena alasan berikut. Menempatkan setiap kelas dalam satu file mempromosikan penggunaan kembali dengan membuat kelas lebih mudah dilihat ketika menelusuri kode sumber. Jika Anda memiliki banyak kelas yang dikelompokkan ke dalam satu file, mungkin tidak jelas bagi pengembang lain bahwa ada kelas di sana yang dapat digunakan kembali hanya dengan menelusuri struktur direktori proyek . Jadi, jika Anda berpikir bahwa kelas Anda mungkin dapat digunakan kembali, saya akan meletakkannya di file sendiri.

Raffi Khatchadourian
sumber
2
Saya sangat setuju dengan anda. Memiliki beberapa kelas publik dalam satu file bertentangan dengan intuisi dan membuat kode sulit untuk dipahami, seperti seseorang yang ingin menyembunyikan struktur dan memiliki perasaan dibuat menggelitik. Terutama jika Anda berasal dari Jawa ke Python.
WebComer
Terutama jika Anda berasal dari Jawa ke Python. Mereka biasa melempar banyak kelas dalam satu file dengan Python)
WebComer
14

Ini sepenuhnya tergantung pada seberapa besar proyeknya, berapa lama kelasnya, apakah mereka akan digunakan dari file lain dan seterusnya.

Sebagai contoh, saya cukup sering menggunakan serangkaian kelas untuk abstraksi data - jadi saya mungkin memiliki 4 atau 5 kelas yang mungkin hanya sepanjang 1 baris ( class SomeData: pass).

Akan sangat bodoh untuk membagi masing-masing menjadi file yang terpisah - tetapi karena mereka dapat digunakan dari file yang berbeda, menempatkan semua ini dalam data_model.pyfile yang terpisah akan masuk akal, jadi saya bisa melakukanfrom mypackage.data_model import SomeData, SomeSubData

Jika Anda memiliki kelas dengan banyak kode di dalamnya, mungkin dengan beberapa fungsi yang hanya digunakan, itu akan menjadi ide yang baik untuk membagi kelas ini dan fungsi helper menjadi file yang terpisah.

Anda harus menyusunnya sehingga Anda melakukannya from mypackage.database.schema import MyModel, bukan from mypackage.email.errors import MyDatabaseModel- jika di mana Anda mengimpor sesuatu tidak masuk akal, dan file tidak panjangnya puluhan ribu baris, Anda telah mengaturnya dengan benar.

The dokumentasi Python Modul memiliki beberapa informasi yang berguna tentang pengorganisasian paket.

dbr
sumber
1
tautan rusak ke dokumentasi Modul Python. Mungkin Bagian 6.4 Modul. Paket adalah tautan yang dimaksud sekarang?
cod3monk3y
9

Saya menemukan diri saya membagi hal-hal ketika saya merasa terganggu dengan besarnya file dan ketika struktur yang diinginkan dari keterkaitan mulai muncul secara alami. Seringkali kedua tahap ini tampaknya bertepatan.

Ini bisa sangat menjengkelkan jika Anda memecah hal-hal terlalu dini, karena Anda mulai menyadari bahwa pemesanan struktur yang sama sekali berbeda diperlukan.

Di sisi lain, ketika file .java atau .py mencapai lebih dari sekitar 700 baris, saya mulai merasa kesal terus-menerus mencoba mengingat di mana "bit khusus" itu.

Dengan dependensi melingkar dari pernyataan impor Python / Jython juga tampaknya berperan: jika Anda mencoba membagi terlalu banyak blok bangunan dasar menjadi file terpisah, "pembatasan" / "ketidaksempurnaan" bahasa ini tampaknya memaksa Anda untuk mengelompokkan berbagai hal, mungkin dengan cara yang agak masuk akal.

Untuk membagi menjadi beberapa paket, saya tidak benar-benar tahu, tapi saya akan mengatakan mungkin aturan yang sama tentang gangguan dan kemunculan struktur senang bekerja di semua tingkat modularitas.

mike rodent
sumber
6

Saya akan mengatakan untuk menempatkan kelas sebanyak yang secara logis dapat dikelompokkan dalam file itu tanpa membuatnya terlalu besar dan kompleks.

Jason Baker
sumber