ฉันควรซ้อนฟังก์ชันในภาษาที่อนุญาตให้ทำเช่นนั้นหรือควรหลีกเลี่ยง


12

ใน JavaScript, PL / SQL และภาษาอื่น ๆ บางฟังก์ชั่นสามารถซ้อนกันเช่นประกาศในฟังก์ชั่นอื่น สิ่งนี้สามารถใช้เพื่อแบ่งฟังก์ชั่นขนาดใหญ่ออกเป็นชิ้นเล็ก ๆ แต่เก็บชิ้นส่วนเหล่านั้นไว้ในบริบทของฟังก์ชั่นที่ใหญ่กว่า

function doTooMuch() {
    function doSomething () {
       ...
    }
    function doSomethingElse() {
       ...
    }
    function doYetAnotherThing() {
       ...
    }

    // doTooMuch body

    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

ในบางกรณีเมื่อฟังก์ชั่นขนาดเล็กเหล่านั้นไม่ได้ใช้ตัวแปรท้องถิ่นของฟังก์ชั่นขนาดใหญ่สิ่งนี้สามารถเปลี่ยนเป็นเวอร์ชั่นที่ฟังก์ชั่นทั้งหมดไม่ถูกรบกวนได้ง่าย

function doSomething () {
   ...
}
function doSomethingElse() {
   ...
}
function doYetAnotherThing() {
   ...
}
function doTooMuch() {
    doSomething();
    doSomethingElse();
    doYetAnotherThing();
}

สมมติว่าฟังก์ชั่นที่ซ้อนกันนั้นไม่ควรใช้ที่อื่นมันจะดีกว่าหรือไม่ที่จะเก็บไว้ในบริบทของฟังก์ชั่นขนาดใหญ่หรือไม่ดีเพราะนี่คือสิ่งที่ทำให้ฟังก์ชั่นขนาดใหญ่ดีขนาดใหญ่?

คำตอบ:


8

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

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

โดยทั่วไปแล้วเป็นเครื่องมือที่ยอดเยี่ยมเมื่อใช้อย่างถูกต้อง แต่เป็นเครื่องมือที่ซับซ้อนเนื่องจากอาจทำให้เกิดผลที่ไม่ชัดเจนหรือไม่ชัดเจนเมื่อคุณมองดูโค้ดเป็นครั้งแรก

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

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

ท้ายที่สุดถ้าการประกาศฟังก์ชั่นของคุณประกาศฟังก์ชั่นที่มีชื่ออยู่นอกขอบเขตของฟังก์ชั่นการล้อมรอบให้หลีกเลี่ยงมัน นั่นเป็นสิ่งที่สร้างความสับสนให้กับทุกคน

เกี่ยวกับการบันทึกสุดท้าย: เนื่องจากรหัสแต่ละฟังก์ชั่ช่วยเหลือคั่นฟังก์ชั่นการทำรังจะลำบากน้อยกว่าฟังก์ชั่นยักษ์เดียว แต่ในท้ายที่สุดมันจะหมายถึงการอ่านรหัสอื่น ๆ จำนวนมากที่จะเข้าใจdoTooMuch()- โดยเฉพาะอย่างยิ่งถ้าคุณสามารถซ่อนรหัสระหว่างการประกาศฟังก์ชั่นที่ซ้อนกันหรือ ต้องตรวจสอบว่าไม่มีใครทำ


-1: Javascript ไม่ใช่ "ภาษาส่วนใหญ่" ฟังก์ชั่นการทำรังใน Javascript เป็นวิธีปฏิบัติปกติ
วินไคลน์

2
@kevincline ฟังก์ชันการซ้อนใน JavaScript เป็นวิธีปฏิบัติที่ไม่ดีทั่วไป
Raynos

@ Raynos: ถ้าคุณไม่ทำรังคุณจะเอาพวกมันไปที่ไหน? พวกเขาไม่มีชั้นเรียนที่จะมีพวกเขา นี่คือรหัสทั่วไปบางส่วน:jquery(function($){ $('#id').click(function(){...}); }
kevin cline

@kevincline ... โค้ดทั่วไปสำหรับ noobs คุณต้องมีฟังก์ชั่นที่ซ้อนกันลึกหนึ่งรายการ และนั่นเป็นเพราะจาวาสคริปต์ไม่มีขอบเขตของโมดูลดังนั้นคุณต้องมีการปิดนิรนาม
Raynos

และถ้าคลิกนั้นจะเรียกใช้ Ajax ด้วยการเรียกกลับที่สมบูรณ์? ตอนนี้คุณมีฟังก์ชั่นซ้อนกันสองระดับ แน่นอนว่าคุณสามารถ จำกัด การซ้อนได้โดยกำหนดการปิดแบบไม่ระบุชื่อให้กับตัวแปร มันดีกว่าจริงเหรอ?
kevin cline

2

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


0

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

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