ข้อผิดพลาดหลักของคุณคือคุณยังคงคิดในแง่กระบวนการมากขึ้น นี่ไม่ได้หมายถึงการวิจารณ์ว่าคุณเป็นคน แต่เป็นเพียงการสังเกต การคิดในแง่ของการใช้งานที่มากขึ้นนั้นมาพร้อมกับเวลาและการฝึกฝนดังนั้นวิธีการคือการนำเสนอและทำให้ดูเหมือนสิ่งที่ถูกต้องชัดเจนที่สุดที่จะเรียกหาคุณ ความผิดพลาดเล็กน้อยที่สองของคุณคือการสร้างทางเลือกของคุณในวิธีการของคุณ ตัวเลือกนี้มีไว้เพื่อช่วยเอกสารว่ามีบางอย่างที่อาจหรืออาจไม่ส่งคืนค่า คุณอาจไม่ได้อะไรเลย
สิ่งนี้ทำให้คุณเขียนโค้ดที่ชัดเจนอย่างสมบูรณ์ซึ่งดูเหมือนสมเหตุสมผล แต่คุณถูกล่อลวงโดยผู้ล่อลวงแฝดที่ชั่วร้ายที่ได้รับและเป็นตัวแทน
แน่นอนคำถามอย่างรวดเร็วกลายเป็น "ทำไมเป็นปัจจุบันและไปถึงที่นั่น?"
สิ่งที่หลาย ๆ คนที่นี่พลาดคือ isPresent () คือมันไม่ใช่สิ่งที่สร้างขึ้นสำหรับรหัสใหม่ที่เขียนโดยคนบนกระดานอย่างเต็มรูปแบบว่าลูกแกะมีประโยชน์ที่น่ารังเกียจและใครชอบสิ่งที่ใช้งานได้
แต่ให้ประโยชน์สองสามอย่าง (สอง) ดียอดเยี่ยมและมีเสน่ห์ (?):
- มันง่ายต่อการเปลี่ยนรหัสดั้งเดิมเพื่อใช้คุณสมบัติใหม่
- มันลดความโค้งการเรียนรู้ของตัวเลือก
คนแรกค่อนข้างง่าย
ลองนึกภาพคุณมี API ที่มีลักษณะดังนี้:
public interface SnickersCounter {
/**
* Provides a proper count of how many snickers have been consumed in total.
*/
public SnickersCount howManySnickersHaveBeenEaten();
/**
* returns the last snickers eaten.<br>
* If no snickers have been eaten null is returned for contrived reasons.
*/
public Snickers lastConsumedSnickers();
}
และคุณมีชั้นเรียนดั้งเดิมที่ใช้สิ่งนี้ (กรอกข้อมูลในช่องว่าง):
Snickers lastSnickers = snickersCounter.lastConsumedSnickers();
if(null == lastSnickers) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers);
}
ตัวอย่างที่วางแผนไว้เพื่อให้แน่ใจ แต่ทนกับฉันที่นี่
Java 8 ได้เปิดตัวแล้วและเรากำลังดิ้นรนเพื่อขึ้นเรือ ดังนั้นสิ่งหนึ่งที่เราทำคือเราต้องการแทนที่อินเทอร์เฟซเก่าของเราด้วยสิ่งที่ส่งกลับทางเลือก ทำไม? เพราะอย่างที่คนอื่นได้กล่าวถึงอย่างมีน้ำใจ:
นี่เป็นการคาดเดาจากสิ่งที่เป็นโมฆะหรือไม่สิ่ง
นี้ได้ถูกชี้ไปแล้วโดยคนอื่น แต่ตอนนี้เรามีปัญหา ลองนึกภาพเรามี (แก้ตัวให้ฉันในขณะที่ฉันกด alt + F7 ด้วยวิธีการที่ไร้เดียงสา), 46 แห่งที่วิธีนี้เรียกว่าในรหัสทดสอบที่ผ่านการทดสอบมาอย่างดีซึ่งทำงานได้ดีมาก ตอนนี้คุณต้องอัปเดตสิ่งเหล่านี้ทั้งหมด
นี่คือที่เป็นปัจจุบันส่องสว่าง
เพราะตอนนี้: Snickers lastSnickers = snickersCounter.lastConsumedSnickers (); if (null == lastSnickers) {โยน NoSuchSnickersException ใหม่ (); } else {consumer.giveDiabetes (lastSnickers); }
กลายเป็น:
Optional<Snickers> lastSnickers = snickersCounter.lastConsumedSnickers();
if(!lastSnickers.isPresent()) {
throw new NoSuchSnickersException();
}
else {
consumer.giveDiabetes(lastSnickers.get());
}
และนี่คือการเปลี่ยนแปลงอย่างง่ายที่คุณสามารถมอบให้กับจูเนียร์ใหม่: เขาสามารถทำสิ่งที่มีประโยชน์และเขาจะได้สำรวจโค้ดเบสในเวลาเดียวกัน ชนะ ท้ายที่สุดแล้วสิ่งที่คล้ายกับรูปแบบนี้ค่อนข้างแพร่หลาย และตอนนี้คุณไม่จำเป็นต้องเขียนรหัสใหม่เพื่อใช้ lambdas หรืออะไรก็ตาม (ในกรณีนี้มันจะไม่สำคัญ แต่ฉันคิดตัวอย่างที่มันยากสำหรับการออกกำลังกายกับผู้อ่าน)
โปรดสังเกตว่านี่หมายความว่าวิธีที่คุณทำคือวิธีจัดการกับรหัสดั้งเดิมโดยไม่ต้องทำการเขียนใหม่ที่มีราคาแพง แล้วรหัสใหม่ล่ะ?
ในกรณีของคุณที่คุณต้องการพิมพ์บางสิ่งออกไปคุณก็ทำได้:
. snickersCounter.lastConsumedSnickers () ifPresent (System.out :: println);
ซึ่งค่อนข้างง่ายและชัดเจนอย่างสมบูรณ์แบบ จุดที่ค่อย ๆ เดือดขึ้นไปบนผิวน้ำนั้นคือมีกรณีการใช้งานสำหรับ get () และ isPresent () พวกเขาอยู่ที่นั่นเพื่อให้คุณสามารถแก้ไขโค้ดที่มีอยู่โดยอัตโนมัติเพื่อใช้ประเภทที่ใหม่กว่าโดยไม่ต้องคิดมากเกี่ยวกับมัน สิ่งที่คุณกำลังทำอยู่นั้นมีการเข้าใจผิดด้วยวิธีต่อไปนี้:
- คุณกำลังเรียกวิธีที่อาจส่งคืนค่าว่าง ความคิดที่ถูกต้องอาจเป็นไปได้ว่าวิธีการคืนค่าเป็นโมฆะ
- คุณกำลังใช้วิธีดั้งเดิมในการจัดการกับตัวเลือกนี้แทนที่จะใช้วิธีการใหม่ที่อร่อยที่มีแลมบ์ดาแฟนซี
หากคุณต้องการใช้ทางเลือกเป็นการตรวจสอบความปลอดภัยแบบโมฆะแบบง่าย ๆ สิ่งที่คุณควรทำคือ:
new Optional.ofNullable(employeeServive.getEmployee())
.map(Employee::getId)
.ifPresent(System.out::println);
แน่นอนว่าเวอร์ชั่นที่ดูดีในลักษณะนี้:
employeeService.getEmployee()
.map(Employee::getId)
.ifPresent(System.out::println);
โดยที่ไม่จำเป็นต้องใช้วิธีใด แต่ฉันแนะนำให้ใช้บรรทัดใหม่ต่อการดำเนินการเพื่อให้อ่านง่ายขึ้น ง่ายต่อการอ่านและทำความเข้าใจกับการเต้นที่รัดกุมทุกวันของสัปดาห์
แน่นอนว่านี่เป็นตัวอย่างง่ายๆที่ง่ายต่อการเข้าใจทุกสิ่งที่เราพยายามทำ มันไม่ง่ายอย่างนี้ในชีวิตจริง แต่ให้สังเกตว่าในตัวอย่างนี้สิ่งที่เราแสดงคือความตั้งใจของเรา เราต้องการให้พนักงานรับรหัสของเขาและถ้าเป็นไปได้ให้พิมพ์ออกมา นี่คือชัยชนะครั้งใหญ่ครั้งที่สองที่มีตัวเลือก ช่วยให้เราสามารถสร้างรหัสที่ชัดเจนขึ้น ฉันคิดว่าการทำสิ่งต่าง ๆ เช่นการทำวิธีการที่ทำสิ่งต่าง ๆ เพื่อให้คุณสามารถป้อนเข้าสู่แผนที่โดยทั่วไปเป็นความคิดที่ดี