ฉันคุ้นเคยกับโมเดล Java ที่คุณสามารถมีคลาสพับลิกหนึ่งคลาสต่อไฟล์ Python ไม่มีข้อ จำกัด นี้และฉันสงสัยว่าวิธีปฏิบัติที่ดีที่สุดในการจัดการชั้นเรียนคืออะไร
ฉันคุ้นเคยกับโมเดล Java ที่คุณสามารถมีคลาสพับลิกหนึ่งคลาสต่อไฟล์ Python ไม่มีข้อ จำกัด นี้และฉันสงสัยว่าวิธีปฏิบัติที่ดีที่สุดในการจัดการชั้นเรียนคืออะไร
คำตอบ:
ไฟล์ Python เรียกว่า "โมดูล" และเป็นวิธีหนึ่งในการจัดระเบียบซอฟต์แวร์ของคุณเพื่อให้ "สมเหตุสมผล" อีกอันคือไดเรกทอรีเรียกว่า "แพ็คเกจ"
โมดูลเป็นสิ่งที่แตกต่างที่อาจมีหนึ่งหรือสองชั้นที่เกี่ยวข้องอย่างใกล้ชิด เคล็ดลับคือโมดูลเป็นสิ่งที่คุณจะนำเข้าและคุณต้องการให้การนำเข้านั้นมีเหตุผลสำหรับผู้ที่จะอ่านดูแลรักษาและขยายซอฟต์แวร์ของคุณ
กฎนี้คือ: โมดูลเป็นหน่วยนำมาใช้ใหม่
คุณไม่สามารถใช้คลาสเดี่ยวซ้ำได้ง่าย คุณควรจะสามารถนำโมดูลกลับมาใช้ใหม่ได้โดยไม่มีปัญหาใด ๆ ทุกอย่างในห้องสมุดของคุณ (และทุกสิ่งที่คุณดาวน์โหลดและเพิ่ม) เป็นโมดูลหรือแพคเกจของโมดูล
ตัวอย่างเช่นคุณกำลังทำงานกับสิ่งที่อ่านสเปรดชีตทำการคำนวณและโหลดผลลัพธ์ลงในฐานข้อมูล คุณต้องการให้โปรแกรมหลักของคุณเป็นอย่างไร
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 )
คิดว่าการนำเข้าเป็นวิธีการจัดระเบียบรหัสของคุณในแนวคิดหรือชิ้น จำนวนคลาสที่อยู่ในการนำเข้าแต่ละรายการนั้นไม่สำคัญ สิ่งสำคัญคือองค์กรโดยรวมที่คุณแสดงด้วยimport
ข้อความของคุณ
เนื่องจากไม่มีการ จำกัด เทียมมันขึ้นอยู่กับสิ่งที่เข้าใจได้ หากคุณมีคลาสค่อนข้างสั้นคลาสง่าย ๆ ที่จัดกลุ่มอย่างมีเหตุผลให้โยนเป็น 'em หากคุณมีคลาสหรือคลาสที่ใหญ่และซับซ้อนซึ่งไม่สมเหตุสมผลสำหรับกลุ่มให้ไปหนึ่งไฟล์ต่อคลาส หรือเลือกบางสิ่งในระหว่าง Refactor เมื่อสิ่งต่าง ๆ เปลี่ยนไป
ฉันชอบโมเดล Java ด้วยเหตุผลดังต่อไปนี้ การวางแต่ละคลาสในไฟล์แต่ละไฟล์จะส่งเสริมการใช้ซ้ำโดยทำให้คลาสดูง่ายขึ้นเมื่อเรียกดูซอร์สโค้ด หากคุณมีพวงของการเรียนแบ่งออกเป็นไฟล์เดียวมันอาจจะไม่ชัดเจนให้กับนักพัฒนาอื่น ๆ ที่มีการเรียนมีที่สามารถนำมาใช้ใหม่ได้ง่ายๆโดยการเรียกดูของโครงการโครงสร้างไดเรกทอรี ดังนั้นหากคุณคิดว่าคลาสของคุณสามารถนำกลับมาใช้ใหม่ได้ฉันจะวางไว้ในไฟล์ของตัวเอง
มันทั้งหมดขึ้นอยู่กับว่าโครงการมีขนาดใหญ่เท่าไหร่ชั้นเรียนจะนานแค่ไหนหากจะใช้จากไฟล์อื่น ๆ เป็นต้น
ตัวอย่างเช่นฉันมักจะใช้ชุดของคลาสสำหรับ data-abstraction - ดังนั้นฉันอาจมี 4 หรือ 5 คลาสที่อาจมีความยาวเพียง 1 บรรทัด ( class SomeData: pass
)
มันจะโง่ที่จะแยกสิ่งเหล่านี้ออกเป็นไฟล์แยกต่างหาก - แต่เนื่องจากพวกมันอาจถูกใช้จากไฟล์ต่างกันการวางสิ่งเหล่านี้ในdata_model.py
ไฟล์แยกต่างหากจะสมเหตุสมผลแล้วฉันก็ทำได้from mypackage.data_model import SomeData, SomeSubData
หากคุณมีคลาสที่มีโค้ดจำนวนมากอาจมีบางฟังก์ชั่นที่ใช้เท่านั้นมันเป็นความคิดที่ดีที่จะแบ่งคลาสนี้และฟังก์ชั่นผู้ช่วยออกเป็นไฟล์แยกต่างหาก
คุณควรกำหนดโครงสร้างเพื่อให้คุณทำfrom mypackage.database.schema import MyModel
ไม่ได้from mypackage.email.errors import MyDatabaseModel
- ถ้าที่คุณกำลังนำเข้าจากสิ่งที่ทำให้ความรู้สึกและไฟล์ที่ไม่ได้นับหมื่นของสายยาวคุณมีการจัดอย่างถูกต้อง
เอกสารโมดูลหลามมีข้อมูลที่เป็นประโยชน์บางอย่างเกี่ยวกับแพคเกจการจัดระเบียบ
ฉันพบว่าตัวเองแยกสิ่งต่าง ๆ ออกมาเมื่อฉันรู้สึกหงุดหงิดกับความไร้เดียงสาของไฟล์และเมื่อโครงสร้างความสัมพันธ์ที่ต้องการเริ่มปรากฏขึ้นตามธรรมชาติ บ่อยครั้งที่สองขั้นตอนเหล่านี้ดูเหมือนจะขัดแย้งกัน
มันอาจจะน่ารำคาญมากถ้าคุณแยกสิ่งต่าง ๆ ออกมาเร็วเกินไปเพราะคุณเริ่มตระหนักว่าจำเป็นต้องมีการเรียงลำดับของโครงสร้างที่แตกต่างกันโดยสิ้นเชิง
ในทางกลับกันเมื่อไฟล์. java หรือ. py ใด ๆ เข้ามาเกินกว่า 700 บรรทัดฉันจะเริ่มรำคาญเมื่อพยายามจำว่า "บิตนั้น" นั้นอยู่ที่ใด
ด้วย Python / Jython การพึ่งพาคำสั่งการนำเข้าแบบวงกลมก็ดูเหมือนว่าจะมีบทบาท: ถ้าคุณพยายามแบ่งการบล็อกพื้นฐานที่ให้ความร่วมมือมากเกินไปเป็นไฟล์แยก "ข้อ จำกัด " / "ความไม่สมบูรณ์" ของภาษานี้ดูเหมือนจะบังคับให้คุณจัดกลุ่มสิ่งต่าง ๆ ในทางที่สมเหตุสมผล
ในการแยกบรรจุภัณฑ์ฉันไม่รู้จริงๆ แต่ฉันบอกว่าอาจเป็นกฎเดียวกันของความน่ารำคาญและการเกิดขึ้นของโครงสร้างความสุขที่สามารถทำงานได้ในทุกระดับของโมดุล
ฉันจะบอกว่าให้มีคลาสมากเท่าที่สามารถจัดกลุ่มอย่างมีเหตุผลในไฟล์นั้นโดยไม่ทำให้มันใหญ่และซับซ้อนเกินไป