ถือว่าเป็น Pythonic ที่มีหลายคลาสที่กำหนดไว้ในไฟล์เดียวกันหรือไม่?


31

ในการทำงานกับ python เป็นครั้งแรกฉันพบว่าฉันเขียนหลายคลาสในไฟล์เดียวกันซึ่งตรงข้ามกับภาษาอื่นเช่น Java ซึ่งใช้หนึ่งไฟล์ต่อหนึ่งคลาส

โดยปกติแล้วคลาสเหล่านี้จะประกอบไปด้วยคลาสฐานนามธรรม 1 ชุดโดยมีการใช้งานอย่างเป็นรูปธรรม 1-2 รายการซึ่งการใช้งานแตกต่างกันเล็กน้อย ฉันโพสต์ไฟล์ดังกล่าวหนึ่งไฟล์ด้านล่าง:

class Logger(object):

    def __init__(self, path, fileName):
        self.logFile = open(path + '/' + filename, 'w+')
        self.logFile.seek(0, 2)

    def log(self, stringtoLog):
        self.logFile.write(stringToLog)

    def __del__(self):
        self.logFile.close()

class TestLogger(Logger):   

    def __init__(self, serialNumber):
        Logger.__init__('/tests/ModuleName', serialNumber):

    def readStatusLine(self):
        self.logFile.seek(0,0)
        statusLine = self.logFile.readLine()
        self.logFile.seek(0,2)
        return StatusLine

    def modifyStatusLine(self, newStatusLine):
        self.logFile.seek(0,0)
        self.logFile.write(newStatusLine)
        self.logFile.seek(0,2)

class GenericLogger(Logger):

    def __init__(self, fileName):
        Logger.__init__('/tests/GPIO', fileName):

    def logGPIOError(self, errorCode):
        self.logFile.write(str(errorCode))

ดังที่เห็นด้านบนฉันมีคลาสฐาน Logger ที่มีความแตกต่างของการใช้งานสองด้านล่าง

คำถาม: เป็นมาตรฐานสำหรับงูใหญ่หรือภาษาใด ๆ ? ปัญหาใดที่อาจเกิดขึ้นจากการใช้การดำเนินการนี้ถ้ามี?

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


3
การ จำกัด หนึ่งคลาสต่อไฟล์ไม่ใช่สิ่ง C ++ Java เป็นภาษาเดียวที่ฉันรู้ว่าที่ใดควรหลีกเลี่ยง ใน C ++ มันเป็นเรื่องธรรมดามากสำหรับไฟล์. h / .cpp ไฟล์เดียวที่จะมีคลาสหลักหนึ่งคลาสและคลาสตัวช่วยมากมายซึ่งอาจเป็นหรือไม่เป็นส่วนตัวของคลาสหลัก
Gort the Robot

@StevenBurnap ฉันลบ c ++ เป็นตัวอย่างตามที่คุณถูกต้อง
Ampt

1
มันยังทำใน PHP เพื่ออำนวยความสะดวกในการโหลดอัตโนมัติ ในทางกลับกันใน php คุณสามารถประกาศ namespace ได้อย่างชัดเจน
bodo

คำตอบ:


24

ทุกอย่างปกติดี. มันใช้ได้ดีใน C ++ เช่นกันสำหรับการอ้างอิง

การรักษาสิ่งต่าง ๆ ให้แน่นเข้าด้วยกันเป็นการฝึกฝนที่สมเหตุสมผล การหลีกเลี่ยงการแต่งงานกันที่ไม่เหมาะสมเป็นวิธีปฏิบัติที่ดีเช่นกัน การสร้างสมดุลที่เหมาะสมไม่ได้เป็นเรื่องของกฎที่เข้มงวด แต่อย่างหนึ่งก็คือสร้างความสมดุลระหว่างความกังวลที่แตกต่างกัน

กฎบางข้อของหัวแม่มือ:

  1. ขนาด

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

  2. การแยกความกังวล

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

    ดังนั้นบางครั้งมันก็อาจจะมีเหตุผลที่จะพิจารณาการมีเพศสัมพันธ์ย่อยเรียนเพื่อการอ้างอิงของพวกเขาเมื่อเทียบกับการมีเพศสัมพันธ์ของพวกเขาไปอินเตอร์เฟซ (หรือตรงกันข้ามความกังวลของการใช้อินเตอร์เฟซที่อ่อนแอกว่าความกังวลภายในเพื่อการใช้งานที่)

    เป็นตัวอย่างเฉพาะใช้อินเทอร์เฟซฐานข้อมูลทั่วไป การติดตั้งที่เป็นรูปธรรมโดยใช้ DB ในหน่วยความจำ SQL RDBMS และแบบสอบถามบนเว็บตามลำดับอาจไม่มีอะไรที่แตกต่างจากอินเตอร์เฟสและบังคับให้ทุกคนที่ต้องการรุ่นในหน่วยความจำที่มีน้ำหนักเบาเพื่อนำเข้าไลบรารี SQL

  3. encapsulation

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

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


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

1
ฉันได้แก้ไขคำถามเพื่อชี้ให้เห็นว่านี่เป็นเพียงตัวอย่างของสิ่งที่ฉันหมายถึงและไม่ได้เป็นตัวแทนของธรรมชาติของคำถาม ทำไมทำให้ไฟล์เหล่านั้นอยู่ในไฟล์เดียวกันดีกว่าเพียงแค่นำเข้าไฟล์เหล่านั้นเมื่อจำเป็น
Ampt

การมีไฟล์ขนาดเล็กจำนวนมากอาจเป็นเรื่องยากที่จะจัดการเช่นเดียวกับการมีไฟล์ขนาดยักษ์จำนวนน้อย Python เป็นภาษาที่ค่อนข้างสั้น ตัวอย่างของคุณแสดงสิ่งนี้ คลาสทั้งสามนั้นมีความสัมพันธ์โดยตรงและน่าจะพอดีในหน้าต่างตัวแก้ไขเดียวโดยไม่ต้องเลื่อน
Gort the Robot

1
@ GlenH7 - ฉันไม่แน่ใจเกี่ยวกับการอ้างอิงเนื่องจากพวกเขาเพียงแค่เปลี่ยนจากฉันทำการเรียกร้องโดยตรงเพื่อฉันที่อ้างว่าอคติการเลือกของฉันถูกต้อง ฉันพยายามเน้นคำอธิบายแทน
ไร้ประโยชน์

7

เอกสารอ้างอิงปกติของฉันเพื่อทราบว่าไพ ธ อนคืออะไร

เรียบง่ายดีกว่าซับซ้อน

แบนดีกว่าซ้อนกัน

จากThe Zen Of Python

เกือบจะไม่มีข้อยกเว้นชื่อคลาสใช้การประชุม CapWords

ชื่อแพ็กเกจและโมดูลโมดูลควรมีชื่อแบบย่อและตัวพิมพ์เล็กทั้งหมด [... ] ชื่อโมดูลจะถูกแมปกับชื่อไฟล์

จากPEP 8

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


7
คุณช่วยลดสิ่งนี้ลงไปในส่วนที่เกี่ยวข้องกับคำถามได้หรือไม่? ฉันได้อ่านหลายครั้งทั้งสองครั้ง แต่ฉันรู้สึกลำบากในการเลือกว่าส่วนใดที่เกี่ยวข้องกับคำถามปัจจุบันของฉัน
Ampt

1
แน่นอนฉันได้แก้ไขคำตอบของฉัน
SylvainD

1

ตอนนี้คุณมีอะไรดี ไปและเรียกดูไลบรารีมาตรฐาน - มีโมดูลมากมายพร้อมคลาสที่เกี่ยวข้องหลายรายการในไฟล์เดียว เมื่อถึงจุดหนึ่งสิ่งต่างๆก็ใหญ่ขึ้นเรื่อย ๆ และในที่สุดคุณก็อยากจะเริ่มใช้โมดูลที่มีหลายไฟล์ แต่ก็ไม่มีกฎที่แท้จริงว่าเมื่อใด สิ่งต่าง ๆ จะแตกเมื่อไฟล์หนึ่งเริ่มรู้สึก 'ใหญ่เกินไป'


0

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


-1

ในระยะสั้น - นรกใช่

นอกจากนี้การมีหลายคลาสในไฟล์เดียวก็มีประโยชน์มาก แพคเกจบางอย่าง ( six, bottle) จัดส่งอย่างชัดเจนในไฟล์เดียวเพื่อรวมเข้ากับโมดูลบุคคลที่สามได้อย่างง่ายดายโดยไม่ต้องติดตั้งจุดเล็ก ๆ (บางครั้งเป็นที่ต้องการ) แต่อย่าลืมจัดระเบียบรหัสของคุณให้ดี ใช้ความคิดเห็นโค้ดและบล็อกการแยกอย่างเข้มข้นเพื่อให้สามารถอ่านได้ง่ายขึ้น


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