‫ฟังก์ชั่นบริสุทธิ์คืออะไร?
‫ฟังก์ชั่นล้วนๆ หน้าตาแบบนี้
‫เรามีฟังก์ชั่น
‫ดังนั้น แทนที่จะเป็นกล่องที่เรามีมาก่อนของออบเจกต์ของฟังก์ชันเหล่านี้ทั้งหมด ให้คิดว่านี่เป็นเพียงฟังก์ชันง่ายๆ
‫และสมมุติว่าเราให้รายการที่มีหนึ่ง สอง และสาม
‫ถ้าเราให้อินพุตนี้ในฟังก์ชันนี้ สิ่งที่เราคาดหวังจากฟังก์ชันบริสุทธิ์คือบางสิ่งที่จะเกิดขึ้นกับอินพุตนี้
‫ซึ่งทุกครั้งที่ส่งผลให้เกิดสิ่งเดียวกัน
‫สมมุติว่าเราคูณมันด้วยสอง, เราจะได้ 2, 4 และ 6.
‫ตอนนี้ฟังก์ชันบริสุทธิ์มีกฎสองข้อ
‫หนึ่งคือได้รับอินพุตเดียวกันก็จะส่งคืนเอาต์พุตเดียวกันเสมอ
‫นั่นคือทุกครั้งที่เราให้หนึ่ง สอง และสามในรายการนี้ เราจะให้มันกับฟังก์ชันที่เราสร้างขึ้น
‫ควรส่งคืนผลลัพธ์เดียวกันเสมอ
‫ดังนั้นหากฉันเรียกใช้ฟังก์ชันนี้หลายล้านครั้งด้วยอินพุตเดียวกัน มันควรจะได้ผลลัพธ์ที่เหมือนกัน
‫และประเด็นที่สองคือแนวคิดของฟังก์ชันนี้ไม่ควรก่อให้เกิดผลข้างเคียงใดๆ
‫ผลข้างเคียงคืออะไร?
‫ผลข้างเคียงคือสิ่งที่ฟังก์ชันทำซึ่งส่งผลต่อโลกภายนอก
‫เช่น ถ้าจะพิมพ์บางอย่างภายในฟังก์ชันนี้จะส่งผลต่อโลกภายนอกใช่ไหม?
‫เพราะฉันกำลังพิมพ์อะไรบางอย่างบนหน้าจอ
‫หน้าจอคือโลกภายนอก
‫หรือตัวอย่างเช่น หากฟังก์ชันนี้สัมผัสกับตัวแปรที่อยู่นอกขอบเขตอื่น นั่นเป็นผลข้างเคียง
‫มาดูโค้ดเพื่อทำความเข้าใจแนวคิดนี้กันสักหน่อย
‫สมมุติว่าเรามีฟังก์ชันแล้วฟังก์ชันนี้จะคูณ
‫โดยไปที่รายการ
‫สมมติว่าเป็นพันธมิตรซึ่งจะเป็นรายชื่อของเรา
‫และในที่นี้ สิ่งที่เราอยากทำคือวนซ้ำรายการ
‫ในรายการ.
‫แล้วแต่ละรายการเราต้องการคูณและผนวกเข้ากับรายการใหม่
‫มาสร้างรายการใหม่ที่จะเป็นรายการว่างกัน
‫และในที่นี้เราจะพูดถึงรายการใหม่ dot append
‫และทำรายการคูณด้วยสอง
‫และสุดท้าย ในตอนท้ายของฟังก์ชันนี้ เราต้องการส่งคืนรายการใหม่
‫ปล่อยให้สิ่งนี้ไป
‫ถ้าฉันบอกว่าคูณด้วยสองแล้วให้หนึ่ง สอง สาม แล้วลองพิมพ์ออกมา
‫นี่เอาท์พุต
‫ถ้าฉันคลิกเรียกใช้
‫ฉันได้สองต่อหก?
‫นี่เป็นหน้าที่บริสุทธิ์หรือไม่?
‫ลองคิดเกี่ยวกับเรื่องนี้
‫กฎข้อแรกที่ได้รับข้อมูลเดียวกัน นั่นคือ หนึ่ง สอง และสาม
‫มันจะส่งคืนผลลัพธ์เดียวกันเสมอ
‫ไม่ว่าฉันจะเรียกใช้สิ่งนี้กี่ครั้ง มันจะให้ผลลัพธ์ที่เท่าเดิมเสมอ
‫ดังนั้นเราจึงผ่านการทดสอบครั้งแรก
‫แล้วการทดสอบครั้งที่สองล่ะ?
‫ว่าไม่มีผลข้างเคียง
‫สิ่งนี้ก่อให้เกิดผลข้างเคียงหรือไม่?
‫สิ่งนี้สัมผัสอะไรในโลกภายนอกหรือไม่?
‫คิดเกี่ยวกับมัน
‫ไม่มันไม่ได้
‫ถูกต้อง.
‫ไม่มีสิ่งใดในโลกภายนอกที่มีความสำคัญต่อการทำงานนี้
‫เพราะทุกสิ่งมีอยู่ในนี้
‫ตัวอย่างเช่น ถ้าแทนที่จะพิมพ์ที่นี่ เราก็แค่พิมพ์
‫และที่นี่.
‫ถ้าฉันคลิกเรียกใช้
‫เราได้รับผลลัพธ์เดียวกัน
‫แต่สิ่งนี้มีผลข้างเคียงหรือไม่?
‫ใช่มันไม่
‫มันโต้ตอบกับโลกภายนอกซึ่งเป็นคำสั่งพิมพ์
‫ข้อความสั่งพิมพ์บอกฉันว่า เฮ้ ฉันจะพิมพ์บนจออะไรก็ตามที่เครื่องนี้มี
‫ในกรณีของเรา มันจะพิมพ์ที่นี่ แต่เราไม่รู้จริงๆ ว่าคำสั่งพิมพ์ทำอะไร
‫เพราะมันโต้ตอบกับหน้าจอด้านนี้
‫อย่างนี้.
‫มีผลข้างเคียง.
‫เราให้การควบคุมการพิมพ์ แต่เราไม่รู้ว่างานพิมพ์จะทำอะไร
‫อีกตัวอย่างหนึ่งที่ฉันสามารถให้คุณได้
‫จะเกิดอะไรขึ้นถ้าเรามีรายการใหม่ที่นี่ซึ่งเรากำหนดไว้ภายนอกจริง ๆ
‫เช่นนั้น
‫เพื่อให้เรามีรายการใหม่เช่นนี้
‫ถ้าฉันคลิกเรียกใช้
‫ฉันยังคงได้รับสองต่อหก
‫แต่สิ่งนี้มีผลข้างเคียงหรือไม่?
‫ใช่มันไม่
‫มันโต้ตอบกับโลกภายนอก
‫และสิ่งที่อยู่นอกโลกนี้ของฟังก์ชันที่ จำไว้ว่า ขอบเขตคือ
‫มันโต้ตอบกับรายการใหม่นี้
‫จะเปิดรายการใหม่นี้
‫ดังนั้นถ้าโปรแกรมเมอร์เข้ามาและบางทีก่อนที่เราจะเรียกใช้ฟังก์ชันนี้ เราตัดสินใจที่จะพูดถึงรายการใหม่
‫เราเปลี่ยนเป็นสตริงว่าง
‫เมื่อฉันเรียกใช้ฟังก์ชันนี้
‫ฉันได้รับข้อผิดพลาดเพราะตอนนี้รายการใหม่นี้เป็นวัตถุสตริง
‫ดังนั้นรายการใหม่ที่อาศัยอยู่ในโลกภายนอกของฟังก์ชันนี้สามารถแก้ไขได้โดยนักพัฒนารายอื่นหรือโดยโปรแกรมและเราน่าจะรู้เรื่องนี้
‫และเมื่อเราเรียกใช้ฟังก์ชันนี้ มันจะทำให้เราเกิดข้อผิดพลาด
‫มันมีผลข้างเคียง
‫เป็นการดีที่เรามีฟังก์ชั่นของเรา
‫และทำให้บริสุทธิ์ เพราะอย่างที่คุณเห็น เราจะไม่มีวันพบจุดบกพร่องหรือข้อผิดพลาดในโค้ดของเรา เว้นแต่ว่าเราเขียนอะไรผิดที่นี่
‫แต่เนื่องจากเราไม่สนใจโลกภายนอก เพราะทุกอย่างที่เราป้อนเข้าไปมักจะให้ผลลัพธ์ที่ดีเสมอ
‫มันก็จะบริสุทธิ์
‫ตอนนี้ เป็นเรื่องยากที่จะเข้าใจจริงๆ ว่าทำไมแนวคิดนี้จึงเป็นแนวคิดที่ทรงพลังโดยไม่ต้องมีประสบการณ์ในที่ทำงานเลยสักนิด
‫แต่ขอผมบอกคุณอย่างนี้นะ ว่าเมื่อคุณมีหน้าที่บริสุทธิ์
‫คุณมีโค้ดบั๊กน้อย คุณสามารถทดสอบโค้ดของคุณได้ดีขึ้น
‫เข้าใจรหัสและโดยรวมของคุณได้ง่ายขึ้น
‫คุณมีประโยชน์เหล่านี้จากการไม่ให้ส่วนต่างๆ ของโค้ดแตะกันและกระทบกัน ซึ่งทำให้ชีวิตในฐานะโปรแกรมเมอร์ของคุณง่ายขึ้นมาก
‫ดังนั้นแนวคิดเรื่องฟังก์ชันบริสุทธิ์จึงสำคัญมาก
‫แต่สิ่งหนึ่งที่ฉันต้องการให้คุณหลีกเลี่ยงจากสิ่งนี้คือ หน้าที่ที่บริสุทธิ์นั้นเป็นแนวทางมากกว่าแบบสัมบูรณ์
‫เป็นไปไม่ได้ที่จะมีฟังก์ชันบริสุทธิ์อยู่ทุกหนทุกแห่ง เพราะถ้าฟังก์ชันใดไม่มีผลกระทบกับโลกภายนอกเลย
‫เราก็จะไม่มีโปรแกรมใดๆ
‫เราไม่สามารถแสดงสิ่งต่างๆ
‫เราไม่สามารถบันทึกสิ่งต่าง ๆ เช่นโปรไฟล์เกมของเราได้
‫ดังนั้นจึงเป็นไปไม่ได้ที่จะมีฟังก์ชันบริสุทธิ์ในทุกที่
‫อย่างไรก็ตาม เมื่อคุณทำได้ ทุกที่ที่คุณทำได้ การเขียนโปรแกรมเชิงฟังก์ชันจะสอนเราว่าฟังก์ชันของคุณดี
‫พยายามสร้างฟังก์ชันที่บริสุทธิ์และมีฟังก์ชันที่ไม่บริสุทธิ์เพียงไม่กี่ฟังก์ชันที่อาจโต้ตอบกับโลกภายนอกที่เราสามารถกลับไปใช้ได้ทุกครั้งที่มีข้อบกพร่องในโค้ดของเรา
‫เพราะส่วนใหญ่แล้วสิ่งเหล่านี้คือตัวที่จะมีจุดบกพร่องแล้วจึงทำหน้าที่บริสุทธิ์เช่นนี้
‫เพื่อสรุปแนวคิดของการเขียนโปรแกรมเชิงฟังก์ชันของเรา
‫ตัวอย่างเช่น หากนี่คือวิซาร์ดของเราจากวิดีโอก่อนหน้านี้ที่มีการเขียนโปรแกรมเชิงฟังก์ชัน
‫เราก็จะมีออบเจกต์วิซาร์ด
‫หรือพจนานุกรมตัวช่วยสร้างที่มีชื่อ
‫เอาเป็นว่าเมอร์ลิน
‫และอำนาจ
‫จาก 50
‫และแทนที่จะบรรจุสิ่งเหล่านี้ในชั้นเรียน ฉันจะมีวิธีการที่แตกต่างกัน เช่น การโจมตี
‫และนี่จะไม่ใช่วิธีการ
‫มันจะเป็นฟังก์ชั่นเพราะมันไม่ได้อยู่ในชั้นเรียน
‫ในการเขียนโปรแกรมการทำงาน
‫พวกเขาบอกว่า เฮ้ เราไม่จำเป็นต้องรวมข้อมูลกับฟังก์ชัน แยกมันออกจากกัน
‫มาสร้างฟังก์ชันบริสุทธิ์ที่สามารถส่งผ่านกันได้
‫อะไรก็ได้ที่เป็นตัวละคร
‫และด้วยวิธีนี้ เราแยกสองสิ่งนี้ออกจากกัน เพื่อให้เราสามารถมุ่งเน้นไปที่ฟังก์ชันบริสุทธิ์ และเราสามารถมุ่งเน้นไปที่ข้อมูลได้
‫นั่นคือสิ่งที่แตกต่าง
‫ท้ายที่สุดแล้ว ทั้งหมดคือการพยายามรักษาโค้ดของเราให้สะอาดและหลีกเลี่ยงข้อบกพร่องในโค้ดของเรา
‫ปัญหาใหญ่ที่โปรแกรมเมอร์มีอยู่ตลอดเวลา
‫มันจึงเป็นแค่วิธีคิดที่ต่างออกไป
‫มาเรียนรู้เพิ่มเติมในวิดีโอหน้ากัน