แนวคิดของSingle Entry, Single Exit (SESE) มาจากภาษาที่มีการจัดการทรัพยากรอย่างชัดเจนเช่น C และแอสเซมบลี ใน C รหัสเช่นนี้จะทำให้ทรัพยากรรั่วไหล:
void f()
{
resource res = acquire_resource(); // think malloc()
if( f1(res) )
return; // leaks res
f2(res);
release_resource(res); // think free()
}
ในภาษาดังกล่าวโดยทั่วไปคุณมีสามตัวเลือก:
ทำซ้ำรหัสการล้างข้อมูล
ฮึ. ความซ้ำซ้อนนั้นไม่ดีอยู่เสมอ
ใช้ a goto
เพื่อข้ามไปยังรหัสการล้างข้อมูล
สิ่งนี้ต้องใช้รหัสการล้างข้อมูลเป็นสิ่งสุดท้ายในฟังก์ชัน (และนี่คือเหตุผลที่บางคนโต้แย้งว่าgoto
มีที่อยู่และมีแน่นอน - ในค.)
แนะนำตัวแปรท้องถิ่นและควบคุมการไหลของการควบคุมผ่านสิ่งนั้น
ข้อเสียคือการควบคุมการไหลจัดการผ่านไวยากรณ์ (คิดว่าbreak
, return
, if
, while
) เป็นเรื่องง่ายที่จะปฏิบัติตามกว่าการควบคุมการไหลจัดการผ่านรัฐของตัวแปร (เพราะตัวแปรเหล่านั้นมีสถานะไม่เมื่อคุณมองไปที่ขั้นตอน)
ในการประกอบมันยิ่งแปลกเพราะคุณสามารถข้ามไปยังที่อยู่ใด ๆ ในฟังก์ชั่นเมื่อคุณเรียกใช้ฟังก์ชั่นนั้นได้อย่างมีประสิทธิภาพซึ่งหมายความว่าคุณมีจุดเข้าใช้งานไม่ จำกัด จำนวนเกือบทุกฟังก์ชั่น (บางครั้งสิ่งนี้มีประโยชน์ Thunks ดังกล่าวเป็นเทคนิคทั่วไปสำหรับคอมไพเลอร์เพื่อใช้การthis
ปรับตัวชี้ที่จำเป็นสำหรับการเรียกvirtual
ใช้ฟังก์ชันในสถานการณ์จำลองหลายมรดกใน C ++)
เมื่อคุณต้องจัดการทรัพยากรด้วยตนเองการใช้ประโยชน์จากตัวเลือกในการเข้าหรือออกจากฟังก์ชั่นทุกที่นำไปสู่รหัสที่ซับซ้อนมากขึ้นและทำให้ข้อบกพร่อง ดังนั้นโรงเรียนแห่งความคิดปรากฏว่า SESE ที่แพร่กระจายเพื่อรับโค้ดที่สะอาดและมีข้อบกพร่องน้อยลง
อย่างไรก็ตามเมื่อภาษามีข้อยกเว้น (เกือบ) ฟังก์ชั่นใด ๆ ที่อาจจะออกก่อนเวลา (เกือบ) จุดใด ๆ ดังนั้นคุณจะต้องทำให้บทบัญญัติสำหรับการกลับมาก่อนกำหนดอยู่แล้ว (ฉันคิดว่าfinally
ส่วนใหญ่จะใช้สำหรับที่ใน Java และusing
(เมื่อดำเนินการIDisposable
เป็นfinally
อย่างอื่น) ใน C #; C ++ แทนใช้RAII .) เมื่อคุณทำสิ่งนี้แล้วคุณไม่สามารถล้มเหลวในการทำความสะอาดหลังจากตัวเองเนื่องจากreturn
คำสั่งก่อนดังนั้นสิ่งที่อาจ การโต้แย้งที่แข็งแกร่งที่สุดในความโปรดปรานของ SESE ได้หายไป
นั่นทำให้อ่านง่าย แน่นอนฟังก์ชั่น 200 LoC ที่มีreturn
คำสั่งครึ่งโหลประปรายแบบสุ่มนั้นไม่ใช่สไตล์การเขียนโปรแกรมที่ดีและไม่ได้ทำเพื่ออ่านรหัส แต่ฟังก์ชั่นดังกล่าวจะไม่ง่ายที่จะเข้าใจหากไม่มีการคืนก่อนกำหนดเหล่านั้นเช่นกัน
ในภาษาที่ทรัพยากรไม่ได้หรือไม่ควรจัดการด้วยตนเองมีค่าน้อยหรือไม่มีเลยในการปฏิบัติตามอนุสัญญา SESE แบบเก่า OTOH ดังที่ฉันได้กล่าวไว้ข้างต้นSESE มักจะทำให้โค้ดซับซ้อนขึ้น มันเป็นไดโนเสาร์ที่ (ยกเว้น C) ไม่เหมาะกับภาษาส่วนใหญ่ในปัจจุบัน แทนที่จะช่วยให้เข้าใจรหัสได้มันจะขัดขวางมัน
เหตุใดโปรแกรมเมอร์ของจาวาจึงติดอยู่กับสิ่งนี้? ฉันไม่รู้ แต่จาก POV (นอก) ของฉัน Java ใช้การประชุมจำนวนมากจาก C (ที่พวกเขาเข้าท่า) และนำไปใช้กับโลกของ OO (ซึ่งพวกเขาไร้ประโยชน์หรือไม่ดีเลย) ซึ่งตอนนี้เกาะติดอยู่กับ พวกเขาไม่ว่าค่าใช้จ่ายอะไร (เช่นการประชุมเพื่อกำหนดตัวแปรทั้งหมดของคุณที่จุดเริ่มต้นของขอบเขต)
โปรแกรมเมอร์เขียนข้อความแปลก ๆ ทุกอย่างด้วยเหตุผลไม่ลงตัว (คำแถลงโครงสร้างเชิงซ้อน - "หัวลูกศร" - มีในภาษาเช่นปาสกาลเมื่อเห็นว่าเป็นรหัสที่สวยงาม) การใช้เหตุผลเชิงตรรกะที่บริสุทธิ์กับสิ่งนี้ดูเหมือนว่าจะล้มเหลวในการโน้มน้าวให้คนส่วนใหญ่เบี่ยงเบนไปจากวิธีที่จัดตั้งขึ้น วิธีที่ดีที่สุดในการเปลี่ยนนิสัยดังกล่าวน่าจะสอนให้พวกเขา แต่เนิ่นๆเพื่อทำสิ่งที่ดีที่สุดไม่ใช่สิ่งที่ธรรมดา คุณในฐานะครูสอนการเขียนโปรแกรมมีไว้ในมือคุณ:)