Java boolean getters“ is” vs“ are”


92

ฉันรู้ว่าการประชุมใน Java สำหรับบูลีน getters มีคำนำหน้า "is" ด้วย

isEnabled
isStoreOpen

แต่ถ้าหัวเรื่องเป็นพหูพจน์ล่ะ? นั่นคือถ้าแทนที่จะอยากรู้ว่ามีร้านเปิดไหมฉันอยากรู้ว่าร้านทั้งหมดเปิดหรือเปล่า

isStoresOpen() ไม่สมเหตุสมผลในภาษาอังกฤษ

ฉันอยากจะเขียน getters เช่น:

areStoresOpen
areDogsCute
areCatsFuzzy

และผมคิดว่าจะทำให้ความรู้สึก แต่ฉันได้รับการบอกเล่าจากคนอื่น ๆ ที่ผมควรจะดูดขึ้นและละทิ้งเรื่องคำกริยาข้อตกลงและการใช้งานisStoresOpen, ,isDogsCuteisCatsFuzzy

อย่างไรก็ตามฉันควรทำอย่างไรสำหรับตัวรับบูลีนที่ทำงานในเรื่องพหูพจน์


3
ฉันไม่เคยเห็นมาก่อนare*()เลย
rekire

21
ฉันมักจะเขียนare*()getters ถ้ามันถูกต้องตามหลักไวยากรณ์
Roddy of the Frozen Peas

2
ถ้าวัตถุของคุณเป็นถั่วฉันคิดว่าคุณต้องยึดติดกับอย่างใดอย่างหนึ่งisหรือhas...
assylias

4
ถ้าคุณใช้ are * () getter มันควรจะคืนค่าบูลีน [] ในกรณีส่วนใหญ่ฉันคิดว่า
Juvanis

2
คำถามที่ดีมาก สงสัยตัวเองอยู่ไม่น้อย ดังที่คำตอบมากมายได้ชี้ให้เห็นแล้วเฟรมเวิร์ก IDE และอะไรก็ตามที่อาศัยหลักการที่ฉันเคยพบใช้รูปแบบ "get" / "set" / "is" แม้ว่านี่จะไม่ใช่ข้อกังวลในแอปพลิเคชันของคุณ แต่ฉันก็จะทำตามหลักการนั้นโดยไม่คำนึงถึง - รหัสของคุณจะติดตามได้ง่ายกว่ามาก (แม้โดยคุณ) หากคุณรักษารูปแบบการตั้งชื่อที่สอดคล้องกัน (แม้ว่าบางครั้งมันจะฟังดูไม่ผิดไวยากรณ์ก็ตาม ).
Paul Richter

คำตอบ:


58

ฉันจำไม่ได้ว่าเล่มนี้มาจากเล่มไหน แต่สาระสำคัญคือโค้ดจะถูกอ่านมากกว่าที่เขียน เขียนเพื่อให้อ่านง่าย


21
Clean Code - Robert Martin
John B

John B: ฉันยังไม่ได้อ่านหนังสือเล่มนั้น บางทีฉันอาจจะอ่านข้อมูลอ้างอิง หนังสืออีกเล่มสำหรับรายการของฉันแม้ว่า :)
ยอห์น

8
แต่ระวังอย่าไปไกลเกินไป storesAreOpen()น่าจะเป็นไวยากรณ์ที่ถูกต้องที่สุด (เพราะif(storesAreOpen())) แต่ตอนนี้ส่วนบูลีนของชื่อถูกซ่อนอยู่ตรงกลางของชื่อเมธอดซึ่งจะทำลายอนุสัญญา Java และโค้ดที่อ่านได้
Izkata

3
เขาตอบคำถามโดยทั่วไปมาก เป็นความจริงที่เขาไม่ได้พูดถึงรายละเอียด แต่นี่คือคำตอบ อาจดูซ้ำซาก แต่ก็มีค่า (อย่างน้อย 24 คนคิดอย่างนั้น)
George Stocker

4
เพื่อชี้แจงคำตอบฉันจะเพิ่มข้อสังเกตว่าareStoresOpen ()เป็นตัวเลือกที่ดีที่นี่
kiedysktos

96

วิธีการมีภาษาอังกฤษที่ดีเพียงพอและปฏิบัติตามมาตรฐาน Java:

isEveryStoreOpen() หรือ isEachCatCute()

เมื่อมีข้อสงสัยเกี่ยวกับคำที่ถูกต้องฉันมักจะตีอรรถาภิธาน


19
+1 สิ่งนี้บ่งบอกอย่างชัดเจนว่าค่าที่ส่งคืนหมายถึง isEveryStoreOpen () หรือ isAnyStoreOpen () ซึ่งแตกต่างจาก isStoresOpen () ที่ไม่ชัดเจน
Imre

5
+1 นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! ทำให้รู้สึกถูกต้องตามหลักไวยากรณ์ในขณะที่รักษาหลักการคำนำหน้าbooleanของJava isนอกจากนี้ยังมีข้อมูลเพิ่มเติมเล็กน้อยที่จะเป็นประโยชน์อย่างแท้จริงสำหรับผู้ที่พูดภาษาอังกฤษที่ไม่ใช่เจ้าของภาษาซึ่งเป็นผู้ดูแล codebase
higuaro

1
คำตอบนี้เปลี่ยนชีวิตฉัน! และควรเป็นคำตอบที่ได้รับการยอมรับ
Marcel Blanck

34

แบบแผนคือการเติมคำนำหน้า getter-method ด้วย "is" ไม่ใช่ตัวแปรนั้นเอง

เช่น

private boolean enabled;

public boolean isEnabled() {
    return enabled;
}

และ

private boolean storesOpen;

public boolean isStoresOpen() {
    return storesOpen;
}

isStoresOpen () ไม่สมเหตุสมผลในภาษาอังกฤษ

อาจไม่สมเหตุสมผลตามหลักไวยากรณ์ แต่เป็นไปตามแบบแผนและดูอ่านได้เพียงพอ


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

@kodai: ฉันคิดว่ามันไม่ควรถือเป็นกฎ แต่เป็นเพียงแค่การประชุมเท่านั้น แต่ฉันเชื่อว่าในขณะที่การเขียนโค้ดไม่เป็นไปตามแบบแผนหากไม่จำเป็นเพื่อให้โค้ดอ่านได้ก็เป็นหนทางที่จะไป
Bhesh Gurung

18

ข้อกำหนด Java Bean กล่าวว่าจะใช้getสำหรับ getters เว้นแต่จะเป็นการใช้งานแล้วboolean ไม่ได้มาตรฐานและจะไม่ได้รับการยอมรับจากสิ่งใดก็ตามที่คาดหวังการตั้งชื่อ Bean มาตรฐานisare


17

จำนวนมากเครื่องมือคาดหวังisหรือและจะไม่น่าจะรับรู้getare

ลองเปลี่ยนวลีเช่นgetDogsAreFuzzy()หรือgetStoresAreOpen()หรือสิ่งที่ต้องการเพื่อความเข้ากันได้และการประชุมที่ดีขึ้น


ใช่. เครื่องมือเช่นโปรแกรมอรรถประโยชน์ bean ไว้วางใจในคำนี้คือการค้นหาบูลีน getters
nalply

4

- isEnabled()นอกจากนี้ยังสามารถเขียนเป็นในgetEnabled()Java naming conventions

-เพียงแค่เป็นนิสัยที่ดีในการปฏิบัติตามอนุสัญญาการตั้งชื่อ, Java Beansความช่วยเหลือเมื่อคุณกำลังทำงานกับ


3

โดยทั่วไปฉันคิดว่าโค้ดควรอ่านได้ง่ายที่สุดเท่าที่จะเป็นไปได้เพื่อให้เมธอดสามารถอ่านเป็นย่อหน้าClean Codeได้ ดังนั้นฉันจะตั้งชื่อวิธีการให้เสียง / อ่านง่ายที่สุดและใช้กฎแกรมมาร์ของare. ด้วย IDEs ทันสมัยมันเป็นเรื่องง่ายที่จะหาวิธีการโดยไม่ได้มองเฉพาะสำหรับ/getis

อย่างไรก็ตาม Kumar ให้ความสำคัญกับถั่ว จำนวนมากเพียงเครื่องมือที่จะมองหา/get isในกรณีนั้นฉันอาจพิจารณาใช้ทั้งสองวิธี หนึ่งเพื่อความสะดวกในการอ่านและอีกอันสำหรับการใช้เครื่องมือ


3

คุณเขียนภาษาอะไร: EnglishหรือJava ?

เมื่อฉันอ่านรหัส Java ผมคาดหวังสิ่งที่จะมีการมีผมที่จะค้นหาทั้ง getters กับเป็นและมีคำนำหน้าจะมีความซับซ้อนมากกว่าการค้นหาเพียงคำนำหน้าหนึ่ง

อย่างไรก็ตามในทางกลับกันเมื่อฉันอ่านหนังสือพิมพ์ในตอนเช้าฉันไม่ได้มองหาอะไรเลยดังนั้นคุณสามารถเขียนภาษาอังกฤษแบบดั้งเดิมได้มากขึ้น

กลับ 0;


3

ในคำถามของคุณคุณกำลังถามอย่างชัดเจนเกี่ยวกับ getters Getter ส่งคืนข้อมูลบางส่วนเกี่ยวกับอินสแตนซ์ของชั้นเรียนของคุณ Storeตัวอย่างเช่นคุณได้เรียน ตอนนี้isStoreOpenเป็นชื่อวิธีการที่ดีอย่างสมบูรณ์แบบสำหรับ getter

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

หากไม่เป็นเช่นนั้นชื่อเมธอดนี้ก็ใช้ได้ดี ทางเลือกอื่นอาจallStoresOpenไม่มีเพียง"is"

TL; DR: หากคุณกำลังจัดการกับหลาย ๆ อินสแตนซ์มันไม่ใช่เรื่องน่ารู้ ถ้าเป็นเช่นนั้นการออกแบบของคุณไม่ดี


2

ค่อนข้างตรงไปตรงมาผมจะบอกว่าแน่นอนลืมเกี่ยวกับและติดกับare* is*คิดว่า"is"เป็นตัวแปรที่มีความหมายและตั้งชื่อให้ดีขึ้นถ้าเป็นไปได้

ฉันจะบอกว่า isStoresOpen ไม่ได้ฟังดูแย่ แต่คุณสามารถสร้าง isStoresAreOpen ได้หากฟังดูดีกว่าสำหรับคุณ

แต่ความคิดทั่วไปของฉันคือยึดติดกับอนุสัญญา ซึ่งใช้ "get" สำหรับ getters และ "is" สำหรับประเภทบูลีน โดยส่วนตัวแล้วฉันคิดว่าการใช้ "is" บางครั้งก็เป็นปัญหาอยู่แล้ว ใช่ - มันดูดีในเงื่อนไข "if" แต่บางครั้งฉันก็เขียนว่า "get" เมื่อเขียนโค้ดและตรวจสอบรายการแบบเลื่อนลงสำหรับตัวแปรที่ต้องการและเริ่มสงสัยว่ามีอะไรผิดปกติและทำไมฉันไม่พบมันแล้วฉันก็รู้ ขึ้นต้นด้วย "is" ...


1

ในการเขียนโปรแกรมเชิงวัตถุสิ่งนี้แทบจะไม่เคยเกิดขึ้นตั้งแต่StoreหรือCatหรือสิ่งที่คุณควรจะเป็นคลาสแยกต่างหากด้วยตัวของมันเองisOpen()หรือisFuzzy()วิธีการ หากคุณมีประเภทที่สูงกว่าให้พิจารณาแยกระดับอะตอมที่คุณใช้งานจริงมากขึ้น โดยทั่วไปวัตถุไม่ควรเป็นพหูพจน์ในระดับต่ำสุด


1

isStoresOpen ()ใน StoresOpen นี้ดูเหมือนเป็นพหูพจน์

เมื่อคุณปฏิบัติตาม Java Naming Convention และ Java Beans Standards จะมีคำนำหน้าที่กำหนดไว้ล่วงหน้าสำหรับบูลีนและประเภทอื่น ๆ ดังนั้นคุณควรปฏิบัติตามอนุสัญญา Java Beans Naming

ลองมาถึงจุดของคุณเมื่อคุณเห็นstoresOpenเช่นเดียวกับในอังกฤษในอนาคตใช่มันดูเหมือนพหูพจน์ สังเกตคำนั้นอย่างลึกซึ้งอีกครั้ง

ที่นี่

storesOpenเป็นพหูพจน์ตามไวยากรณ์ภาษาอังกฤษ

การออกมาของisStoresOpenไม่ใช่พหูพจน์แทนที่จะเป็นเอกพจน์หรือคุณสามารถพูดได้ว่าเป็นสเกลาร์ในรูปแบบการเขียนโปรแกรม

ผลลัพธ์ออกมาเป็นบูลีนจริงหรือเท็จ

ไม่เหมือนกับประโยคพหูพจน์ภาษาอังกฤษของคุณจริงหรือเท็จ

ไม่ใช่อาร์เรย์ของจริงหรือเท็จหรือไม่ใช่คอลเลกชันของจริงหรือเท็จ

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

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

ทำไมหมายความว่ามันไม่ฉลาดไปกว่าคุณเท่าที่คุณรู้ไวยากรณ์ภาษาอังกฤษเช่นพหูพจน์ / เอกพจน์มัลติเพล็กเซอร์

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