ขึ้นอยู่กับว่าคุณยืนอยู่ตรงไหนในวงจรการพัฒนา แต่บางครั้งเมื่อร่างอัลกอริทึมคุณต้องการทำให้นามธรรมเกี่ยวกับบล็อกที่ซับซ้อนโดยไม่ต้องใช้มันในทันที
def full_algo():
init_stuff()
process_stuff()
...
คุณรู้ว่าinit_stuff
จะทำงานอย่างไรมันค่อนข้างง่ายในหัวของคุณ แต่คุณไม่ต้องการมันทันทีดังนั้นคุณจึงประกาศว่ามันเป็นฟังก์ชั่นที่ว่างเปล่า มันจะช่วยให้รหัสของคุณในการรวบรวมและเรียกใช้โดยไม่ต้องใส่ใจกับรายละเอียดเต็มไปด้วยเลือด
การใช้งานอื่นสำหรับแอพพลิเคชั่นที่ปล่อยออกมาคือเมื่อใช้การสืบทอด สมมติว่าคุณมีคลาสขนาดใหญ่ที่กำหนดลักษณะการทำงานของรหัสเฉพาะแพลตฟอร์ม คุณอาจท้ายด้วยตรรกะที่คล้ายกับสิ่งนี้:
init_filesystem();
access_files();
release_filesystem();
รหัสนี้จะทำงานกับหลาย ๆ แพลตฟอร์ม แต่บางแพลตฟอร์มอาจไม่ต้องการเริ่มต้นระบบไฟล์ จากนั้นการสืบทอดของคุณจะมีลักษณะเช่นนี้ (เสมือนกับ = 0 ใน C ++ หมายถึงคลาสที่ได้รับต้องใช้วิธีการเหล่านั้น):
class FileSystem{
virtual void init_filesystem() = 0;
virtual void access_files() = 0;
virtual void release_filesystem() = 0;
};
จากนั้นการใช้งานเฉพาะของคลาสนี้ (อินเทอร์เฟซ) อาจไม่ทำอะไรเลยสำหรับบางวิธี อีกทางเลือกหนึ่งคลาสพื้นฐานสามารถประกาศวิธีการที่ว่างเปล่าสำหรับ init / release แทนที่จะประกาศพวกเขาเสมือน
ในที่สุด (และน่าอับอาย) บางครั้งคุณก็รักษาแอปพลิเคชันที่เก่ามาก คุณกลัวว่าวิธีการลบจะทำลายสิ่งต่าง ๆ สิ่งนี้เกิดขึ้นเมื่อคุณมีการสืบทอดที่ซับซ้อนที่ไม่เข้าใจอย่างถูกต้องหรือเมื่อคุณมีพอยน์เตอร์ของฟังก์ชันจำนวนมาก (การเรียกกลับ) คุณเพียงแค่ลบรหัสด้านในของพวกเขาเพื่อให้พวกเขาได้รับการเรียกต่อไปโดยไม่ทำลายอะไรเลย