เมื่อฉันแยกวิธีการขนาดใหญ่ (หรือขั้นตอนหรือฟังก์ชั่น - คำถามนี้ไม่เฉพาะเจาะจงกับ OOP แต่เนื่องจากฉันทำงานในภาษา OOP 99% ของเวลามันเป็นคำศัพท์ที่ฉันรู้สึกสบายใจที่สุด) เป็นคำเล็ก ๆ ฉันมักจะพบว่าตัวเองไม่พอใจกับผลลัพธ์ มันยากที่จะให้เหตุผลเกี่ยวกับวิธีการขนาดเล็กเหล่านี้มากกว่าเมื่อพวกเขาเป็นเพียงบล็อกของรหัสในใหญ่เพราะเมื่อฉันแยกพวกเขาฉันสูญเสียสมมติฐานพื้นฐานมากมายที่มาจากบริบทของผู้โทร
ต่อมาเมื่อฉันดูรหัสนี้และดูวิธีการต่าง ๆ ฉันไม่รู้ทันทีว่าพวกเขาจะเรียกจากที่ไหนและคิดว่าเป็นวิธีการส่วนตัวแบบธรรมดาที่สามารถเรียกได้จากทุกที่ในไฟล์ ตัวอย่างเช่นลองจินตนาการถึงวิธีการเริ่มต้น (ตัวสร้างหรืออื่น ๆ ) แบ่งออกเป็นชุดของตัวเล็ก: ในบริบทของวิธีการเองคุณรู้ชัดเจนว่าสถานะของวัตถุนั้นยังคงไม่ถูกต้อง แต่ในวิธีส่วนตัวปกติคุณอาจไปจากสมมติฐานว่าวัตถุนั้น เริ่มต้นแล้วและอยู่ในสถานะที่ถูกต้อง
ทางออกเดียวที่ฉันเคยเห็นคือwhere
clause ใน Haskell ซึ่งช่วยให้คุณกำหนดฟังก์ชันขนาดเล็กที่ใช้เฉพาะในฟังก์ชัน "parent" โดยทั่วไปดูเหมือนว่านี้:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
แต่ภาษาอื่นที่ฉันใช้ไม่มีอะไรแบบนี้ - สิ่งที่ใกล้เคียงที่สุดคือการกำหนดแลมบ์ดาในขอบเขตท้องถิ่นซึ่งอาจทำให้สับสนมากขึ้น
ดังนั้นคำถามของฉันคือ - คุณพบสิ่งนี้และคุณยังเห็นว่านี่เป็นปัญหาหรือไม่ หากคุณทำเช่นนั้นคุณจะแก้ปัญหาอย่างไรโดยเฉพาะในภาษา OOP "ที่สำคัญ" เช่น Java / C # / C ++
แก้ไขเกี่ยวกับรายการที่ซ้ำกัน:ตามที่คนอื่นสังเกตเห็นมีคำถามที่พูดถึงวิธีการแยกและคำถามเล็ก ๆ ที่เป็นแบบตอร์ปิโดอยู่แล้ว ผมอ่านพวกเขาและพวกเขาไม่ได้หารือเกี่ยวกับปัญหาของข้อสมมติฐานที่ว่าจะได้รับจากบริบทของผู้โทร (ในตัวอย่างข้างต้นวัตถุถูก initialised) นั่นคือประเด็นคำถามของฉันและนั่นเป็นสาเหตุที่คำถามของฉันแตกต่างกัน
อัปเดต:หากคุณทำตามคำถามและการสนทนาที่อยู่ด้านล่างคุณอาจสนุกกับบทความนี้โดย John Carmackโดยเฉพาะ:
นอกจากการรับรู้ถึงรหัสจริงที่กำลังดำเนินการแล้วฟังก์ชั่นอินไลน์ยังมีประโยชน์ที่จะไม่สามารถเรียกใช้ฟังก์ชันจากที่อื่นได้ ฟังดูไร้สาระ แต่ก็มีประเด็นอยู่ตรงนั้น เมื่อ codebase เติบโตขึ้นกว่าการใช้งานมานานหลายปีจะมีโอกาสมากมายที่จะใช้ทางลัดและเพียงแค่เรียกใช้ฟังก์ชันที่ทำงานเฉพาะที่คุณคิดว่าจำเป็นต้องทำ อาจมีฟังก์ชั่น FullUpdate () ที่เรียก PartialUpdateA () และ PartialUpdateB () แต่ในบางกรณีคุณอาจรู้ (หรือคิดว่า) ว่าคุณเพียงแค่ต้องทำ PartialUpdateB () และคุณมีประสิทธิภาพด้วยการหลีกเลี่ยงอีก งาน. ข้อบกพร่องมากมายเกิดขึ้นจากสิ่งนี้ ข้อบกพร่องส่วนใหญ่เป็นผลมาจากสถานะการดำเนินการไม่ตรงกับที่คุณคิด