ฉันควรใส่คลาสกี่ไฟล์ในหนึ่งไฟล์? [ปิด]


274

ฉันคุ้นเคยกับโมเดล Java ที่คุณสามารถมีคลาสพับลิกหนึ่งคลาสต่อไฟล์ Python ไม่มีข้อ จำกัด นี้และฉันสงสัยว่าวิธีปฏิบัติที่ดีที่สุดในการจัดการชั้นเรียนคืออะไร


8
ฉันคิดว่านี่เป็นคำถามที่สมเหตุสมผลเนื่องจากข้อกำหนดและระเบียบของภาษาอื่นและคำตอบคือ "<กำหนดโมดูลและแพ็คเกจ Python> และนอกเหนือจากนั้นมันเป็นเรื่องของการตั้งค่า (/ ความเห็น)" - คำตอบนั้นไม่ได้เป็นความเห็น
david.libremone

คำตอบ:


333

ไฟล์ 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ข้อความของคุณ


24
ฮ่าฮ่าฉันชอบ "ความรู้สึก" ในใบเสนอราคา
cdleary

27
@cdleary: ความรู้สึกของคนคนหนึ่งเป็นบ้าของอีกคนหนึ่ง โดยปกติคุณสามารถกำหนดโมดูลที่เหมาะสมได้ อย่างไรก็ตามในแอปพลิเคชันขนาดใหญ่มีการวิเคราะห์หลายมิติอยู่เสมอและคนคนหนึ่งจะแยกเส้นขนออกเป็นส่วน ๆ และแบ่งส่วนการทำงาน
S.Lott

4
คำแนะนำข้างต้นสอดคล้องกับdocs.python-guide.org/en/latest/writing/structure
Mayank Jaiswal

4
คำตอบที่ไม่ตอบคำถามจริง ๆ แล้วความสามารถในการอ่านมันยากที่จะอ่านไฟล์ที่มีมากกว่า 500 บรรทัด
Vedmant

38

เนื่องจากไม่มีการ จำกัด เทียมมันขึ้นอยู่กับสิ่งที่เข้าใจได้ หากคุณมีคลาสค่อนข้างสั้นคลาสง่าย ๆ ที่จัดกลุ่มอย่างมีเหตุผลให้โยนเป็น 'em หากคุณมีคลาสหรือคลาสที่ใหญ่และซับซ้อนซึ่งไม่สมเหตุสมผลสำหรับกลุ่มให้ไปหนึ่งไฟล์ต่อคลาส หรือเลือกบางสิ่งในระหว่าง Refactor เมื่อสิ่งต่าง ๆ เปลี่ยนไป


23

ฉันชอบโมเดล Java ด้วยเหตุผลดังต่อไปนี้ การวางแต่ละคลาสในไฟล์แต่ละไฟล์จะส่งเสริมการใช้ซ้ำโดยทำให้คลาสดูง่ายขึ้นเมื่อเรียกดูซอร์สโค้ด หากคุณมีพวงของการเรียนแบ่งออกเป็นไฟล์เดียวมันอาจจะไม่ชัดเจนให้กับนักพัฒนาอื่น ๆ ที่มีการเรียนมีที่สามารถนำมาใช้ใหม่ได้ง่ายๆโดยการเรียกดูของโครงการโครงสร้างไดเรกทอรี ดังนั้นหากคุณคิดว่าคลาสของคุณสามารถนำกลับมาใช้ใหม่ได้ฉันจะวางไว้ในไฟล์ของตัวเอง


2
ฉันเห็นด้วยกับคุณโดยสิ้นเชิง การมีคลาสสาธารณะหลายไฟล์ในไฟล์เดียวนั้นตรงกันข้ามกับสัญชาตญาณและทำให้โค้ดยากต่อการเข้าใจเช่นมีคนต้องการซ่อนโครงสร้างและมีความรู้สึกว่าถูกทำให้ยุ่งเหยิง โดยเฉพาะถ้าคุณมาจาก Java ถึง Python
ดูแลเว็บ

โดยเฉพาะถ้าคุณมาจาก Java ถึง Python พวกเขาเคยโยนหลาย ๆ คลาสในหนึ่งไฟล์ใน Python)
WebComer

14

มันทั้งหมดขึ้นอยู่กับว่าโครงการมีขนาดใหญ่เท่าไหร่ชั้นเรียนจะนานแค่ไหนหากจะใช้จากไฟล์อื่น ๆ เป็นต้น

ตัวอย่างเช่นฉันมักจะใช้ชุดของคลาสสำหรับ 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- ถ้าที่คุณกำลังนำเข้าจากสิ่งที่ทำให้ความรู้สึกและไฟล์ที่ไม่ได้นับหมื่นของสายยาวคุณมีการจัดอย่างถูกต้อง

เอกสารโมดูลหลามมีข้อมูลที่เป็นประโยชน์บางอย่างเกี่ยวกับแพคเกจการจัดระเบียบ


1
ลิงก์ที่ขาดไปยังเอกสารของโมดูล Python บางทีมาตรา 6.4 โมดูลแพคเกจคือลิงค์ที่ตั้งใจไว้ตอนนี้หรือไม่
cod3monk3y

9

ฉันพบว่าตัวเองแยกสิ่งต่าง ๆ ออกมาเมื่อฉันรู้สึกหงุดหงิดกับความไร้เดียงสาของไฟล์และเมื่อโครงสร้างความสัมพันธ์ที่ต้องการเริ่มปรากฏขึ้นตามธรรมชาติ บ่อยครั้งที่สองขั้นตอนเหล่านี้ดูเหมือนจะขัดแย้งกัน

มันอาจจะน่ารำคาญมากถ้าคุณแยกสิ่งต่าง ๆ ออกมาเร็วเกินไปเพราะคุณเริ่มตระหนักว่าจำเป็นต้องมีการเรียงลำดับของโครงสร้างที่แตกต่างกันโดยสิ้นเชิง

ในทางกลับกันเมื่อไฟล์. java หรือ. py ใด ๆ เข้ามาเกินกว่า 700 บรรทัดฉันจะเริ่มรำคาญเมื่อพยายามจำว่า "บิตนั้น" นั้นอยู่ที่ใด

ด้วย Python / Jython การพึ่งพาคำสั่งการนำเข้าแบบวงกลมก็ดูเหมือนว่าจะมีบทบาท: ถ้าคุณพยายามแบ่งการบล็อกพื้นฐานที่ให้ความร่วมมือมากเกินไปเป็นไฟล์แยก "ข้อ จำกัด " / "ความไม่สมบูรณ์" ของภาษานี้ดูเหมือนจะบังคับให้คุณจัดกลุ่มสิ่งต่าง ๆ ในทางที่สมเหตุสมผล

ในการแยกบรรจุภัณฑ์ฉันไม่รู้จริงๆ แต่ฉันบอกว่าอาจเป็นกฎเดียวกันของความน่ารำคาญและการเกิดขึ้นของโครงสร้างความสุขที่สามารถทำงานได้ในทุกระดับของโมดุล


6

ฉันจะบอกว่าให้มีคลาสมากเท่าที่สามารถจัดกลุ่มอย่างมีเหตุผลในไฟล์นั้นโดยไม่ทำให้มันใหญ่และซับซ้อนเกินไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.