Java คืออะไร: ตัวดำเนินการที่เรียกและทำหน้าที่อะไร?


161

ฉันได้ทำงานกับ Java สองสามปี แต่จนถึงเมื่อเร็ว ๆ นี้ฉันไม่ได้ทำงานข้ามโครงสร้างนี้:

int count = isHere ? getHereCount(index) : getAwayCount(index);

นี่อาจเป็นคำถามที่ง่ายมาก แต่มีคนอธิบายได้ไหม ฉันจะอ่านมันได้อย่างไร ฉันค่อนข้างแน่ใจว่าฉันรู้ว่ามันทำงานอย่างไร

  • ถ้าisHereเป็นจริงgetHereCount()เรียกว่า
  • ถ้าisHereเป็นเท็จgetAwayCount()เรียกว่า

แก้ไข? สิ่งก่อสร้างนี้เรียกว่าอะไร?


2
ดูstackoverflow.com/questions/795286/what-does-do-in-cสำหรับคำถามรุ่น C ++ (ถามเมื่อวานนี้เท่านั้นจริง ๆ แล้ว)
Michael Myers

2
โปรดทราบว่าโลก C / C ++ / Java แบ่งออกเป็นส่วน ๆ อย่างเท่าเทียมกันระหว่างผู้ที่คิดว่ามันน่าเกลียดและสับสนและจะหลีกเลี่ยงเช่นโรคระบาดและผู้ที่คิดว่าคุณไม่สามารถเรียกร้องให้รู้ว่า C, C ++ หรือ Java อย่างแท้จริง ไม่สามารถจดจำและใช้งานได้โดยไม่หยุดคิด
Paul Tomblin

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

17
answer_to_question = (รู้จัก _operator)? (social_acceptance): (condescending_finger_wag)
Dan

คุณสามารถอ้างอิงทรัพยากรนี้สำหรับข้อมูลเพิ่มเติม
พระอิศวร

คำตอบ:


189

ใช่มันเป็นรูปแบบย่อของ

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

มันเรียกว่าผู้ประกอบการที่มีเงื่อนไข คนจำนวนมาก (ผิดพลาด) เรียกมันว่าตัวดำเนินการที่ประกอบไปด้วยเพราะมันเป็นตัวดำเนินการที่สาม (สามอาร์กิวเมนต์) ใน Java, C, C ++ และภาษาอื่น ๆ อีกมากมาย แต่ในทางทฤษฎีอาจมีตัวดำเนินการแบบไตรภาคอื่นได้ในขณะที่อาจมีตัวดำเนินการแบบมีเงื่อนไขเดียวเท่านั้น

ชื่ออย่างเป็นทางการจะได้รับในข้อกำหนดภาษา Java :

§15.25ผู้ประกอบการตามเงื่อนไข? :

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

โปรดทราบว่าทั้งสองสาขาจะต้องนำไปสู่วิธีการที่มีค่าส่งคืน:

มันเป็นข้อผิดพลาดในการรวบรวมเวลาสำหรับการแสดงออกที่สองหรือที่สามตัวถูกดำเนินการที่จะขอร้องจากวิธีการโมฆะ

ในความเป็นจริงโดยไวยากรณ์ของคำสั่งการแสดงออก ( -14.8 ) มันไม่ได้รับอนุญาตสำหรับการแสดงออกตามเงื่อนไขที่จะปรากฏในบริบทใด ๆ ที่การภาวนาของวิธีการโมฆะอาจปรากฏขึ้น

ดังนั้นถ้าdoSomething()และdoSomethingElse()เป็นโมฆะวิธีคุณไม่สามารถบีบอัดนี้:

if (someBool)
    doSomething();
else
    doSomethingElse();

เป็นนี้

someBool ? doSomething() : doSomethingElse();

คำง่าย ๆ :

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 

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

8
ฉันสมมติว่า doSomething () และ doSomethingElse () เป็นวิธีการที่เป็นโมฆะ สิ่งที่บิตสุดท้ายของสเปคบอกว่าคือผู้ประกอบการที่สามต้องส่งคืนค่าดังนั้นไม่มีตัวถูกดำเนินการใด ๆ ที่สามารถเป็นวิธีการที่เป็นโมฆะ
Michael Myers

มันบอกว่ามากกว่านั้น มันบอกว่าผู้ประกอบการตามเงื่อนไขไม่ได้รับอนุญาตที่เป็นโมฆะวิธีการปรากฏขึ้น ตัวอย่างเช่นข้อความต่อไปนี้: VALID: String x = (false)? "X": "Y"; ไม่ถูกต้อง: (เท็จ)? "X": "Y";
kenj0418

4
มันไม่ผิดที่จะเรียกมันว่า "ผู้ประกอบการที่สาม" เช่นเดียวกับที่มันไม่ผิดพลาด (ในปี 2559) ที่อ้างถึงโอบามาว่า "ประธานาธิบดี" แม้ว่าจะเป็นไปได้ว่าจะมีประธานาธิบดีคนอื่นในอนาคต
Dawood ibn Kareem

2
@DawoodibnKareem ฉันคิดว่าไมเคิลจงใจรวมอยู่theในการทำตัวเอียงthe ternary operatorและนั่นคือสิ่งที่เขาหมายถึงผิดพลาดไม่ใช่ternary operatorผิด ประกอบ ternary หมายความว่าเป็นไมเคิลกล่าวว่ามันเป็นเพียงคนเดียวซึ่งในทางกลับกันอาจนำไปสู่หนึ่งที่จะคิดจะต้องไม่มีผู้ประกอบการอื่น ๆ ประกอบไปด้วยซึ่งเป็นสิ่งที่ไมเคิลบอกว่าเป็นความผิดพลาดและฉันเห็นด้วยก็จะเป็น สมมติฐานที่ผิดพลาด
Ghoti และ Chips

32

คนอื่น ๆ ตอบคำถามนี้ในระดับที่สมเหตุสมผล แต่มักใช้ชื่อ "ผู้ประกอบการที่ประกอบไปด้วยไตรภาค"

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

อย่างไรก็ตามสเป็คค่อนข้างชัดเจนว่าชื่อของมันคือโอเปอเรเตอร์ที่มีเงื่อนไขหรือ "โอเปอเรเตอร์ที่มีเงื่อนไข?:" จะไม่ต้องสงสัยอย่างแน่นอน ฉันคิดว่ามันชัดเจนกว่าที่จะเรียกใช้ชื่อนั้นเนื่องจากมันบ่งบอกถึงพฤติกรรมของผู้ประกอบการในระดับหนึ่ง (ประเมินสภาพ) มากกว่าการมีตัวถูกดำเนินการจำนวนเท่าไร


3
คำตอบนี้ถูกต้องทางเทคนิค อย่างไรก็ตามเนื่องจากมีผู้ประกอบการแบบไตรภาคเพียงคนเดียวคุณจึงมักเห็นว่าผู้ประกอบการแบบที่สาม แม้ว่าชื่อนี้จะไม่สื่อความหมายที่สมบูรณ์ของผู้ปฏิบัติงาน แต่ก็เป็นชื่อที่ติดอยู่ หากคุณพูดถึงชื่อ "ผู้ประกอบการที่ประกอบไปด้วย" โปรแกรมเมอร์รู้ว่าสิ่งที่คุณกำลังพูดถึง ข้อมูลจำเพาะที่คุณพูดถึงยังอ้างถึงผู้ประกอบการนี้ว่า "เงื่อนไขประกอบไปด้วยกัน" ซึ่งดูเหมือนว่ามีข้อมูลมากขึ้น java.sun.com/docs/books/jls/third_edition/html/…
Gary

17
ฉันแค่คิดว่ามันคุ้มค่าที่จะเรียกชื่อบางอย่างด้วยชื่อที่กำหนดไว้ โดยเฉพาะอย่างยิ่งหาก Java เคยได้รับโอเปอเรเตอร์อื่นผู้ที่ใช้คำว่า "โอเปอเรเตอร์เงื่อนไข" จะยังคงถูกต้องและไม่คลุมเครือ - ไม่เหมือนกับผู้ที่พูดว่า ใช่วลี "ผู้ประกอบการที่ประกอบไปด้วยไตรภาค" ติดอยู่คำตอบของฉันเป็นส่วนหนึ่งของความพยายามที่จะ "ปลด" มันเช่นเดียวกับที่ฉันพยายามแก้ไขการอ้างสิทธิ์ที่ "วัตถุถูกส่งผ่านโดยการอ้างอิง"
Jon Skeet

1
ฉันขอให้คุณไปที่หน้านี้จาก Oracleซึ่งพูดถึง "ตัวดำเนินการแบบมีเงื่อนไข" สามรายการ แต่มีตัวดำเนินการ "ประกอบไปด้วยสามข้อ" ได้หรือไม่? หากคุณต้องการทำให้ชัดเจนว่าโอเปอเรเตอร์ที่คุณหมายถึงควรใช้ชื่อที่คนส่วนใหญ่ใช้ (ใช่ฉันรู้ว่าฉันปรากฏตัวที่งานปาร์ตี้เหมือนกับโฮสต์กำลังล้างจานสุดท้าย)
Dawood ibn Kareem

@DavidWallace: การใช้ "โอเปอเรเตอร์ที่มีเงื่อนไขหรือไม่:" ดีกว่า IMO - จะแก้ไขเพื่อให้ชัดเจน แต่ฉันคิดว่ามันคุ้มค่าที่จะชักจูงคนให้ใช้ชื่อจริงของผู้ปฏิบัติงานแทนที่จะมุ่งเน้นไปที่แง่มุมหนึ่งของมัน (มีตัวถูกดำเนินการกี่ตัว) ที่ไม่มีส่วนเกี่ยวข้องกับพฤติกรรมของมัน (มันยังไม่ใช่เรื่องแปลกสำหรับบทเรียนที่จะมีความแม่นยำน้อยกว่าสเปคซึ่งเรียก&&ตามเงื่อนไขและผู้ประกอบการและ||เงื่อนไขหรือผู้ประกอบการ แต่ใช้เพียงแค่ "ผู้ประกอบการที่มีเงื่อนไข" สำหรับ?:.
จอนสกีต

ฉันไม่รู้ หากมีคนพูดว่า "ผู้ดำเนินการตามเงื่อนไข" กับฉันฉันจะไม่แน่ใจว่าพวกเขาหมายถึงอะไร ฉันมาจากไหน (ตรงข้ามกับโลกตรงข้ามกับคุณ) ผู้คนไม่เรียกสิ่งนี้ว่า หากพวกเขาพูดว่า "ผู้ประกอบการที่สาม" หรือ "ผู้ประกอบการขอ" ฉันก็เข้าใจ ฉันชื่นชมความใฝ่ฝันของคุณต้องการเปลี่ยนวิธีการพูดของผู้คน หากใครสามารถทำได้ก็เป็นคุณ แต่ฉันก็ไม่ได้คาดหวังอะไรมากมาย
Dawood ibn Kareem

17

จากข้อมูลจำเพาะของSun Javaนั้นเรียกว่า Conditional Operator ดูหัวข้อ 15.25 คุณพูดถูกในสิ่งที่มันทำ

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

ตัวดำเนินการตามเงื่อนไขนั้นสัมพันธ์กันทางด้านขวา (คือกลุ่มจากขวาไปซ้าย) ดังนั้น a? b: c? d: e? f: g หมายถึงสิ่งเดียวกันกับ a? b: (c? d: (e? f : g))

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

ตัวดำเนินการตามเงื่อนไขมีสามตัวถูกดำเนินการนิพจน์ ? ปรากฏระหว่างนิพจน์แรกและนิพจน์ที่สองและ: ปรากฏระหว่างนิพจน์ที่สองและที่สาม

นิพจน์แรกต้องเป็นประเภทบูลีนหรือบูลีนหรือเกิดข้อผิดพลาดในเวลาคอมไพล์



5

ไม่ถูกต้องแม่นยำ:

  1. ถ้า isHere เป็นจริงผลลัพธ์ของ getHereCount () จะถูกส่งคืน
  2. otheriwse ผลลัพธ์ของ getAwayCount () ถูกส่งคืน

นั่นคือ "การกลับมา" นั้นสำคัญมาก มันหมายถึงวิธีการที่จะต้องส่งกลับค่าและค่านั้นจะต้องได้รับมอบหมายที่ไหนสักแห่ง

นอกจากนี้ยังไม่เท่ากับ syntactically เทียบเท่ากับรุ่น if-else ตัวอย่างเช่น:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

หากรหัสด้วย if-else จะส่งผลให้ bytecode มากขึ้น


ฉันเชื่อว่า javac มีอิสระที่จะสร้างรหัสไบต์เดียวกัน แม้ว่าคุณจะถูกต้องว่ามีกรณีมุมปิดบังที่พวกเขาจะไม่เทียบเท่า
Tom Hawtin - tackline

ใช่แน่นอน สำหรับฉันข้อดีที่แท้จริงของผู้ปฏิบัติงานตามเงื่อนไขคือตัวอย่างที่ฉันได้รับ ทางเลือกคือ: // gasp !! String temp = str1; ถ้า (ตรวจสอบ) temp + = str2; อื่น temp + = str3; temp + = str4; กลับอุณหภูมิ หรือ handcoding การดำเนินการผนวก StringBuilder คนที่หนึ่งประสบปัญหาเรื่องประสิทธิภาพอย่างจริงจังในขณะที่ตัวที่สองนั้นละเอียดเกินไปและเป็นความพยายามอย่างมากโดยไม่ได้ประโยชน์อะไรมาก
RichN

4

Ternary เงื่อนไข; มะเขือเทศมะเขือเทศ สิ่งที่มีค่าจริงๆคือการเริ่มต้นตัวแปร หาก (เช่นฉัน) คุณชอบที่จะเริ่มต้นตัวแปรที่พวกเขาถูกกำหนดตัวดำเนินการประกอบไปด้วยเงื่อนไข (เพราะทั้งคู่) อนุญาตให้คุณทำเช่นนั้นในกรณีที่มีเงื่อนไขเกี่ยวกับค่าของมัน โดยเฉพาะอย่างยิ่งในฟิลด์สุดท้าย แต่มีประโยชน์ในที่อื่นด้วย

เช่น:

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

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


4
condition ? truth : false;

หากเงื่อนไขtrueนั้นประเมินผลการแสดงออกครั้งแรก ถ้าเงื่อนไขเป็นfalseเช่นนั้นประเมินค่านิพจน์ที่สอง

มันถูกเรียกว่าเงื่อนไขผู้ประกอบการและมันเป็นชนิดของTernary การดำเนินงาน


1
ตามJLS, 15.25 ผู้ประกอบการตามเงื่อนไข? :มันประเมินผลมากกว่า "return" และexpressionมากกว่า "parameter"
Gerold Broser

3

โครงสร้างนี้เรียกว่าTernary Operatorในวิทยาการคอมพิวเตอร์และเทคนิคการโปรแกรม
และWikipediaแนะนำคำอธิบายต่อไปนี้:

ในวิทยาการคอมพิวเตอร์ผู้ประกอบการที่สาม (บางครั้งเรียกว่าผู้ประกอบการระดับอุดมศึกษาที่ไม่ถูกต้อง) เป็นผู้ประกอบการที่ใช้เวลาสามข้อโต้แย้ง ข้อโต้แย้งและผลลัพธ์สามารถเป็นประเภทที่แตกต่างกัน ภาษาการเขียนโปรแกรมจำนวนมากที่ใช้รูปแบบ C-like มีตัวดำเนินการประกอบไปด้วย,?: ซึ่งกำหนดนิพจน์เงื่อนไข

ไม่เพียง แต่ใน Java เท่านั้นไวยากรณ์นี้ยังมีอยู่ใน PHP, Objective-C ด้วย

ในลิงค์ต่อไปนี้จะให้คำอธิบายต่อไปนี้ซึ่งเงียบดีที่จะเข้าใจมัน:

ผู้ประกอบการที่ประกอบไปด้วยคือการดำเนินงานบางอย่างดำเนินงานใน 3 อินพุต มันเป็นทางลัดสำหรับคำสั่ง if-else และเป็นที่รู้จักกันในชื่อโอเปอเรเตอร์ที่มีเงื่อนไข

ใน Perl / PHP มันทำงานเป็น:
boolean_condition ? true_value : false_value

ใน C / C ++ มันทำงานเป็น:
logical expression ? action for true : action for false

สิ่งนี้อาจอ่านได้สำหรับเงื่อนไขเชิงตรรกะบางอย่างที่ไม่ซับซ้อนเกินไปมิฉะนั้นจะดีกว่าถ้าใช้บล็อก If-Elseพร้อมการรวมกันของตรรกะตามเงื่อนไข

เราสามารถทำให้บล็อก If-Elseง่ายขึ้นด้วยโอเปอร์เรเตอร์ Ternary นี้สำหรับบรรทัดคำสั่งโค้ดหนึ่งบรรทัด
ตัวอย่างเช่น:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

อาจจะเท่ากับดังต่อไปนี้:

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

ดังนั้นหากเราอ้างถึงข้อความของคุณ:

int count = isHere ? getHereCount(index) : getAwayCount(index);

จริงๆแล้วมันเทียบเท่า 100% ของบล็อก If-Elseต่อไปนี้:

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

แค่นั้นแหละ!
หวังว่านี่จะเป็นประโยชน์กับใครบางคน!
ไชโย!


2

แก้ไข. มันเรียกว่าประกอบ ternary บางคนก็เรียกว่าผู้ประกอบการที่มีเงื่อนไข


9
เพื่ออ้างอิงอลิซในแดนมหัศจรรย์มันถูกเรียกว่าผู้ประกอบการที่ประกอบไปด้วย แต่ชื่อของมันคือผู้ประกอบการตามเงื่อนไข
Paul Tomblin

แต่ชื่อของมันเรียกว่าตัวดำเนินการโคลอนเครื่องหมายคำถาม
Michael Myers

1
การตั้งชื่อเสียงเป็นบิต C ++ ish เครื่องหมายคำถามตัวดำเนินการโคลอนหรือไม่: (หนึ่งโทเค็น) เรียกว่าตัวดำเนินการ Elvis
Tom Hawtin - tackline

2

มันประกอบไปด้วย Ternary (? :)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.

1

คุณอาจสนใจข้อเสนอสำหรับผู้ให้บริการใหม่บางรายที่คล้ายกับผู้ดำเนินการตามเงื่อนไข ตัวดำเนินการที่ปลอดภัยต่อ null จะเปิดใช้งานโค้ดดังนี้:

String s = mayBeNull?.toString() ?: "null";

มันจะสะดวกอย่างยิ่งเมื่อมีการเปิดกล่องอัตโนมัติ

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

มันได้รับเลือกให้พิจารณาเพิ่มเติมภายใต้ "Project Coin" ของ JDK 7


ตัวดำเนินการนั้นไม่ใช่หนึ่งในรายการโปรดของฉันจาก Project Coin มีประโยชน์ จำกัด ไม่ง่ายต่อการอ่านและเรียบง่ายน่าเกลียดเหมือนการออกไปข้างนอก บางทีมันอาจจะขึ้นกับฉัน
Michael Myers

จริง ๆ แล้วฉันไม่ได้เป็นแฟนตัวยง มันเป็นข้อเสนอของ Neal Gafter และเขามีแนวโน้มที่จะเห็นสิ่งต่างจากโปรแกรมเมอร์ Java โดยเฉลี่ยของคุณซึ่งมีแนวโน้มที่จะเห็นสิ่งที่แตกต่างจากมนุษย์ทั่วไปของคุณ สถานที่เดียวที่ฉันอาจต้องการความช่วยเหลือเล็กน้อยเกี่ยวกับ null อยู่ในลูป foreach การทดสอบว่า iterable นั้นเป็นโมฆะและ auto-unboxing
erickson

IIRC <โอนีลไม่ได้เสนอ เขาใช้มันเป็นเพียงตัวอย่างง่ายๆของการเขียนข้อเสนอ รายละเอียดเพิ่มเติมเกี่ยวกับการจัดเก็บรายชื่อส่งเมล์ของโครงการ
Tom Hawtin - tackline

ฉันเพิ่งอ่านคำนำของข้อเสนอและคุณพูดถูก มันคือ Stephen Colebourne of Joda และชื่อเสียง "ไม่มี Java 7"
erickson

1

จริงๆแล้วมันอาจใช้เวลามากกว่า 3 ข้อโต้แย้ง ตัวอย่างเช่นถ้าเราต้องการตรวจสอบว่าจำนวนเป็นบวกลบหรือศูนย์เราสามารถทำได้:

String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";

ซึ่งดีกว่าการใช้ if, else if, else


0

มันเป็นโอเปอเรเตอร์ที่มีเงื่อนไขและมันเป็นมากกว่าแค่วิธีรัดกุมในการเขียนหากมีคำสั่ง

เนื่องจากเป็นนิพจน์ที่ส่งคืนค่าจึงสามารถใช้เป็นส่วนหนึ่งของนิพจน์อื่นได้


0

ใช่คุณถูกต้อง. ?: โดยทั่วไปจะเรียกว่า "ตัวดำเนินการแบบมีเงื่อนไข" ซึ่งมักเรียกกันว่า "ตัวดำเนินการแบบไตรภาค" มันเป็นรุ่นชวเลขของมาตรฐานถ้า / อื่นมีเงื่อนไข

ผู้ประกอบการเงื่อนไขแบบที่สาม


0

ฉันชอบผู้ให้บริการรายนี้มาก แต่ควรคำนึงถึงผู้อ่านด้วย

คุณต้องปรับความสมดุลของโค้ดให้แน่นอยู่เสมอกับเวลาที่ใช้อ่านมัน

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

ประการที่สองในภาษาที่เหมือนกับ C คุณมีนิสัยชอบรู้ว่าเงื่อนไขเป็นสิ่งแรกในบรรทัด ฉันสังเกตเห็นสิ่งนี้เมื่อฉันใช้ Ruby และเจอหลายบรรทัดเช่น:

callMethodWhatever(Long + Expression + with + syntax) if conditional

ถ้าฉันเป็นผู้ใช้ Ruby มานานฉันอาจจะไม่ได้มีปัญหากับบรรทัดนี้ แต่มาจาก C เมื่อคุณเห็น "callMethodWhething" เป็นสิ่งแรกในบรรทัดคุณคาดหวังว่ามันจะถูกเรียกใช้งาน The: เป็นความลับน้อยกว่า แต่ก็ยังผิดปกติพอที่จะทิ้งผู้อ่าน

ข้อดีคือความรู้สึกเย็นสบายในท้องของคุณเมื่อคุณสามารถเขียน 3 บรรทัดได้ถ้ามีการเว้นวรรค 1 บรรทัด ไม่สามารถปฏิเสธได้ :) แต่โดยความจริงแล้ว 90% ของผู้คนไม่สามารถอ่านได้ง่ายขึ้นเพราะความหายาก

เมื่อมันได้รับมอบหมายอย่างแท้จริงตามบูลีนและค่าฉันไม่ได้มีปัญหากับมัน แต่มันสามารถถูกทำร้ายได้อย่างง่ายดาย


0

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

ไวยากรณ์คือ: boolean-expression? expression1: expression2;

ผลลัพธ์ของนิพจน์เงื่อนไขนี้คือ

expression1 ถ้า boolean-expression เป็นจริง

มิฉะนั้นผลลัพธ์คือ expression2

สมมติว่าคุณต้องการกำหนดตัวแปร num1 และ num2 ให้มากขึ้น คุณสามารถเขียนคำสั่งโดยใช้นิพจน์เงื่อนไข: max = (num1> num2)? num1: num2;

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

อ้างอิงจาก: แนะนำ Java Programming รุ่นที่ 10 โดย Y. Daniel Liang หน้า 126 - 127

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