สำหรับฟิลด์บูลีนการตั้งชื่อแบบแผนสำหรับทะเยอทะยาน / เซทเทอร์คืออะไร


178

เช่น.

boolean isCurrent = false;

คุณชื่ออะไรทะเยอทะยานและตั้งมัน?


2
ฉันถือว่าคุณกำลังอ้างถึง JavaBeans ซึ่งคำตอบของ @Jigar Joshi นั้นถูกต้อง อย่างไรก็ตามหากคุณกำลังถามเกี่ยวกับ getter / setters ทั่วไปความเชื่อมั่นเพียงอย่างเดียวคือวิธีการที่มีชื่อของฟิลด์และ getter จะไม่มีข้อโต้แย้งและส่งกลับค่าตัวตั้งค่าจะใช้อาร์กิวเมนต์หนึ่งตัวและส่งคืนค่า ดูบัฟเฟอร์เป็นตัวอย่างของวิธีการอื่นในการ getter / setters
Peter Lawrey

คำตอบ:


255

สมมติว่าคุณมี

boolean active;

วิธีการเข้าถึงจะเป็น

public boolean isActive(){return this.active;}

public void setActive(boolean active){this.active = active;}

ดูสิ่งนี้ด้วย


9
คุณสามารถชี้ส่วนของระเบียบรหัสของ Sun ที่ชื่อบูลีนทะเยอทะยานครอบคลุมเฉพาะ? ฉันหามันไม่เจอ
Konstantin Pelepelin

4
ฉันมี บูลยื่นชื่อhasCustomNameตอนนี้สิ่งที่ฉันควรตั้งชื่อให้มันของทะเยอทะยานและหมาวิธี? คือsetHasCustomName[setter]และhasCustomName[getter]ดีหรือไม่?
Hadi

@Hadi เพียงแค่ตั้งชื่อตัวแปร "customerName" ของคุณและสร้าง getter n setter ให้ getter และ setters ที่คาดหวังคือ public boolean isCustomerName(){return this.customerName;} public void setCustomerName(boolean customerName){this.customerName= customerName;}
Assegd

1
เราจะได้รับจากชื่อที่กำหนดเองเป็นชื่อลูกค้าได้อย่างไร ;)
Kartik Chugh

1
@Assegd การตั้งชื่อมันว่า "customerName" หรือ "customName" นั้นทำให้เกิดความสับสนและไม่แสดงว่าเป็นบูลีน เห็นตัวแปรฉันคาดว่ามันจะมีชื่อ ในกรณีนี้ควรเรียกว่า "hasCustomName" IMO
นาธา

83

http://geosoft.no/development/javastyle.html#Specific

  1. is คำนำหน้าควรใช้สำหรับตัวแปรและวิธีการบูลีน

    isSet, isVisible, isFinished, isFound,isOpen

นี่คือหลักการตั้งชื่อสำหรับเมธอดบูลีนและตัวแปรที่ใช้โดย Sun สำหรับแพ็กเกจแกน Java การใช้คำนำหน้า is แก้ไขปัญหาทั่วไปของการเลือกชื่อบูลีนที่ไม่ดีเช่นสถานะหรือแฟล็ก isStatus หรือ isFlag ไม่เหมาะและโปรแกรมเมอร์ถูกบังคับให้เลือกชื่อที่มีความหมายมากกว่า

เมธอด Setter สำหรับตัวแปรบูลีนต้องตั้งค่าคำนำหน้าเช่นเดียวกับใน:

void setFound(boolean isFound);

มีสองทางเลือกในการเป็นคำนำหน้าซึ่งเหมาะกับบางสถานการณ์ สิ่งเหล่านี้มีความสามารถและควรนำหน้า:

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

7
ดังนั้นหากมีคุณสมบัติบูลีนhasDataตัวตั้งค่าจะเป็นอย่างไร แน่นอนที่สุดsetData(bool hasData)ฉันคิดว่าผิดอย่างมาก ...
ฟรานซ์บี

7
@FranzB ฉันจะใช้ setHasData (... )
user362178

2
สำหรับผู้ที่ต้องการต่อไปนี้ JavaBeans specifcation มันก็ดูเหมือนว่าhas, can, shouldคำนำหน้าไม่ได้เป็นส่วนหนึ่งของข้อกำหนด ข้อมูลจำเพาะ JavaBeansอ้างอิง1.01ส่วน 8.3
VCD

@ แอนดรูว์สวัสดี เมื่อฉันใช้ 'คือ' คำนำหน้าในตัวแปรของฉันและส่งค่าของตัวแปรนั้นจากไฟล์ js ของฉันในข้อมูลมันจะให้ค่าเป็นเท็จเสมอ และถ้าฉันลบ 'เป็น' คำนำหน้ากว่ามันทำงานได้ดีอย่างแน่นอน อะไรคือสาเหตุของสิ่งนั้น? ขอบคุณล่วงหน้า.
Me_developer

1
หมาเป็นเรื่องที่ง่ายสำหรับทะเยอทะยานที่ฉันมีที่จะใช้boolean isIsCurrent(){...}อย่างอื่นกรอบที่ใช้ในการ deserialize getter not found for property isCurrentวัตถุบ่นกับ
Maurizio Lo Bosco

67

สำหรับฟิลด์ที่มีชื่อการตั้งชื่อisCurrentgetter / setter ที่ถูกต้องคือsetCurrent()/ isCurrent()(อย่างน้อยนั่นคือสิ่งที่ Eclipse คิด) ซึ่งมีความสับสนสูงและสามารถสืบย้อนกลับไปที่ปัญหาหลัก:

ฟิลด์ของคุณไม่ควรถูกเรียกisCurrentตั้งแต่แรก Is is verb and verbs ไม่เหมาะสมในการแสดงสถานะของ Object ใช้คำคุณศัพท์แทนและทันใดนั้นชื่อ getter / setter ของคุณจะเหมาะสมกว่า:

private boolean current;

public boolean isCurrent(){
    return current;
}

public void setCurrent(final boolean current){
    this.current = current;
}

4
เกิดอะไรขึ้นถ้าบูลีนไม่ได้เป็นแบบดั้งเดิม? ถ้าเป็นบูลีนควรได้รับหรือไม่
อรุณ

2
ไม่ได้เมธอดดังกล่าวสามารถส่งคืนค่า Null ซึ่งจะทำให้ NullPointerException แต่ฉันจะพยายามหลีกเลี่ยงการกลับบูลีนในตอนแรก
ฌอนแพทริคฟลอยด์

3
@ วิ่งฉันคิดว่ามันควรจะตั้ง / รับแทนถ้า set / เป็นเพราะบูลีนเป็นวัตถุแทนดั้งเดิมเพราะมี 3 สถิติเท็จจริงหรือ null
Al-Mothafar

1
IntelliJ จะใช้ค่าเริ่มต้นเป็นgetคำนำหน้าเมื่อเรียกข้อมูลBooleanvs isสำหรับ aboolean
jocull

1
@jocull และที่เป็นพฤติกรรมที่ถูกต้องตามข้อกำหนด JavaBeans
ฌอนแพทริคฟลอยด์

6

ฉันเชื่อว่ามันจะเป็น:

void setCurrent(boolean current)
boolean isCurrent()

1
ฉันชอบการประชุมนั้น แต่การประชุมก็ไม่สำคัญ สิ่งสำคัญที่สุดคือติดกับสิ่งที่คุณเลือก
ผ่อนผัน Herreman

4
อนุสัญญา @Clement ไม่สำคัญเมื่อคุณพึ่งพาเครื่องมือที่ใช้การประชุมเหล่านี้ JavaBeans เป็นแบบแผนที่มีการสนับสนุนอย่างกว้างขวางในไลบรารีมากมาย (JSP / JSF / Spring / Groovy เพียงเพื่อตั้งชื่อไม่กี่) การทำลายอนุสัญญาหมายถึงการทำลายวิธีการทำงานของห้องสมุดเหล่านี้
ฌอนแพทริคฟลอยด์

1
@Sean Right ยกเว้นเฟรมเวิร์กที่ใช้ข้อตกลงเหนือการกำหนดค่า ในกรณีนี้การประชุมถูกกำหนดโดยกรอบดังนั้นคุณจึงไม่ได้เลือกอะไรเลย คำพูดที่ดี
ผ่อนผัน Herreman

5

อาจถึงเวลาที่จะเริ่มแก้ไขคำตอบนี้? ส่วนตัวผมจะลงคะแนนให้setActive()และunsetActive()(ทางเลือกที่สามารถsetUnActive(), notActive(),disable()ฯลฯ ขึ้นอยู่กับบริบท) ตั้งแต่ "setactive" หมายถึงการที่คุณเปิดใช้งานได้ตลอดเวลาที่คุณทำไม่ได้ มันเป็นชนิดของตัวนับที่ใช้งานง่ายที่จะพูดว่า "setActive" แต่จริงๆแล้วเอาสถานะที่ใช้งาน

ปัญหาอีกประการหนึ่งคือคุณไม่สามารถฟังเหตุการณ์ SetActive ในแบบ CQRS โดยเฉพาะคุณจะต้องฟัง 'setActiveEvent' และพิจารณาว่าผู้ฟังนั้นถูกตั้งค่าจริงหรือไม่ หรือแน่นอนกำหนดเหตุการณ์ที่จะโทรเมื่อโทรsetActive()แต่นั้นขัดกับหลักการแยกข้อกังวล

การอ่านที่ดีเกี่ยวกับเรื่องนี้คือบทความ FlagArgument โดย Martin Fowler: http://martinfowler.com/bliki/FlagArgument.html

อย่างไรก็ตามฉันมาจากพื้นหลังของ PHP และเห็นว่าแนวโน้มนี้ถูกนำมาใช้มากขึ้นเรื่อย ๆ ไม่แน่ใจว่าสิ่งนี้มีชีวิตอยู่กับการพัฒนา Java


-1
private boolean current;

public void setCurrent(boolean current){
    this.current=current;
}

public boolean hasCurrent(){
    return this.current;
}

3
ปัจจุบันมีอะไร ผมคิดว่าการhasใช้สำหรับ BO หรือบริการดังกล่าวด้วยการประมวลผลบางอย่างในขณะที่สำหรับ POJO isมันเป็น และโปรดเพิ่มคำอธิบายบางอย่างเกี่ยวกับคำตอบของคุณ
Al-Mothafar

-3
Setter: public void setCurrent(boolean val)
Getter: public boolean getCurrent()

สำหรับบูลีนคุณสามารถใช้

public boolean isCurrent()

11
เนื่องจาก OP ระบุคำถามเกี่ยวกับค่าบูลีน getter นำหน้าด้วย 'get' คือ (อ่าน: ควร) ไม่เคยถูกใช้สำหรับค่าบูลีน
แฮโรลด์

-4

ในฐานะที่เป็นหมาเซทเทอร์

// setter
public void beCurrent(boolean X) {
    this.isCurrent = X;
}

หรือ

// setter
public void makeCurrent(boolean X) {
    this.isCurrent = X;
}

ฉันไม่แน่ใจว่าการตั้งชื่อเหล่านี้เหมาะสมกับเจ้าของภาษาอังกฤษหรือไม่


1
พวกเขาไม่รู้สึกจริง ๆ เลย
Yannjoel

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