มันเป็นเรื่องธรรมดาหรือไม่ที่จะยกระดับ NotImplementedError สำหรับวิธีการที่การดำเนินการอยู่ระหว่างดำเนินการ แต่ไม่ได้วางแผนที่จะเป็นนามธรรมหรือไม่?


34

ฉันชอบที่จะเพิ่มNotImplementedErrorวิธีการใด ๆ ที่ฉันต้องการที่จะใช้ แต่ที่ฉันยังไม่ได้ไปรอบ ๆ เพื่อทำมัน ฉันอาจมีการนำไปใช้บางส่วนแล้ว แต่เสริมด้วยraise NotImplementedError()เพราะฉันยังไม่ชอบ ในทางตรงกันข้ามฉันก็ชอบที่จะยึดถืออนุสัญญาเพราะจะทำให้คนอื่น ๆ สามารถรักษารหัสของฉันได้ง่ายขึ้นและการประชุมอาจมีอยู่ด้วยเหตุผลที่ดี

อย่างไรก็ตามเอกสาร Pythons สำหรับสถานะNotImplementedError :

ข้อยกเว้นนี้ได้มาจาก RuntimeError ในคลาสพื้นฐานที่ผู้ใช้กำหนดเมธอด abstract ควรเพิ่มข้อยกเว้นนี้เมื่อต้องการคลาสที่ได้รับเพื่อแทนที่เมธอด

นั่นเป็นกรณีการใช้งานที่เป็นทางการที่เฉพาะเจาะจงมากกว่าที่ฉันอธิบาย มันเป็นสไตล์ที่ดีธรรมดาที่จะยกระดับNotImplementedErrorเพียงเพื่อระบุว่าส่วนหนึ่งของ API นี้เป็นงานที่อยู่ระหว่างดำเนินการหรือไม่ ถ้าไม่มีวิธีมาตรฐานที่แตกต่างกันในการบ่งชี้สิ่งนี้หรือไม่?


คุณหมายถึงอะไร "เหมาะสม"
Robert Harvey

1
@ RobertHarvey ฉันคิดว่าฉันหมายถึงการชุมนุมตามการใช้งานทั่วไป ฉันได้ใช้คำถามของฉันใหม่ตอนนี้
gerrit

1
เราใช้ C # ที่นี่เป็นหลัก แต่ข้อยกเว้นการขว้างปานั้นเป็นเรื่องแปลกที่นี่และฉันคาดหวังจากที่อื่น พักก่อนและแตกเสียงดังเป็นแนวทางที่ดีในการระบุปัญหาที่อาจเกิดขึ้นได้อย่างรวดเร็ว (อ่าน: ไม่แพง)
Telastyn

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

5
สิ่งที่คุ้มค่านี่คือสิ่งที่ Microsoft Visual Studio ทำตามค่าเริ่มต้นเมื่อคุณใช้ IDE เพื่อ "ใช้อินเทอร์เฟซ" ที่ Robert Harvey พูดว่าผลลัพธ์เป็นที่เข้าใจกันดี
catfood

คำตอบ:


34

เป็นที่น่าสังเกตว่าในขณะที่เอกสาร Python มีกรณีการใช้งาน (และอาจเป็นที่ยอมรับได้) สำหรับข้อยกเว้นนี้มันไม่ได้ยกเว้นการใช้งานในสถานการณ์อื่น ๆ โดยเฉพาะ

ฉันจะพิจารณาว่าเหมาะสมที่จะเพิ่มข้อยกเว้น NotImplementedError ถ้าคุณยังไม่ได้แทนที่เมธอดในคลาสพื้นฐาน (เพื่อตอบสนอง "อินเตอร์เฟส")

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


เอกสารสำหรับหลาม 3 สะท้อนให้เห็นถึงการใช้งานตรงนี้:

ในที่ผู้ใช้กำหนดฐานเรียนวิธีนามธรรมควรเพิ่มข้อยกเว้นนี้เมื่อพวกเขาต้องมาเรียนที่จะแทนที่วิธีการหรือในขณะที่ชั้นได้ถูกพัฒนาขึ้นเพื่อแสดงให้เห็นว่าการดำเนินงานที่แท้จริงยังคงต้องการที่จะเพิ่ม [เน้นเพิ่ม]


+1 แต่ฉันยังเพิ่มว่าสำหรับการประชุมประเภทนี้เอกสารขนาดเล็กสามารถไปไกล เช่นบันทึกย่อหนึ่งบรรทัดใน dev wiki, repo readme หรือแนวทางสไตล์ - บางอย่างเช่นนั้น - อธิบายสิ่งที่คุณใช้ในข้อยกเว้นนี้
Ben Lee

8

สิ่งนี้จะเป็นที่เข้าใจได้ไม่ว่าคุณจะทำหรือไม่ควรขึ้นอยู่กับอนุสัญญาท้องถิ่น (ทีมหรือ บริษัท ) โปรดทราบว่ามันสมเหตุสมผลน้อยลงในบริบทของ TDD เนื่องจากการทดสอบควรเป็นสิ่งที่กำหนดว่าวิธีการไม่ได้นำไปใช้

เวอร์ชันย่อคือ: ใช้ถ้าคุณและทีมของคุณเห็นว่าเหมาะสม


5
FWIW การโยนข้อยกเว้นควรเป็นวิธีที่ดีในการทำให้การทดสอบล้มเหลวถ้าด้วยเหตุผลบางอย่างคุณต้องบังคับให้ทำเช่นนั้น (มันจะมีประโยชน์ในฐานะเป็นส่วนหนึ่งของ stub Intellisense ที่เป็นนิยามของวิธี)
DougM

1

ดูเหมือนว่าNotImplementedErrorโดยทั่วไปจะมีการยกระดับสำหรับการพัฒนาคุณสมบัติของ Python เองดังต่อไปนี้:

@classmethod
def fromkeys(cls, iterable, v=None):
    # There is no equivalent method for counters because setting v=1
    # means that no element can have a count greater than one.
    raise NotImplementedError(
        'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')

Documetation

fromkeys (iterable)

วิธีการเรียนนี้ไม่ได้นำมาใช้สำหรับวัตถุเคาน์เตอร์

แหล่ง

Collections.Counter.fromkeys

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