ตามที่ได้รับการกล่าวมีโรงเรียนคิดสองแห่งในเรื่องนี้
1) ประกาศทุกอย่างที่อยู่ด้านบนสุดของฟังก์ชั่นเพราะปีคือ 1987
2) ประกาศใกล้เคียงกับการใช้ครั้งแรกและอยู่ในขอบเขตที่เล็กที่สุดเท่าที่จะเป็นไปได้
คำตอบของฉันคือทำทั้ง! ให้ฉันอธิบาย:
สำหรับฟังก์ชั่นที่ยาวนาน 1) ทำให้การปรับโครงสร้างยาก หากคุณทำงานใน codebase ที่นักพัฒนาไม่เห็นด้วยกับแนวคิดของ subroutines คุณจะมีการประกาศตัวแปร 50 ตัวที่จุดเริ่มต้นของฟังก์ชันและบางอันอาจเป็น "i" สำหรับ for-loop ที่อยู่ในระดับต่ำมาก ด้านล่างของฟังก์ชั่น
ฉันจึงพัฒนาคำประกาศ - at - the - the - top - PTSD จากนี้และพยายามที่จะทำตัวเลือก 2) อย่างเคร่งครัด
ฉันกลับมาที่ตัวเลือกหนึ่งเพราะสิ่งหนึ่ง: ฟังก์ชั่นสั้น หากฟังก์ชั่นของคุณสั้นพอคุณจะมีตัวแปรในตัวเครื่องน้อยและเนื่องจากฟังก์ชั่นนั้นสั้นถ้าคุณวางไว้ที่ด้านบนของฟังก์ชั่นมันจะยังคงใกล้เคียงกับการใช้งานครั้งแรก
นอกจากนี้รูปแบบการต่อต้านของ "ประกาศและตั้งค่าเป็น NULL" เมื่อคุณต้องการประกาศที่ด้านบน แต่คุณยังไม่ได้ทำการคำนวณที่จำเป็นสำหรับการเริ่มต้นจะได้รับการแก้ไขเพราะสิ่งที่คุณต้องเริ่มต้นจะได้รับเป็นอาร์กิวเมนต์
ตอนนี้ความคิดของฉันคือคุณควรประกาศที่ด้านบนสุดของฟังก์ชั่นและใกล้เคียงกับการใช้งานครั้งแรก ทั้งคู่! และวิธีที่จะทำคือมีรูทีนย่อยที่แบ่งออกเป็นอย่างดี
แต่ถ้าคุณกำลังทำงานกับฟังก์ชั่นที่ยาวนานให้วางสิ่งที่ใกล้เคียงกับการใช้งานครั้งแรกมากที่สุดเพราะวิธีนั้นจะเป็นการดึงวิธีต่างๆได้ง่ายขึ้น
สูตรของฉันคือสิ่งนี้ สำหรับตัวแปรโลคัลทั้งหมดให้ใช้ตัวแปรและย้ายการประกาศไปที่ด้านล่างคอมไพล์จากนั้นย้ายการประกาศไปก่อนข้อผิดพลาดการคอมไพล์ นั่นเป็นครั้งแรกที่ใช้ ทำเช่นนี้กับตัวแปรท้องถิ่นทั้งหมด
int foo = 0;
<code that uses foo>
int bar = 1;
<code that uses bar>
<code that uses foo>
ตอนนี้กำหนดขอบเขตบล็อกที่เริ่มต้นก่อนการประกาศและย้ายจุดสิ้นสุดจนกว่าโปรแกรมจะคอมไพล์
{
int foo = 0;
<code that uses foo>
}
int bar = 1;
<code that uses bar>
>>> First compilation error here
<code that uses foo>
สิ่งนี้ไม่ได้รวบรวมเนื่องจากมีรหัสอีกจำนวนหนึ่งที่ใช้ foo เราสามารถสังเกตได้ว่าคอมไพเลอร์สามารถผ่านโค้ดที่ใช้แถบเพราะมันไม่ได้ใช้ foo ณ จุดนี้มีสองตัวเลือก กลไกหนึ่งคือเพียงเลื่อน "}" ลงไปจนคอมไพล์และตัวเลือกอื่นคือตรวจสอบโค้ดและพิจารณาว่าคำสั่งซื้อสามารถเปลี่ยนเป็น:
{
int foo = 0;
<code that uses foo>
}
<code that uses foo>
int bar = 1;
<code that uses bar>
หากสามารถเปลี่ยนคำสั่งซื้อได้นั่นอาจเป็นสิ่งที่คุณต้องการเพราะจะทำให้อายุการใช้งานของค่าชั่วคราวสั้นลง
สิ่งอื่นที่ควรทราบค่าของ foo จำเป็นต้องเก็บรักษาไว้ระหว่างบล็อกของรหัสที่ใช้หรืออาจเป็น foo ที่แตกต่างกันในทั้งสองอย่าง ตัวอย่างเช่น
int i;
for(i = 0; i < 8; ++i){
...
}
<some stuff>
for(i = 3; i < 32; ++i){
...
}
สถานการณ์เหล่านี้ต้องการมากกว่าขั้นตอนของฉัน ผู้พัฒนาจะต้องวิเคราะห์รหัสเพื่อกำหนดว่าต้องทำอย่างไร
แต่ขั้นตอนแรกคือการค้นหาการใช้งานครั้งแรก คุณสามารถทำได้ด้วยการมองเห็น แต่บางครั้งมันง่ายกว่าที่จะลบการประกาศพยายามที่จะรวบรวมและนำมันกลับมาเหนือการใช้ครั้งแรก หากการใช้ครั้งแรกนั้นอยู่ในคำสั่ง if ให้วางไว้ที่นั้นและตรวจสอบว่าคอมไพล์หรือไม่ คอมไพเลอร์จะระบุการใช้งานอื่น ๆ ลองสร้างบล็อกขอบเขตที่ครอบคลุมการใช้งานทั้งสองอย่าง
หลังจากชิ้นส่วนเชิงกลนี้เสร็จสิ้นแล้วจะวิเคราะห์ได้ง่ายขึ้นว่าข้อมูลอยู่ที่ไหน หากมีการใช้ตัวแปรในบล็อกขอบเขตขนาดใหญ่ให้วิเคราะห์สถานการณ์และดูว่าคุณเพียงแค่ใช้ตัวแปรเดียวกันสำหรับสองสิ่งที่แตกต่างกัน (เช่น "i" ที่ถูกใช้เป็นสองลูป) หากการใช้ไม่เกี่ยวข้องให้สร้างตัวแปรใหม่สำหรับการใช้ที่ไม่เกี่ยวข้องแต่ละรายการ