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.
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.
Jawaban:
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 import
pernyataan Anda .
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.
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.
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.py
file 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.
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.
Saya akan mengatakan untuk menempatkan kelas sebanyak yang secara logis dapat dikelompokkan dalam file itu tanpa membuatnya terlalu besar dan kompleks.