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