หลักการตั้งชื่อสำหรับเมธอด Java ที่ส่งคืนบูลีน


98

ฉันชอบใช้เครื่องหมายคำถามต่อท้ายชื่อ method / function ในภาษาอื่น ๆ Java ไม่ยอมให้ฉันทำ วิธีแก้ปัญหาฉันจะตั้งชื่อเมธอดการส่งคืนบูลีนใน Java ได้อย่างไร การใช้is, has, should, canในด้านหน้าของเสียงวิธีการที่ถูกสำหรับบางกรณี มีวิธีที่ดีกว่าในการตั้งชื่อวิธีการดังกล่าวหรือไม่?

เช่น createFreshSnapshot?


3
ภาษาใดที่อนุญาตให้ใช้?ชื่อวิธีการ
SLaks

11
@SLaks, Scheme, Ruby ...
Skilldrick

ในรูปแบบเราใส่ไว้pท้ายชื่อเมธอดเสมอ
Erick Robertson

@Erick: ไม่เสมอไป แต่ "p" เป็นวิธีมาตรฐานวิธีหนึ่งในการกำหนดเพรดิเคต
Jason S

เรา = ชั้นเรียนโครงการระดับปริญญาตรีของฉันทำมาตลอด ฉันจะไม่ใช้การประชุมนี้ใน Java
Erick Robertson

คำตอบ:


127

การประชุมคือการถามคำถามในนาม

นี่คือตัวอย่างบางส่วนที่สามารถพบได้ใน JDK:

isEmpty()

hasChildren()

ด้วยวิธีนี้ชื่อจะถูกอ่านเหมือนจะมีเครื่องหมายคำถามอยู่ด้านท้าย

คอลเล็กชันว่างเปล่าหรือไม่
Node นี้มีลูกหรือไม่?

และtrueหมายความว่าใช่และfalseหมายความว่าไม่ใช่

หรือคุณสามารถอ่านแบบยืนยัน:

คอลเล็กชันว่างเปล่า
โหนดมีลูก

หมายเหตุ:บางครั้งคุณอาจต้องการที่จะตั้งชื่อบางสิ่งบางอย่างเช่นวิธีการ
createFreshSnapshot?หากไม่มีเครื่องหมายคำถามชื่อหมายความว่าเมธอดควรสร้างสแนปชอตแทนที่จะตรวจสอบเพื่อดูว่าจำเป็นหรือไม่

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

ถ้าคุณทำการค้นหาของ GoogleสำหรับisEmpty()ใน Java API คุณได้รับจำนวนมากของผล


แล้ว createFreshSnapshot ล่ะ?
letronje

4
@letr ฉันอาจจะเปลี่ยนชื่อเป็นไฟisSnapshotExpiredหรืออะไรประมาณนั้น (ตามเกณฑ์ของคุณ)
jjnguy

8
ฉันเข้าใจปัญหา 'createFrshSnapshot' โดยใช้คำว่า 'should' - เช่น "shouldCreateFreshSnapshot ()" (แม้ว่าในกรณีนี้ isSnapshotExpired () จะดีกว่า)
DJClayworth

1
ฉันตรวจดูว่าควรส่งข้อความการเต้นของหัวใจด้วยshouldHeartbeat()วิธีใด
Erick Robertson

ทำไมคิดว่าisEmpty()และhasChildren()มีคำถามและไม่ยืนยัน ? จริงๆแล้วมันอ่านภาษาอังกฤษได้ดีกว่าเล็กน้อยหากคุณคิดว่าชื่อเหล่านั้นเป็นการยืนยันหรือเพรดิ
rick

29

หากคุณต้องการให้คลาสของคุณเข้ากันได้กับข้อกำหนดJava Beansเพื่อให้เครื่องมือที่ใช้การสะท้อน (เช่นJavaBuilders , JGoodies Binding ) สามารถจดจำตัวรับบูลีนไม่ว่าจะใช้getXXXX()หรือisXXXX()เป็นชื่อวิธีการ จากข้อมูลจำเพาะ Java Beans:

8.3.2 คุณสมบัติบูลีน

นอกจากนี้สำหรับคุณสมบัติบูลีนเราอนุญาตให้เมธอด getter จับคู่รูปแบบ:

public boolean is< PropertyName > ();

เมธอด“ is < PropertyName >” นี้อาจถูกจัดเตรียมแทนเมธอด“ get < PropertyName >” หรืออาจระบุเพิ่มเติมจากเมธอด“ get < PropertyName >” ไม่ว่าในกรณีใดถ้าเมธอด“ is < PropertyName >” มีอยู่สำหรับคุณสมบัติบูลีนเราจะใช้เมธอด“ is < PropertyName >” เพื่ออ่านค่าคุณสมบัติ ตัวอย่างคุณสมบัติบูลีนอาจเป็น:

public boolean isMarsupial();
public void setMarsupial(boolean m);

มันสับสนเมื่อคุณบอกว่าpublic boolean is<PropertyName>(); ดูเหมือนทั่วไป
Erick Robertson

เฮ้ฉันแค่อ้างสเป็ค ฉันจะตัวเอียงตามข้อมูลจำเพาะ
Jason S

5
ฉันไม่สนใจว่าจะเข้ากันได้กับ abt Java beans ฉันแค่อยากให้ชื่อเมธอดของฉันฟัง
ดูถูก

4
แม้ว่าคุณจะไม่สนใจเกี่ยวกับความเข้ากันได้ของ Javabeans แต่รูปแบบการตั้งชื่อก็น่าติดตามเพราะมันเติบโตเกินขอบเขตต้นกำเนิดของการกำหนดค่า 'beans' ใน IDE ตัวอย่างเช่นถ้าคุณใช้ isEmpty เป็นชื่อเมธอดคุณสามารถเรียกเมธอดนี้จาก JSP โดยใช้ object.empty อย่างไรก็ตามคุณไม่สามารถเรียกเมธอดด้วยคำนำหน้าอื่น ๆ ได้ดังนั้นคุณจึงไม่สามารถใช้ object.children เพื่อเรียก object.hasChildren () ได้ ดังนั้น JSP และ EL (Expression Language) จึงช่วยให้คุณเข้าถึง Javabeans Properties ชัยชนะที่ยิ่งใหญ่ถ้าคุณถามฉัน
Stijn de Witt

JavaBeans มีความเฉพาะเจาะจงมากขอบคุณที่เตือนสิ่งนั้น ฉันมักจะสงสัยและมักจะคิดว่าฉันติดอยู่กับคำนำหน้า "is" แต่ไม่ใช่เลย
Snicolas

26

ฉันต้องการโพสต์ลิงก์นี้เนื่องจากอาจช่วยเพิ่มเติมสำหรับคนที่ตรวจสอบคำตอบนี้และกำลังมองหารูปแบบจาวาเพิ่มเติม

แนวทางรูปแบบการเขียนโปรแกรม Java

รายการ "2.13 เป็นคำนำหน้าควรใช้สำหรับตัวแปรบูลีนและวิธีการ" มีความเกี่ยวข้องโดยเฉพาะและแนะนำว่าเป็นคำนำหน้า

คู่มือสไตล์จะแนะนำ:

มีทางเลือกสองสามทางสำหรับคำนำหน้าคือที่เหมาะกับบางสถานการณ์ เหล่านี้จะมี , สามารถและควรคำนำหน้า:

boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

หากคุณปฏิบัติตามแนวทางฉันเชื่อว่าจะมีการตั้งชื่อวิธีการที่เหมาะสม:

shouldCreateFreshSnapshot()

2
FYI มีแนวทางมีลิขสิทธิ์ Geotechnical Software Services ที่กล่าวว่าพวกเขามีแหล่งอ้างอิงที่ด้านล่างเพื่อแนะนำว่าพวกเขาถูกกฎหมาย
Donal Lafferty

11

สำหรับวิธีการที่อาจล้มเหลวนั่นคือคุณระบุบูลีนเป็นประเภทการส่งคืนฉันจะใช้คำนำหน้าtry:

if (tryCreateFreshSnapshot())
{
  // ...
}

สำหรับกรณีอื่น ๆ ให้ใช้คำนำหน้าเช่นis.. has.. was.. can.. allows....


15
แต่พยายามไม่ได้สื่อว่าเป็นคำถาม (มีค่าตอบแทน)
Steve Kuo

อย่าส่งคืนบูลีนเพื่อระบุว่าเมธอดล้มเหลวหรือไม่ หากวิธีการล้มเหลวให้โยนข้อยกเว้น ลองนึกภาพวิธีการล้มเหลวและคุณได้รับเท็จคุณจะตัดสินได้อย่างไรว่าเกิดอะไรขึ้น?
Wouter van Koppen


2

isเป็นสิ่งที่ฉันเจอมากกว่าที่อื่น ๆ สิ่งที่สมเหตุสมผลในสถานการณ์ปัจจุบันเป็นทางเลือกที่ดีที่สุด


0

ผมอยากจะชี้ให้มุมมองที่แตกต่างกันเกี่ยวกับเรื่องนี้โดยทั่วไปการตั้งชื่อเช่น:

ดูjava.util.Set :boolean add​(E e)

โดยที่เหตุผลคือ:

ไม่ดำเนินการบางอย่างแล้ว รายงาน ว่าจะประสบความสำเร็จหรือไม่

ในขณะที่ชื่อเมธอดreturnเป็นจริงbooleanควรชี้ให้การประมวลผลเสร็จสมบูรณ์แทนที่จะเป็นประเภทผลลัพธ์ (บูลีนสำหรับตัวอย่างนี้)

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


1
ฉันไม่แน่ใจว่าทำไมคุณถึงถูกลดคะแนนฉันเห็นด้วย แม้ว่าฉันจะหลีกเลี่ยงการใช้มันเพราะมันไม่ได้มีความหมายเลย แต่มันเป็นแบบแผนที่ใช้โดย java API ภายในจำนวนมาก
Kamil Bęben

1
ฉันเดาว่าเพราะตอนแรกฉันเขียนแค่ "Set: boolean add (E e)" ดังนั้นผู้คนจึงไม่ได้สังเกตว่ามันเกี่ยวกับ java.util.Set ที่รู้จักกันดี หรืออาจจะเป็นเพราะภาษาอังกฤษของฉันแย่มาก: D. ขอบคุณสำหรับการ
โหวตขึ้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.