บูลีนการตั้งชื่อวิธียืนยันและเชิงลบ


43

วิธีการบูลีนควรใช้รูปแบบการยืนยันเสมอแม้ว่าจะใช้ในรูปแบบเชิงลบหรือไม่?

สมมติว่าฉันต้องการตรวจสอบว่ามีเอนทิตีอยู่ก่อนสร้างหนึ่งหรือไม่อาร์กิวเมนต์ของฉันคือว่ารูปแบบแรกด้านล่างดีกว่ารูปแบบที่สองไม่ว่าจะใช้วิธีการนี้ในรูปแบบที่ยืนยันหรือไม่

โดยสรุปผมหาอ่านได้ง่ายขึ้นกว่าif(!affirmative) if(negative)ฉันมีเพื่อนร่วมงานที่ไม่เห็นด้วยความคิดเหรอ?

แบบฟอร์มแรก:

int entity_id = 42;
if(!entity_exists(entity_id)) create_entity(entity_id);

แบบฟอร์มที่สอง:

int entity_id = 42;
if(entity_not_exist(entity_id)) create_entity(entity_id);

3
c ++? วิธีการเกี่ยวกับif (not entity_exists(entity_id))
คอส


เพื่อ - อาจ - เพื่อ - mah - to จริงๆแล้วฉันพลาด!ตัวละครหลายครั้งจนทำให้ฉันเข้าใจรหัสผิด ๆ จนกว่าฉันจะอ่านมันอีกครั้ง ดังนั้นฉันอาจเห็นด้วยกับเพื่อนร่วมงานของคุณมากขึ้น ฉันชอบแบบฟอร์มที่ประเมินว่าเป็นจริงเมื่อคุณตรวจสอบ
Berin Loritsch

แค่อยากจะพูดว่าif (!exists) create()สามารถถือได้ว่าเป็นการปฏิบัติที่ไม่ดีในหลายภาษา / กรอบงานเนื่องจากมีแนวโน้มที่จะไม่ปลอดภัยต่อเธรด โดยปกติแล้ววิธีที่ต้องการคือการโทรcreate()และจัดการข้อยกเว้นหรือรหัสส่งคืนที่ระบุว่ามีเอนทิตีอยู่แล้ว แน่นอนว่านี่ไม่ใช่คำตอบสำหรับคำถามจริง (ซึ่งเป็นเหตุผลว่าทำไมจึงเป็นความคิดเห็นเท่านั้น)
julealgon

คำตอบ:


61

วิธีการบูลีนควรใช้รูปแบบการยืนยันเสมอแม้ว่าจะใช้ในรูปแบบเชิงลบหรือไม่?

กฎการทำเกี่ยวกับสิ่งนั้นดูเหมือนว่าน้อยมาก - ฉันจะไม่ต้องการที่จะเห็นแนวทางในการเข้ารหัสเอกสารมาตรฐานที่ระบุว่าเจ้าจะไม่ได้ใช้ชื่อเชิงลบสำหรับคุณสมบัติของบูล แต่เป็นเรื่องของสไตล์ส่วนตัวฉันคิดว่าการพยายามรักษาชื่อที่เป็นบวกอาจเป็นอุดมคติที่ดี !แต่ผมคิดว่ามันก็ยังดีเพื่อหลีกเลี่ยงความจำเป็นในการที่ผอมและง่ายดาย-พลาด บ่อยครั้งที่เราสามารถหาวิธีเปลี่ยนชื่อเชิงลบให้เป็นชื่อที่ดีได้:

  • accountHasCharges
  • accountIsClear(เหมือน!accountHasCharges)

ความชัดเจนคือการพิจารณาที่สำคัญที่สุดและเหตุผลที่ดีในการหลีกเลี่ยงชื่อวิธีการเชิงลบคือพวกเขาสามารถนำไปสู่การปฏิเสธเชิงลบหรือแย่กว่า:

  • isComplete // โอเค
  • isNotComplete //! isComplete มักจะดีกว่า
  • isIncomplete // อาจสมเหตุสมผลถ้า 'ไม่สมบูรณ์' เป็นสถานะที่รู้จักของวัตถุ
  • !isNotComplete // น่ากลัว
  • !isNotComplete == 0 // อาจนำไปสู่วันหยุดถาวร

5
"ฉันไม่ต้องการเห็นแนวทางในเอกสารมาตรฐานการเข้ารหัสที่ระบุว่าคุณจะไม่ใช้ชื่อเชิงลบสำหรับคุณสมบัติบูลีน " - ฉันจะทิ้งไว้ที่นี่ ...
AakashM

16
คุณลืม!isNotIncomplete
Ben Lee

ดังนั้นตรงกันข้ามentity_existsจะเป็นentity_should_be_created(แทนentity_not_exists)? หรืออาจentity_missingเป็นไปตามข้อเสนอแนะของแดน?
ADTC

1
นี่คือที่เอกสารมาตรฐานการเข้ารหัสสามารถใช้คำว่า "ชอบ" มากกว่า "ควร" หรือ "ต้อง"
Wayne Conrad

15

ฉันยอมรับว่าการอ่านง่ายขึ้น คุณอาจลอง

แบบฟอร์มที่สาม

int entity_id = 42;
if (entity_is_missing(entity_id)) create_entity(entity_id);

หรือ

แบบฟอร์มที่สี่

int entity_id = 42;
if (is_entity_missing(entity_id)) create_entity(entity_id);

2

นอกจากนี้ยังขึ้นอยู่กับวิธีการใช้งานของคุณ ถ้ามันจะถูกนำมาใช้ในทั้งสองกรณียืนยันและเชิงลบเช่น

if (!entity_exists(entity_id)) create_entity(entity_id);

if (entity_exists(entity_id)) publish_entity(entity_id);

จากนั้นชื่อวิธีการควรอยู่ในการยืนยันเหมือนข้างต้น หากคุณไม่แน่ใจว่าจะใช้งานอย่างไรให้ทำตามขั้นตอนด้านบน

แต่ถ้ามันถูกใช้เฉพาะในกรณีลบแล้วต่อไปนี้เป็นที่ยอมรับ (อาจเป็นที่ต้องการ)

if (entity_not_exists(entity_id)) create_entity(entity_id);

หรือยิ่งไปกว่านั้นให้เป็นคำพูดที่ยืนยันได้มากขึ้น

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