เน้นการปฏิเสธ


13

ฉันเพิ่งเขียนคำสั่ง if ที่มีชื่อคุณสมบัติยาวพอสมควรและเกิดปัญหานี้ขึ้น

สมมติว่าเรามีคำสั่ง if เช่นนี้:

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
   !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

คุณสมบัติที่สองเป็นประเภทบูลีนและไม่มีเหตุผลใดที่จะมี stetement เช่นนี้

if(boleanValue == true)

มีวิธีที่ดีกว่าในการเน้นการปฏิเสธจากนั้นให้ใส่!ด้านหน้า สำหรับฉันดูเหมือนว่าเรื่องนี้สามารถดูแลได้ง่ายเมื่ออ่านรหัสและอาจทำให้เกิดปัญหากับการดีบัก


7
แยกเงื่อนไขเป็นวิธีที่มีชื่อที่มีความหมาย
Joachim Sauer

2
... หรือกำหนดค่าที่ไม่ได้ใช้งานให้กับตัวแปรที่มีชื่อที่มีความหมายและใช้ในเงื่อนไข if แทน
scrwtp

+1 สิ่งที่ @JoachimSauer พูดถ้าเป็นไปได้ให้ใส่วิธีนั้นลงบนวัตถุที่กำลังถูกสอบถาม .. ในกรณีนี้เงื่อนไขทั้งหมดอาจถูกห่อหุ้มด้วยวิธีการบน_someViewModelNameThatIsLong
MattDavey

2
สิ่งทั่วไปที่ฉันมักทำคือการล้อมรอบการปฏิเสธด้วยช่องว่างในแต่ละด้านเพื่อให้มองเห็นได้ชัดเจนขึ้น if( ! something)vsif(!something)
Svish

หากคุณเน้นการปฏิเสธทำไมไม่ใช้... && model.Prop == false)? โดยส่วนตัวแล้วฉันไม่ค่อยใช้!มันมองข้ามง่ายเกินไป

คำตอบ:


22
if(_someViewModelNameThatIsLong.NeedsMeToDoSomething(someValue))
{
    //Do something
}

จากนั้นในวัตถุรูปแบบมุมมอง

public bool NeedsMeToDoSomething(string someValue)
{
    return AnotherPropertyINeedToCheck == someValue &&
        !ThisIsABooleanPropertyThatIsImportant;
}

(สมมติว่าค่าบางค่าเป็นสตริงและไม่รู้จักโดยวัตถุโมเดล)

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


1
+1 นี้เป็นโปรแกรมที่ดีของหลักการข้อมูลผู้เชี่ยวชาญ
MattDavey

1
น่าสังเกตว่าsomeValueอาจต้องเป็นพารามิเตอร์ของNeedsMeToDoSomethingวิธีการขึ้นอยู่กับสถานการณ์ของคุณ
MattDavey

@ MattDavey: โอ้จุดดี
pdr

@pdr บางทีคุณควรสร้างคุณสมบัติให้กับโมเดลมุมมองนั้นด้วยบูลีนเดียวกันและนำค่าสถานะนั้นกลับมาใช้ใหม่ในที่อื่น ๆ ฉันแน่ใจว่าคุณจะพบว่ามีประโยชน์
radu florescu

5

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

var isValid = !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant;
if( isValid ) 
{
    if( _someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue ) 
    {
        //Do something
    }
}

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


2

หากคุณใช้ C / C ++ ตัวประมวลผลล่วงหน้าจะสามารถอ่านได้

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

หรือบางที ... ฟังก์ชั่นไม่ (x) {return! x; } // javascript
Alex

2
ตัวดำเนินการใน C และ C ++มีคำพ้องความหมายมาตรฐานสำหรับโอเปอเรเตอร์ต่างๆแล้ว
Joel

0

ฉันจะแยก

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

ในวิธีที่คืนค่านี้ หากคุณตั้งชื่อวิธีนี้ไม่ใช่ ThisIsABooleanProperty นั่นคือสิ่งสำคัญคุณควรจะปรับ

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