มีปัญหาหลายประการเกี่ยวกับโค้ดส่วนนี้ซึ่งสามารถตัดให้สั้นลงได้ดังนี้:
public List<Money> getMoneyByPersons() {
return persons.size() == 1 ?
moneyService.getMoneyIfHasOnePerson() :
moneyService.getMoney();
}
มันไม่ชัดเจนว่าทำไมคนคนหนึ่งเป็นคดีพิเศษ ฉันคิดว่ามีกฎเกณฑ์ทางธุรกิจเฉพาะที่บอกว่าการรับเงินจากคนคนหนึ่งแตกต่างอย่างสิ้นเชิงจากการรับเงินจากคนหลายคน อย่างไรก็ตามฉันต้องไปดูทั้งสองข้างgetMoneyIfHasOnePerson
และgetMoney
หวังว่าจะเข้าใจว่าทำไมถึงมีกรณีที่แตกต่างกัน
ชื่อgetMoneyIfHasOnePerson
ไม่ถูกต้อง จากชื่อฉันคาดหวังว่าวิธีการตรวจสอบว่ามีคนเดียวและถ้าเป็นกรณีนี้รับเงินจากเขา; มิฉะนั้นไม่ทำอะไรเลย จากรหัสของคุณนี่ไม่ใช่สิ่งที่เกิดขึ้น (หรือคุณกำลังทำเงื่อนไขสองครั้ง)
มีเหตุผลใดที่จะส่งคืนList<Money>
คอลเลกชันมากกว่าหรือไม่?
กลับไปที่คำถามของคุณเนื่องจากยังไม่ชัดเจนว่าทำไมมีการรักษาพิเศษสำหรับหนึ่งคนหลักหนึ่งควรถูกแทนที่ด้วยค่าคงที่เว้นแต่มีวิธีอื่นที่จะทำให้กฎชัดเจน ที่นี่หนึ่งไม่แตกต่างจากหมายเลขมายากลอื่น ๆ คุณอาจมีกฎเกณฑ์ทางธุรกิจที่บอกว่าการดูแลเป็นพิเศษนั้นใช้กับคนหนึ่งสองหรือสามคนหรือมากกว่าสิบสองคนเท่านั้น
ฉันจะแยกแยะบริบทเพื่อเลือกทางออกที่ดีที่สุดได้อย่างไร
คุณทำสิ่งที่ทำให้รหัสของคุณชัดเจนยิ่งขึ้น
ตัวอย่างที่ 1
ลองนึกภาพโค้ดต่อไปนี้:
if (sequence.size() == 0) {
return null;
}
return this.processSequence(sequence);
ศูนย์นี่เป็นค่าวิเศษหรือไม่? รหัสค่อนข้างชัดเจน: หากไม่มีองค์ประกอบในลำดับลองประมวลผลและส่งคืนค่าพิเศษ แต่รหัสนี้สามารถเขียนใหม่เช่นนี้:
if (sequence.isEmpty()) {
return null;
}
return this.processSequence(sequence);
ที่นี่ไม่มีค่าคงที่อีกต่อไปและรหัสก็ชัดเจนยิ่งขึ้น
ตัวอย่างที่ 2
ใช้รหัสอื่น:
const result = Math.round(input * 1000) / 1000;
ไม่ต้องใช้เวลามากเกินไปในการทำความเข้าใจกับสิ่งที่ทำในภาษาเช่น JavaScript ซึ่งไม่มีround(value, precision)
โอเวอร์โหลด
ทีนี้ถ้าคุณต้องการแนะนำค่าคงที่มันจะถูกเรียกว่าอย่างไร? Precision
คำที่ใกล้เคียงที่สุดคุณจะได้รับคือ ดังนั้น:
const precision = 1000;
const result = Math.round(input * precision) / precision;
มันปรับปรุงการอ่านหรือไม่? มันอาจจะเป็น. ที่นี่ค่าของค่าคงที่ค่อนข้าง จำกัด และคุณอาจถามตัวเองว่าคุณจำเป็นต้องทำการกู้คืนจริงหรือไม่ สิ่งที่ดีที่นี่คือตอนนี้ความแม่นยำถูกประกาศเพียงครั้งเดียวดังนั้นหากมีการเปลี่ยนแปลงคุณจะไม่เสี่ยงที่จะทำผิดเช่น:
const result = Math.round(input * 100) / 1000;
เปลี่ยนค่าในสถานที่หนึ่งและลืมที่จะทำในที่อื่น
ตัวอย่างที่ 3
จากตัวอย่างเหล่านั้นคุณอาจมีความรู้สึกว่าตัวเลขควรถูกแทนที่ด้วยค่าคงที่ในทุกกรณี นี่ไม่เป็นความจริง. ในบางสถานการณ์การมีค่าคงที่ไม่ได้นำไปสู่การปรับปรุงโค้ด
รับรหัสต่อไปนี้:
class Point
{
...
public void Reset()
{
x, y = (0, 0);
}
}
หากคุณพยายามแทนที่ศูนย์ด้วยตัวแปรความยากในการค้นหาชื่อที่มีความหมาย คุณจะตั้งชื่อมันได้อย่างไร ZeroPosition
? Base
? Default
? การแนะนำค่าคงที่ที่นี่จะไม่เพิ่มโค้ดในทางใดทางหนึ่ง มันจะทำให้มันยาวขึ้นเล็กน้อยและเพียงแค่นั้น
กรณีดังกล่าวเป็นของหายาก ดังนั้นเมื่อใดก็ตามที่คุณพบตัวเลขในรหัสให้พยายามใช้วิธีหารหัสที่สามารถนำมาใช้ใหม่ได้ ถามตัวเองว่าธุรกิจมีความหมายกับตัวเลขหรือไม่ ถ้าใช่จะมีค่าคงที่ ถ้าไม่คุณจะตั้งชื่ออย่างไร หากคุณพบชื่อที่มีความหมาย หากไม่เป็นเช่นนั้นคุณจะพบกรณีที่ค่าคงที่ไม่จำเป็น
persons
มาจากไหนและมันอธิบายอะไร? รหัสของคุณไม่มีความคิดเห็นใด ๆ ดังนั้นจึงเป็นการยากที่จะคาดเดาว่ามันทำอะไรอยู่