มันเป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะสร้างบล็อคของรหัส?


12

ใน C ++ มันเป็นวิธีปฏิบัติที่ไม่ถูกต้องหรือไม่ในการสร้างบล็อกของโค้ดภายในฟังก์ชั่นบางอย่างเช่นต่อไปนี้:

    bool f()
    {
       {
           double test = 0;

           test = // some other variable outside this function, for example.

           if (test == // some value)
             return true;
       }

       {
           double test = 0;

           test = // some variable outside this function, different from the last one.

           if (test == // some value)
             return true;
       }

       return false;

    }

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

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


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

1
@Maybe_Factor - ฉันเห็นด้วย ข้อดีของวิธีการแยกคือคุณสามารถตั้งชื่อแต่ละบล็อกโดยให้รหัสที่อ่านง่ายขึ้น
mouviciel

@mouviciel ไม่ใช่แค่รหัสที่อ่านได้มากกว่า แต่ยังมีรายงานการทดสอบที่อ่านได้อีกมาก!
อาจจะ __Factor

@Maybe_Factor ฉันไม่เห็นด้วย การย้ายสิ่งต่าง ๆ ลงในฟังก์ชั่นแยกมีผลกระทบในทางลบทำให้ดูเหมือนว่าฟังก์ชั่นนี้สามารถนำมาใช้ใหม่ได้ การรักษาตรรกะทั้งหมดของฟังก์ชันไว้ในที่เดียวนั้นดี
Miles Rout

1
@MilesRout นี่ไม่ใช่ฟังก์ชันลอจิคัลเดียวนี่คือการทดสอบหลายหน่วยสำหรับฟังก์ชั่นทั้งหมดที่อัดแน่นอยู่ในฟังก์ชั่นการทดสอบเดียว การบล็อคโค้ดเทียบกับฟังก์ชั่นในรหัสปกติเป็นการสนทนาอื่นทั้งหมด
อาจจะ __Factor

คำตอบ:


22

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

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

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

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


10

การสร้างบล็อกเป็นแบบนี้ไม่เลว มันเป็นขอบเขตการทำงาน

โดยปกติจะทำเมื่อใช้ RAII (การได้รับทรัพยากรคือการเริ่มต้น) และคุณต้องการควบคุมเมื่อมีการเรียก destructors

หากเวลานานฉันจะลองย้ายรหัสนั้นไปเป็นฟังก์ชั่นของตัวเอง

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


การใช้ชื่อตัวแปรโลคัลซ้ำไม่มีผลต่อการใช้หน่วยความจำ
วินไคลน์

1
คุณไม่คิดว่าเครื่องมือเพิ่มประสิทธิภาพอัจฉริยะสามารถใช้ตำแหน่งหน่วยความจำ 1 แห่งสำหรับตัวแปร 2 ตัวใช่หรือไม่
Robert Andrzejuk

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