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


9

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

คำตอบ:


8

ฉันเห็นสองข้อได้เปรียบหลัก:

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

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

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


3

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


3

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


3

ทุกภาษาอาจแตกต่างกันในการเลือกสไตล์และการฝึกฝน ต่อไปนี้มาจากกฎ JSF-AVซึ่ง Stroustrup ชี้ไปที่มาตรฐานการเข้ารหัสที่เขาต้องการ

AV กฎ 136
Declarations should be at the smallest feasible scope

เหตุผลของเรื่องนี้อธิบายว่า

This rule attempts to minimize the number of live variables that must be simultaneously considered. Furthermore, variable declarations should be postponed until enough information is available for full initialization

หากคุณอยู่ใน C ++ การประกาศตัวแปรเมื่อคุณต้องการพวกเขาเป็นที่ต้องการ


3

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

ฉันไม่ได้อยู่คนเดียวกับความคิดเห็นนี้ นี่คือคำถามที่แก้ปัญหาเดียวกัน: /software/56585/where-do-you-declare-variables-the-top-of-a-method-or-when-you-need - พวกเขาคำตอบที่นี่คือการประกาศพวกเขาที่คุณใช้พวกเขา การปฏิบัติแบบเดียวกันนี้ได้อธิบายไว้ในหนังสือ 'Clean Code' โดย Robert C. Martin

อย่างไรก็ตามหากคุณใช้ C-standard รุ่นเก่า (C-89) คุณต้องกำหนดตัวแปรท้องถิ่นที่ด้านบนของฟังก์ชั่น ดังนั้นแนวทางอาจเป็นเศษเล็กเศษน้อยจากเวลาที่ใช้ C-89? มันอาจจะดีกว่าถ้าถามคนที่เขียนแนวทางว่าทำไมกฎยังอยู่ในนั้น


2

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

หากอยู่ในลูปคุณต้องทำการจัดสรรหน่วยความจำซ้ำ ๆ ซึ่งอาจมีค่าใช้จ่ายสูงในแง่ประสิทธิภาพ

มีเหตุผลในการทำสิ่งต่าง ๆ ทั้งสองวิธี


1

มาตรฐาน C เก่าปี 1989 อนุญาตการประกาศตัวแปรที่จุดเริ่มต้นของบล็อกเท่านั้น

เนื่องจากอนุญาตให้ประกาศ C99 ได้ทุกที่ บางทีสถานที่ของคุณยังไม่ได้เปลี่ยนเป็น C99


เราใช้ C99 - แต่ที่สำคัญกว่านั้นคือฉันกำลังมองหาสิ่งที่เกี่ยวข้องกับการประกาศในบล็อกที่อยู่ด้านในสุดแทนที่จะเริ่มทำงาน บางทีฉันอาจจะไม่ชัดเจนพอ ...
TCSGrad

1

ดูเหมือนว่าคนที่ตัดสินใจครั้งนี้จะใช้เวลาในการประกาศที่ด้านบนเป็นบรรทัดฐานและเลือกที่จะไม่เปลี่ยนไปใช้การตั้งค่าที่จะประกาศใกล้เคียงกับที่มันถูกใช้

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

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