ประโยชน์คือฟังก์ชั่นที่บริสุทธิ์ทำให้โค้ดของคุณง่ายขึ้นด้วยเหตุผล หรืออีกนัยหนึ่งคือผลข้างเคียงเพิ่มความซับซ้อนของรหัสของคุณ
ยกตัวอย่างcomputeProductPrice
วิธีการ
วิธีบริสุทธิ์จะถามคุณเกี่ยวกับปริมาณสินค้าสกุลเงิน ฯลฯ คุณรู้ว่าเมื่อใดก็ตามที่วิธีการนั้นถูกเรียกด้วยอาร์กิวเมนต์เดียวกันมันจะ มักจะผลิตผลเดียวกัน
- คุณยังสามารถแคชและใช้เวอร์ชันแคชได้
- คุณสามารถทำให้มันขี้เกียจและเลื่อนการเรียกไปเมื่อคุณต้องการจริง ๆ รู้ว่าค่าจะไม่เปลี่ยนแปลงในขณะเดียวกัน
- คุณสามารถเรียกวิธีการนี้ได้หลายครั้งเพราะรู้ว่าไม่มีผลข้างเคียง
- คุณสามารถให้เหตุผลเกี่ยวกับวิธีการในการแยกจากโลกรู้ว่าทุกสิ่งที่ต้องการเป็นข้อโต้แย้ง
วิธีการที่ไม่บริสุทธิ์จะซับซ้อนกว่าการใช้และการดีบัก เนื่องจากมันขึ้นอยู่กับสถานะของตัวแปรอื่นนอกเหนือจากข้อโต้แย้งและอาจเปลี่ยนแปลงพวกมันก็หมายความว่ามันสามารถสร้างผลลัพธ์ที่แตกต่างกันเมื่อถูกเรียกหลายครั้งหรือไม่มีพฤติกรรมเดียวกันเมื่อไม่ถูกเรียกหรือช้าเกินไปหรือช้าเกินไป
ตัวอย่าง
ลองนึกภาพว่ามีวิธีการในกรอบที่แยกวิเคราะห์ตัวเลข:
decimal math.parse(string t)
มันไม่มีความโปร่งใสในการอ้างอิงเพราะมันขึ้นอยู่กับ:
ตัวแปรสภาพแวดล้อมที่ระบุระบบการกำหนดหมายเลขนั่นคือฐาน 10 หรืออย่างอื่น
ตัวแปรภายในmath
ไลบรารีที่ระบุความแม่นยำของตัวเลขในการแยกวิเคราะห์ ดังนั้นมูลค่าของ1
แยกสตริงจะให้"12.3456"
12.3
วัฒนธรรมซึ่งกำหนดรูปแบบที่คาดหวัง ตัวอย่างเช่นกับการfr-FR
แยก"12.345"
จะให้12345
เพราะตัวแยกควรจะ,
ไม่.
ลองจินตนาการว่ามันจะง่ายหรือยากแค่ไหนในการทำงานกับวิธีการดังกล่าว ด้วยอินพุตเดียวกันคุณสามารถมีผลลัพธ์ที่แตกต่างอย่างสิ้นเชิงขึ้นอยู่กับช่วงเวลาที่คุณเรียกใช้เมธอดเนื่องจากบางสิ่งบางอย่างเปลี่ยนตัวแปรสภาพแวดล้อมหรือเปลี่ยนวัฒนธรรมหรือตั้งค่าความแม่นยำที่แตกต่างกัน ตัวละครที่ไม่ได้กำหนดไว้ล่วงหน้าของวิธีการนี้จะนำไปสู่ข้อบกพร่องมากขึ้นและฝันร้ายการดีบัก โทรmath.parse("12345")
และรับ5349
เป็นคำตอบเนื่องจากโค้ดคู่ขนานบางตัวแยกวิเคราะห์ตัวเลขฐานแปดไม่ดี
วิธีการแก้ไขวิธีนี้เสียอย่างเห็นได้ชัด? โดยแนะนำการอ้างอิงที่โปร่งใส กล่าวอีกนัยหนึ่งโดยกำจัดรัฐโลกและย้ายทุกอย่างไปยังพารามิเตอร์ของวิธีการ:
decimal math.parse(string t, base=10, precision=20, culture=cultures.en_us)
เมื่อวิธีนี้บริสุทธิ์คุณรู้ว่าไม่ว่าเมื่อคุณเรียกใช้เมธอดมันจะสร้างผลลัพธ์ที่เหมือนกันสำหรับอาร์กิวเมนต์เดียวกันเสมอ