ความสามารถในการตั้งชื่อวิธีบูลีน


120

คำถามง่ายๆจากมุมมองความสามารถในการอ่านคุณชอบชื่อเมธอดไหนสำหรับเมธอดบูลีน:

public boolean isUserExist(...)

หรือ:

public boolean doesUserExist(...)

หรือ:

public boolean userExists(...)

21
คนแรกฟังดูเหมือนisBabbyFormed

ขึ้นอยู่กับภาษา. ภาษาที่แตกต่างกันมีการประชุมที่แตกต่างกัน Java และ Objective C อยู่ในใจ นอกจากนี้เส้นขอบอัตนัย
Jed Smith

อัตนัย - ยุติธรรมพอ
Yuval Adam

2
อัตนัยล้วนๆ getUserExistence, userIsNotExtinct, userHasExistentialStateฯลฯ ...
dreamlax

Sartre น่าภาคภูมิใจ
Cornel Masson

คำตอบ:


112
public boolean userExists(...)

จะเป็นที่ต้องการของฉัน เนื่องจากทำให้การตรวจสอบเงื่อนไขของคุณเหมือนภาษาอังกฤษตามธรรมชาติ

if userExists ...

แต่ฉันเดาว่าไม่มีกฎที่ยากและรวดเร็ว - เพียงแค่เสมอต้นเสมอปลาย


3
"ทำให้ {method call} ของคุณเหมือนภาษาอังกฤษตามธรรมชาติมากขึ้น" ดูเหมือนเป็นการทดสอบที่ดีสำหรับการตั้งชื่ออย่างมีเหตุผลทั่วทั้งกระดาน ชี้แจงความคิดของฉันในเรื่องนี้ - ขอบคุณ!
cori

16
ในทางกลับกันเมื่อแยกออกจากกันหรือเมื่อไม่ได้ติดตาม "if" ในทันทีดังนั้น "userExists ()" จะดูเหมือนเป็นการชี้แจงข้อเท็จจริงแทนที่จะเป็นคำถามที่ตั้งใจไว้ ไม่เหมือนกับ "IsUserExisting ()" หรือ "DoesUserExist ()" ซึ่งเป็นไปตามกฎการเรียงลำดับคำในภาษาอังกฤษสำหรับคำถามตรงไปตรงมา
Oskar Berggren

4
.. แต่ทำไมวิธีการส่งคืนบูลจึงถูกนำมาใช้ภายนอกif? หากมีผลข้างเคียงก็จะยิ่งมีกลิ่นมากขึ้น if IsUserExisting()และif DoesUserExist()ดูน่ากลัวและควรหลีกเลี่ยง
RJFalconer

@RJFalconer บางครั้งคุณอาจต้องใช้ผลลัพธ์ของวิธีนั้นในหลาย ๆ ที่ดังนั้นคุณจะกำหนดให้ตัวแปร ตั้งแต่เรียกเมธอดuserExistsคุณจะประกาศชื่อตัวแปรอะไร? userExistsเหมาะสำหรับตัวแปรไม่ใช่วิธีการ ตามที่ @Oskar เขียน - ดูเหมือนคำสั่งไม่ใช่คำถาม
JarosławWlazło

สำหรับสถานการณ์ที่ต้องเป็น subject, เพรดิเคตและอ็อบเจกต์ตัวอย่างเช่น UserSessionIsComplete หรือ IsUserSessionComplete คุณชอบอันไหน
ยาง

40

ฉันจะบอกว่าuserExistsเพราะ 90% ของเวลาที่รหัสโทรของฉันจะมีลักษณะดังนี้:

if userExists(...) {
  ...
}

และอ่านเป็นภาษาอังกฤษอย่างแท้จริง

if isUserExistและif doesUserExistดูเหมือนซ้ำซ้อน


18

ระวังการเสียสละความชัดเจนในขณะที่ไล่อ่านง่าย

แม้ว่าจะif (user.ExistsInDatabase(db))อ่านได้ดีกว่าif (user.CheckExistsInDatabase(db))แต่ให้พิจารณากรณีของคลาสที่มีรูปแบบตัวสร้าง (หรือคลาสใด ๆ ที่คุณสามารถตั้งค่าสถานะได้):

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

ไม่ชัดเจนว่าExistsInDatabaseกำลังตรวจสอบว่ามีอยู่จริงหรือตั้งค่าความจริงว่ามีอยู่จริง คุณจะไม่เขียนif (user.Age())หรือif (user.Name())ไม่มีค่าเปรียบเทียบดังนั้นทำไมif (user.Exists())ความคิดที่ดีจึงเป็นเพราะคุณสมบัติ / ฟังก์ชันนั้นเป็นประเภทบูลีนและคุณสามารถเปลี่ยนชื่อฟังก์ชัน / คุณสมบัติเพื่ออ่านเพิ่มเติมได้เหมือนภาษาอังกฤษตามธรรมชาติ การทำตามรูปแบบเดียวกับที่เราใช้กับประเภทอื่นที่ไม่ใช่บูลีนนั้นแย่มากหรือไม่?

สำหรับประเภทอื่น ๆifคำสั่งจะเปรียบเทียบค่าที่ส่งคืนของฟังก์ชันกับค่าในโค้ดดังนั้นโค้ดจึงมีลักษณะดังนี้:

if (user.GetAge() >= 18) ...

ซึ่งอ่านว่า "ถ้าผู้ใช้ dot get อายุมากกว่าหรือเท่ากับ 18 ... " จริง - ไม่ใช่ "ภาษาอังกฤษโดยธรรมชาติ" แต่ฉันขอยืนยันว่าobject.verbไม่เคยคล้ายกับภาษาอังกฤษตามธรรมชาติและนี่เป็นเพียงแง่มุมพื้นฐานของการเขียนโปรแกรมสมัยใหม่ (สำหรับ ภาษาหลักหลายภาษา) โดยทั่วไปโปรแกรมเมอร์ไม่มีปัญหาในการทำความเข้าใจข้อความข้างต้นดังนั้นสิ่งต่อไปนี้จะแย่กว่านี้หรือไม่?

if (user.CheckExists() == true)

ซึ่งปกติจะสั้นลงเป็น

if (user.CheckExists())

ตามด้วยขั้นตอนร้ายแรง

if (user.Exists())

ในขณะที่มีการกล่าวกันว่า "โค้ดถูกอ่านบ่อยกว่าที่เขียน 10 เท่า" แต่ก็สำคัญมากเช่นกันที่จุดบกพร่องจะถูกมองเห็นได้ง่าย สมมติว่าคุณมีฟังก์ชันที่เรียกว่า Exists () ซึ่งทำให้ออบเจ็กต์มีอยู่และส่งคืนค่าจริง / เท็จตามความสำเร็จ คุณสามารถเห็นรหัสif (user.Exists())และไม่ได้มองเห็นข้อผิดพลาด - ข้อผิดพลาดจะเห็นได้ชัดมากขึ้นถ้ารหัสอ่านif (user.SetExists())ตัวอย่างเช่น

นอกจากนี้ user.Exists () อาจมีโค้ดที่ซับซ้อนหรือไม่มีประสิทธิภาพได้อย่างง่ายดายโดยปัดไปที่ฐานข้อมูลเพื่อตรวจสอบบางสิ่ง user.CheckExists () ทำให้ชัดเจนว่าฟังก์ชันทำอะไรบางอย่าง

ดูคำตอบทั้งหมดที่นี่: การตั้งชื่อ Conventions: จะตั้งชื่อเมธอดที่ส่งคืนบูลีนได้อย่างไร

หมายเหตุสุดท้าย - หลังจาก "บอกอย่าถาม" ฟังก์ชันจำนวนมากที่ส่งคืนจริง / เท็จจะหายไปและแทนที่จะถามสถานะของวัตถุคุณจะบอกให้ทำบางสิ่งบางอย่างซึ่งสามารถทำได้ในรูปแบบที่แตกต่างกัน วิธีตามสถานะของมัน


2
> Suppose you had a function called Exists() which causes the object to existนั่นเป็นปัญหาอยู่แล้ว Createวิธีการดังกล่าวควรจะคำกริยาเช่น อย่างน้อยที่สุดก็จะเป็นExistแต่ "มีอยู่" เป็นคำกริยาที่ไม่ค่อยใช้ It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.มันชัดเจนมาก ฉันขอยืนยันว่านักพัฒนาส่วนใหญ่จะแปลกใจถ้าทำอย่างอื่นนอกจากส่งคืนบูลีน
RJFalconer

@RJFalconer Most developersเป็นกุญแจสำคัญในประโยคของคุณที่นั่น ฉันจะบอกว่าall developersจะแปลกใจถ้าCheckExists()ทำอะไรนอกเหนือจากการตรวจสอบบางอย่างที่มีอยู่ ไม่ใช่ว่าExists()เป็นชื่อที่น่ากลัว แต่CheckExists()เป็นชื่อที่ดีกว่าและคำถามนี้กำลังถามตามหลักการทั่วไปรูปแบบการตั้งชื่อที่ดีที่สุดคืออะไร? คำตอบคือให้ปฏิบัติเหมือนกับฟังก์ชันอื่น ๆ เริ่มต้นชื่อด้วยคำกริยาและอย่าใช้รูปแบบอื่นเพียงเพราะส่งคืนบูลีน
Michael Parker

ใช่คำถามเกี่ยวกับรูปแบบการตั้งชื่อที่ดีที่สุด แต่สำหรับวิธีการบูลีน วิธีการ Bool มีลักษณะเฉพาะและมีชื่อสามัญของตัวเอง - เพรดิเคต คุณไม่ควรปฏิบัติเหมือนฟังก์ชันอื่น ๆ การใส่คำกริยาข้างคำถามในชื่อวิธีบูลีนนั้นซ้ำซ้อน และมีผลกระทบต่อความสามารถในการอ่านโค้ด การตั้งชื่อวิธีบูลีนในรูปแบบคำถามโดยไม่มีคำกริยาใด ๆ ถือเป็นแนวทางปฏิบัติที่ดีที่สุดในอุตสาหกรรม ตัวอย่าง: docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir

ไฟล์ @Almir Exists เป็นการโทรที่เก่ามาก (อย่างน้อย dot net 1.1) และไม่ใช่ตัวอย่างที่ดีของมาตรฐานการอ่านที่ทันสมัย ดูที่จุดที่ทันสมัยหลักสุทธิ API สำหรับตัวอย่างที่ทันสมัยมากขึ้นของวิธีการที่ไมโครซอฟท์ตกลง: github.com/dotnet/sdkบางตัวอย่างสุ่มการเชื่อมโยง การเชื่อมโยง การเชื่อมโยง
ไมเคิลปาร์กเกอร์

15

เป้าหมายของการอ่านง่ายควรเขียนโค้ดให้ใกล้เคียงกับภาษาธรรมชาติมากที่สุด ดังนั้นในกรณีนี้userExistsดูเหมือนจะเป็นทางเลือกที่ดีที่สุด การใช้คำนำหน้า "คือ" isProcessingCompleteกระนั้นอาจจะถูกต้องในสถานการณ์อื่นตัวอย่างเช่น


1
สำหรับตัวอย่างที่สองของคุณProcessingIsCompleteใกล้เคียงกับภาษาธรรมชาติมากขึ้นหรือไม่? ตัวอย่างเช่น if (ProcessingIsComplete ())
Yang

9

ฉันจะใช้ userExists () เพราะ 1) มันสมเหตุสมผลในภาษาธรรมชาติและ 2) มันเป็นไปตามแบบแผนของ API ที่ฉันเห็น

หากต้องการดูว่าภาษาที่เป็นธรรมชาติเหมาะสมหรือไม่ให้อ่านออกเสียง "หากมีผู้ใช้" ฟังดูเหมือนวลีภาษาอังกฤษที่ถูกต้องมากกว่า "if is user existing" หรือ "if does user existing" "ถ้าผู้ใช้มีอยู่" จะดีกว่า แต่ "the" อาจไม่จำเป็นในชื่อเมธอด

เพื่อดูว่าไฟล์ที่มีอยู่ใน Java SE 6 คุณจะใช้ File.Exists () ลักษณะเช่นนี้มันจะเหมือนกันในรุ่น 7 C # ใช้การประชุมเดียวกันเช่นเดียวกับงูหลามและทับทิม หวังว่านี่จะเป็นคอลเล็กชันที่หลากหลายเพียงพอที่จะเรียกสิ่งนี้ว่าคำตอบที่ไม่เข้าใจภาษา โดยทั่วไปฉันจะใช้วิธีการตั้งชื่อให้สอดคล้องกับ API ของภาษาของคุณ


5

มีสิ่งที่ต้องพิจารณาที่ฉันคิดว่าพลาดจากคำตอบอื่น ๆ ที่นี่

  1. ขึ้นอยู่กับว่านี่เป็นเมธอดคลาส C ++ หรือฟังก์ชัน C ถ้านี่เป็นวิธีการแล้วมันจะมีแนวโน้มที่จะเรียกif (user.exists()) { ... }หรือไม่if (user.isExisting()) { ... }
    if (user_exists(&user))นี่คือเหตุผลเบื้องหลังมาตรฐานการเข้ารหัสที่ state bool method ควรเริ่มต้นด้วยคำกริยาเนื่องจากจะอ่านเหมือนประโยคเมื่อวัตถุอยู่ตรงหน้า

  2. น่าเสียดายที่ฟังก์ชัน C เก่าจำนวนมากส่งคืน 0 สำหรับความสำเร็จและไม่ใช่ศูนย์สำหรับความล้มเหลวดังนั้นจึงเป็นการยากที่จะกำหนดรูปแบบที่ใช้เว้นแต่คุณจะทำตามฟังก์ชันบูลทั้งหมดที่ขึ้นต้นด้วยคำกริยาหรือเปรียบเทียบกับจริงเสมอ if (true == user_exists(&user))


5

กฎง่ายๆของฉันสำหรับคำถามนี้คือ:

หากเมธอดบูลีนมีคำกริยาอยู่แล้วอย่าเพิ่มคำกริยา ไม่งั้นลองพิจารณาดู ตัวอย่างบางส่วน:

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

อัตนัยล้วนๆ

ฉันชอบuserExists(...)เพราะข้อความเช่นนี้อ่านได้ดีกว่า:

if ( userExists( ... ) )

หรือ

while ( userExists( ... ) )

1

ในกรณีนี้ตัวอย่างแรกคือภาษาอังกฤษที่แย่มากจนทำให้ฉันสะดุ้ง

ฉันอาจจะไปที่หมายเลขสามเพราะมันฟังดูเป็นอย่างไรเมื่ออ่านใน if statement "หากมีผู้ใช้" จะฟังดูดีกว่า "หากมีผู้ใช้อยู่"

นี่คือสมมติว่าจะใช้ในการทดสอบคำสั่ง if แน่นอน ...



0

ชื่อเมธอดใช้สำหรับการอ่านได้เฉพาะชื่อที่พอดีกับโค้ดทั้งหมดของคุณเท่านั้นที่จะดีที่สุดซึ่งส่วนใหญ่จะขึ้นต้นด้วยเงื่อนไขดังนั้น subjectPredicate จะเป็นไปตามโครงสร้างประโยคธรรมชาติ


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