พิจารณารหัสต่อไปนี้:
public void doSomething(int input)
{
while(true)
{
TransformInSomeWay(input);
if(ProcessingComplete(input))
break;
DoSomethingElseTo(input);
}
}
สมมติว่ากระบวนการนี้เกี่ยวข้องกับขั้นตอนที่ จำกัด แต่ขึ้นอยู่กับอินพุต ลูปได้รับการออกแบบมาเพื่อยุติด้วยตัวเองอันเป็นผลมาจากอัลกอริธึมและไม่ได้ออกแบบให้รันแบบไม่สิ้นสุด (จนกว่าจะถูกยกเลิกโดยเหตุการณ์ภายนอก) เนื่องจากการทดสอบเพื่อดูว่าการวนซ้ำควรจบอยู่กลางชุดตรรกะของขั้นตอนหรือไม่ขณะที่ลูปตัวเองในขณะนี้ไม่ได้ตรวจสอบสิ่งใดที่มีความหมาย การตรวจสอบจะดำเนินการแทนในตำแหน่ง "เหมาะสม" ภายในอัลกอริทึมเชิงแนวคิด
ฉันได้รับการบอกว่านี่เป็นโค้ดที่ไม่ดีเพราะมันมีข้อผิดพลาดมากกว่าเนื่องจากสภาพตอนจบไม่ได้ถูกตรวจสอบโดยโครงสร้างลูป เป็นการยากกว่าที่จะทราบว่าคุณจะออกจากลูปอย่างไรและสามารถเชิญบั๊กเนื่องจากสภาพการแตกหักอาจถูกข้ามหรือข้ามไปโดยไม่ตั้งใจเนื่องจากการเปลี่ยนแปลงในอนาคต
ตอนนี้รหัสสามารถโครงสร้างดังนี้
public void doSomething(int input)
{
TransformInSomeWay(input);
while(!ProcessingComplete(input))
{
DoSomethingElseTo(input);
TransformInSomeWay(input);
}
}
อย่างไรก็ตามการทำซ้ำการเรียกไปยังวิธีการในรหัสละเมิด DRY; หากTransformInSomeWay
ถูกแทนที่ด้วยวิธีอื่นในภายหลังการโทรทั้งสองจะต้องพบและเปลี่ยนแปลง (และความจริงที่ว่ามีสองอาจไม่ชัดเจนในรหัสที่ซับซ้อนมากขึ้น)
คุณสามารถเขียนเช่น:
public void doSomething(int input)
{
var complete = false;
while(!complete)
{
TransformInSomeWay(input);
complete = ProcessingComplete(input);
if(!complete)
{
DoSomethingElseTo(input);
}
}
}
... แต่ตอนนี้คุณมีตัวแปรที่มีจุดประสงค์เพียงอย่างเดียวคือเปลี่ยนการตรวจสอบเงื่อนไขไปยังโครงสร้างลูปและต้องตรวจสอบหลายครั้งเพื่อให้พฤติกรรมเช่นเดียวกับตรรกะดั้งเดิม
สำหรับส่วนของฉันฉันบอกว่าเนื่องจากอัลกอริทึมรหัสนี้ใช้ในโลกแห่งความจริงรหัสเดิมเป็นที่อ่านได้มากที่สุด หากคุณกำลังทำมันด้วยตัวเองนี่คือวิธีที่คุณคิดเกี่ยวกับมันและดังนั้นจึงเป็นเรื่องง่ายสำหรับคนที่คุ้นเคยกับอัลกอริทึม
ดังนั้นซึ่ง "ดีกว่า" คืออะไร? มันจะดีกว่าที่จะให้ความรับผิดชอบของการตรวจสอบสภาพเพื่อห่วงขณะที่โดยการสร้างตรรกะรอบวง? หรือดีกว่าที่จะจัดโครงสร้างตรรกะในลักษณะ "ธรรมชาติ" ตามที่ระบุไว้ตามข้อกำหนดหรือคำอธิบายเชิงแนวคิดของอัลกอริทึมแม้ว่าอาจหมายถึงการข้ามความสามารถในตัวของลูป
do ... until
สร้างยังเป็นประโยชน์สำหรับชนิดเหล่านี้ของลูปเนื่องจากพวกเขาไม่จำเป็นต้องมีการ "primed."