ฉันจะไม่เป็นที่นิยมและบอกว่าใช่มันเป็นการปฏิบัติที่ไม่ดี หากการทำงานของรหัสของคุณนั้นขึ้นอยู่กับการใช้ตรรกะตามเงื่อนไข
กล่าวคือ
if(quickLogicA && slowLogicB) {doSomething();}
เป็นสิ่งที่ดี แต่
if(logicA && doSomething()) {andAlsoDoSomethingElse();}
ไม่ดีและแน่นอนไม่มีใครจะเห็นด้วย!
if(doSomething() || somethingElseIfItFailed() && anotherThingIfEitherWorked() & andAlwaysThisThing())
{/* do nothing */}
เหตุผล:
รหัสของคุณมีข้อผิดพลาดหากทั้งสองฝ่ายได้รับการประเมินมากกว่าที่จะไม่ดำเนินการตามตรรกะ มันเป็นที่ถกเถียงกันอยู่ว่านี่ไม่ใช่ปัญหาตัวดำเนินการ 'และ' ถูกกำหนดใน c # ดังนั้นความหมายจึงชัดเจน อย่างไรก็ตามฉันขอยืนยันว่านี่ไม่เป็นความจริง
เหตุผล 1. ประวัติศาสตร์
โดยพื้นฐานแล้วคุณต้องพึ่งพา (สิ่งที่ตั้งใจเดิมคือ) การเพิ่มประสิทธิภาพคอมไพเลอร์เพื่อให้การทำงานในรหัสของคุณ
แม้ว่าใน c # ข้อกำหนดทางภาษารับประกันบูลีน 'และ' โอเปอเรเตอร์จะลัดวงจร สิ่งนี้ไม่เป็นความจริงสำหรับทุกภาษาและคอมไพเลอร์
wikipeda แสดงรายการภาษาต่าง ๆ และใช้ในการลัดวงจรhttp://en.wikipedia.org/wiki/Short-circuit_evaluationในขณะที่คุณมีวิธีการมากมาย และปัญหาพิเศษอีกสองข้อที่ฉันไม่ได้เข้าไปที่นี่
โดยเฉพาะอย่างยิ่ง FORTRAN, Pascal และ Delphi มีธงคอมไพเลอร์ซึ่งสลับพฤติกรรมนี้
ดังนั้น: คุณอาจพบว่าโค้ดของคุณทำงานเมื่อคอมไพล์สำหรับรีลีส แต่ไม่ใช่สำหรับดีบั๊กหรือคอมไพเลอร์สำรองเป็นต้น
เหตุผลที่ 2. ความแตกต่างของภาษา
อย่างที่คุณเห็นจากวิกิพีเดียไม่ใช่ทุกภาษาใช้วิธีเดียวกันกับการลัดวงจรแม้ว่าพวกเขาจะระบุว่าโอเปอเรเตอร์บูลีนควรจัดการกับมันอย่างไร
โดยเฉพาะอย่างยิ่งตัวดำเนินการ VB.Net 'และ' ไม่ลัดวงจรและ TSQL มีลักษณะเฉพาะบางอย่าง
ระบุว่า 'โซลูชั่น' ที่ทันสมัยมีแนวโน้มที่จะรวมหลายภาษาเช่น javascript, regex, xpath ฯลฯ คุณควรคำนึงถึงเรื่องนี้เมื่อทำการใช้งานโค้ดของคุณชัดเจน
เหตุผลที่ 3. ความแตกต่างภายในภาษา
ตัวอย่างเช่น VB ของอินไลน์ถ้าพฤติกรรมแตกต่างจากถ้า ในแอปพลิเคชันที่ทันสมัยอีกครั้งรหัสของคุณอาจย้ายไปมาตัวอย่างเช่นโค้ดที่อยู่เบื้องหลังและเว็บฟอร์มแบบอินไลน์คุณต้องระวังความแตกต่างของความหมาย
เหตุผลที่ 4. ตัวอย่างเฉพาะของคุณเป็นโมฆะตรวจสอบพารามิเตอร์ของฟังก์ชัน
นี่เป็นตัวอย่างที่ดีมาก มันเป็นสิ่งที่ทุกคนทำ แต่จริง ๆ แล้วมันเป็นการปฏิบัติที่ไม่ดีเมื่อคุณคิดถึงมัน
มันเป็นเรื่องธรรมดามากที่จะเห็นการตรวจสอบประเภทนี้เพราะมันช่วยลดบรรทัดโค้ดของคุณลงได้มาก ฉันสงสัยว่าใครจะนำมาในการตรวจสอบรหัส (และเห็นได้ชัดจากความคิดเห็นและการให้คะแนนคุณสามารถดูมันเป็นที่นิยม!)
อย่างไรก็ตามมันล้มเหลวแนวปฏิบัติที่ดีที่สุดด้วยเหตุผลมากกว่าหนึ่งข้อ!
มีความชัดเจนมากจากหลายแหล่งว่าวิธีปฏิบัติที่ดีที่สุดคือการตรวจสอบความถูกต้องของพารามิเตอร์ก่อนที่จะใช้และเพื่อทำการยกเว้นหากไม่ถูกต้อง ข้อมูลโค้ดของคุณไม่แสดงรหัสโดยรอบ แต่คุณน่าจะทำสิ่งต่อไปนี้:
if (smartphone == null)
{
//throw an exception
}
// perform functionality
คุณกำลังเรียกฟังก์ชั่นจากภายในคำสั่งตามเงื่อนไข แม้ว่าชื่อฟังก์ชั่นของคุณจะบอกเป็นนัยว่ามันคำนวณเพียงค่า แต่สามารถซ่อนผลข้างเคียงได้ เช่น
Smartphone.GetSignal() { this.signal++; return this.signal; }
else if (smartphone.GetSignal() < 1)
{
// Do stuff
}
else if (smartphone.GetSignal() < 2)
{
// Do stuff
}
แนวทางปฏิบัติที่ดีที่สุดจะแนะนำ:
var s = smartphone.GetSignal();
if(s < 50)
{
//do something
}
หากคุณใช้แนวทางปฏิบัติที่ดีที่สุดเหล่านี้กับรหัสของคุณคุณจะเห็นว่าโอกาสในการบรรลุรหัสที่สั้นลงผ่านการใช้เงื่อนไขที่ซ่อนอยู่นั้นจะหายไป วิธีปฏิบัติที่ดีที่สุดคือทำบางสิ่งเพื่อจัดการเคสที่สมาร์ทโฟนเป็นโมฆะ
ฉันคิดว่าคุณจะพบว่านี่เป็นกรณีสำหรับประเพณีทั่วไปอื่น ๆ คุณต้องจำไว้ว่าเรายังมี:
เงื่อนไขแบบอินไลน์
var s = smartphone!=null ? smartphone.GetSignal() : 0;
และการรวมกันเป็นโมฆะ
var s = smartphoneConnectionStatus ?? "No Connection";
ซึ่งมีฟังก์ชั่นความยาวรหัสสั้นที่คล้ายกันและชัดเจนยิ่งขึ้น
ลิงค์จำนวนมากเพื่อสนับสนุนคะแนนทั้งหมดของฉัน:
https://stackoverflow.com/questions/1158614/what-is-the-best-practice-in-case-one-argument-is-null
การตรวจสอบพารามิเตอร์ Constructor ใน C # - แนวปฏิบัติที่ดีที่สุด
หนึ่งควรตรวจสอบโมฆะถ้าเขาไม่คาดหวังโมฆะ?
https://msdn.microsoft.com/en-us/library/seyhszts%28v=vs.110%29.aspx
https://stackoverflow.com/questions/1445867/why-would-a-language-not-use-short-circuit-evaluation
http://orcharddojo.net/orchard-resources/Library/DevelopmentGuidelines/BestPractices/CSharp
ตัวอย่างของธงคอมไพเลอร์ที่มีผลต่อการลัดวงจร:
Fortran: "sce | nosce โดยค่าเริ่มต้นคอมไพเลอร์ทำการประเมินการลัดวงจรในการแสดงออกทางตรรกะที่เลือกโดยใช้กฎ XL Fortran การระบุ sce ช่วยให้คอมไพเลอร์ใช้กฎที่ไม่ใช่ XL Fortran คอมไพเลอร์จะทำการประเมินลัดวงจรหากกฎปัจจุบันอนุญาต ค่าเริ่มต้นคือ nosce "
Pascal: "B - คำสั่งแฟล็กที่ควบคุมการประเมินการลัดวงจรดูลำดับของการประเมินผลการดำเนินการของตัวดำเนินการ dyadic สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการประเมินการลัดวงจรดูตัวเลือกคอมไพเลอร์ -sc สำหรับคอมไพเลอร์บรรทัดคำสั่งสำหรับข้อมูลเพิ่มเติม ( บันทึกไว้ในคู่มือผู้ใช้) "
Delphi: "Delphi รองรับการประเมินการลัดวงจรตามค่าเริ่มต้นสามารถปิดได้โดยใช้คำสั่งคอมไพเลอร์ {$ BOOLEVAL OFF}"