Dosya başına bir ortak sınıfa sahip olabileceğiniz Java modeline alışkınım. Python'un bu kısıtlaması yok ve sınıfları düzenlemek için en iyi uygulamanın ne olduğunu merak ediyorum.
Dosya başına bir ortak sınıfa sahip olabileceğiniz Java modeline alışkınım. Python'un bu kısıtlaması yok ve sınıfları düzenlemek için en iyi uygulamanın ne olduğunu merak ediyorum.
Yanıtlar:
Python dosyasına "modül" denir ve yazılımınızı "mantıklı" olacak şekilde düzenlemenin bir yoludur. Diğeri ise "paket" adı verilen bir dizindir.
Bir modül, bir veya iki düzine yakından ilişkili sınıfa sahip olabilecek farklı bir şeydir. İşin püf noktası, bir modülün içe aktaracağınız bir şey olması ve bu içe aktarmanın yazılımınızı okuyacak, koruyacak ve genişletecek kişilere mükemmel bir şekilde duyarlı olması gerekir.
Kural şudur: bir modül yeniden kullanım birimidir .
Tek bir sınıfı kolayca yeniden kullanamazsınız. Herhangi bir zorluk çekmeden bir modülü tekrar kullanabilmeniz gerekir. Kütüphanenizdeki her şey (ve indirip eklediğiniz her şey) bir modül veya bir modül paketidir.
Örneğin, elektronik tabloları okuyan, bazı hesaplamalar yapan ve sonuçları bir veritabanına yükleyen bir şey üzerinde çalışıyorsunuz. Ana programınızın neye benzemesini istiyorsunuz?
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 )
İçe aktarmayı kodunuzu kavramlar veya parçalar halinde düzenlemenin bir yolu olarak düşünün. Her bir içe aktarmada tam olarak kaç sınıfın olduğu önemli değildir. Önemli olan, import
ifadelerinizle tasvir ettiğiniz genel kuruluştur .
Yapay bir sınır olmadığından, gerçekten anlaşılabilir olana bağlıdır. Mantıksal olarak birlikte gruplandırılmış oldukça kısa, basit sınıflardan bir grup varsa, bir grup 'a atın. Grup olarak anlamlı olmayan büyük, karmaşık sınıflarınız veya sınıflarınız varsa, sınıf başına bir dosya gidin. Ya da arada bir şey seçin. İşler değiştikçe refactor.
Java modelini aşağıdaki nedenden dolayı beğeniyorum. Her sınıfı ayrı bir dosyaya yerleştirmek, kaynak koduna göz atarken sınıfların daha kolay görülmesini sağlayarak yeniden kullanımı teşvik eder. Tek bir dosyada gruplandırılmış bir grup sınıfınız varsa, diğer geliştiriciler için sadece projenin dizin yapısına göz atarak yeniden kullanılabilecek sınıflar olduğu açık olmayabilir . Böylece, sınıfınızın yeniden kullanılabileceğini düşünüyorsanız, onu kendi dosyasına koyacağım.
Tamamen projenin ne kadar büyük olduğuna, sınıfların ne kadar sürdüğüne, diğer dosyalardan kullanılacakları vb.
Örneğin, veri soyutlama için sık sık bir dizi sınıf kullanıyorum - bu yüzden sadece 1 satır uzunluğunda olabilen 4 veya 5 sınıfım olabilir ( class SomeData: pass
).
Bunların her birini ayrı dosyalara bölmek aptalca olurdu - ancak farklı dosyalardan kullanılabildikleri için, bunları ayrı bir data_model.py
dosyaya koymak mantıklı olurdu, böylece yapabilirimfrom mypackage.data_model import SomeData, SomeSubData
İçinde çok sayıda kod bulunan bir sınıfınız varsa, belki de yalnızca bazı işlevlerde kullanıldığında, bu sınıfı ve yardımcı işlevleri ayrı bir dosyaya bölmek iyi bir fikir olacaktır.
Onları öyle yapmalısınız from mypackage.database.schema import MyModel
, değil from mypackage.email.errors import MyDatabaseModel
- bir şeyleri mantıklı bir şekilde içe aktardığınız yerde ve dosyalar on binlerce satır uzunluğunda değilse, doğru bir şekilde düzenlediniz.
Python Modülleri dokümantasyon paketleri organize bazı yararlı bilgiler.
Dosyaların huzursuzluğundan rahatsız olduğumda ve arzu edilen ilişkisel yapı doğal olarak ortaya çıkmaya başladığında kendimi bir şeyleri parçalarken buluyorum. Genellikle bu iki aşama çakışıyor gibi görünmektedir.
İşleri çok erken ayırırsanız çok can sıkıcı olabilir, çünkü tamamen farklı bir yapı düzeninin gerekli olduğunu fark etmeye başlarsınız.
Öte yandan, herhangi bir .java veya .py dosyası 700'den fazla satıra ulaştığında sürekli "o bit" in nerede olduğunu hatırlamaya çalışırken sinirlenmeye başlıyorum.
Python / Jython ile içe aktarma ifadelerinin dairesel bağımlılığı da bir rol oynuyor gibi görünüyor: çok fazla işbirliği yapan temel yapı taşını ayrı dosyalara bölmeye çalışırsanız, dilin bu "kısıtlaması" / "kusurları" sizi bir şeyleri gruplandırmaya zorlar gibi görünüyor, belki daha mantıklı bir şekilde.
Paketlere ayrılma konusunda, gerçekten bilmiyorum, ama muhtemelen aynı canlandırma ve mutlu yapının ortaya çıkması kuralının tüm modülerlik seviyelerinde işe yaradığını söyleyebilirim.
Ben çok büyük ve karmaşık yapmadan bu dosyada mantıksal olarak gruplandırılabilir kadar çok sınıf koymak söyleyebilirim.