การพูดคุยกับผู้ใหญ่ — FP นั้นสนุกและใช้งานได้จริง 2.

สำหรับตอนที่ 1 ของซีรีส์ คลิกที่นี่

ความจำเป็นกับการประกาศ

มีคำพูดที่ว่า Venkat Subramaniam ใช้ประโยชน์อย่างมากในการเปรียบเทียบรูปแบบการเขียนโปรแกรมแบบจำเป็นกับแบบประกาศ และฉันชอบมันมากเพราะมันสื่ออารมณ์ได้ดีมาก:

สไตล์ที่จำเป็นคือที่ที่คุณบอกว่าต้องทำอะไร และทำอย่างไรจึงจะทำเช่นนั้นได้จริง
ในขณะที่สไตล์ที่เปิดเผยคือที่ที่คุณบอกว่าต้องทำอะไร และไม่ใช่ทำอย่างไร

บางครั้งเขาก็พูดไปไกลกว่านั้นว่า “สไตล์ที่จำเป็นก็เหมือนกับการพูดคุยกับเด็กๆ คุณต้องพูดทุกอย่าง — และทำซ้ำในวันถัดไป”

มาดูตัวอย่างจากชีวิตจริงกันดีกว่า!

จะขอนมได้อย่างไร?

ความจำเป็น

คุณระบุทุกขั้นตอน:

1. Open the fridge
2. Take the box out of the fridge
3. If it is not milk (can be orange juice as well) put it back and take another one.
4. Repeat it, until you get the milk or there are no more boxes
5. Pour it in a glass
...
n. Give it to me

ประกาศ

คุณประกาศข้อมูล/ฟังก์ชันและประกาศเป้าหมายของคุณ สิ่งที่คุณต้องทำคือรวม (เขียน) พวกมันเข้าด้วยกัน:

- The milk is in the fridge.
- Milk is a thing which is in a box with the text "Milk" on it.     Hopefully :)
- I want (a Glass of*) milk
Here you are.

* ถ้าเราอยู่ในสภาพแวดล้อม ประเภทปลอดภัย เราสามารถพูดได้ว่าเราต้องการนม แก้ว เนื่องจากเป็นที่ทราบกันว่า แก้ว เป็นรูปแบบ (*ไอ… ชนิด) ที่ทำให้นมสามารถถ่ายโอนและบรรจุสำหรับมือของเราและบริโภคได้ง่ายสำหรับเรา

โอเค แต่ฉันไม่ใช่เด็ก ฉันไม่ได้มาที่นี่เพื่อดื่มนม! มีรหัสไหม?

โอเค ฉันขอแสดงสถานการณ์ข้างต้นให้คุณดูโดยใช้ p̶s̶é̷́́́ó́p̷̷a̷̷v̷a̷s̷̷r̷p̷t… โค้ดเทียมบางตัวที่มีลักษณะคล้ายกับ Javascript
ฉันชอบหลักการ "KISS" ดังนั้นฉันจึงทำให้มันเรียบง่ายและงี่เง่าจริงๆ เพียงเพื่อ มุ่งเน้นไปที่วิธีที่คุณใช้แนวทางต่างๆ เหล่านี้ ฉันลดความต้องการด้านคุณภาพลงแล้วทิ้งตู้เย็น ตอนนี้มีเครื่องดื่มอยู่แค่กล่องเดียว และฉันไม่ต้องการแก้ว แต่ฉันอยากได้ทั้งหมดที่มี (น่าจะ) มีนม!

const boxes= [
    {text: "orange", content: "orange"},
    {text: "tomato", content: "tomato"},
    {text: "milk", content: "eggnog"},
    {text: "milk", content: "milk"},
    {text: "best before: 2020", content: "yikes"},
    {text: "milk", content: "nothing"}
]

// Be imperative!

function findMilkImperative(boxes) {
    const boxesToGive = [];
    for (const box of boxes) {
        if (box.text == "milk") {
            boxesToGive.push(box);
        }
    }
    return boxesToGive;
} /* So you say: 
     iterate through each of the boxes 
     and if it says "milk" then collect it 
     and then deliver them to me */



// Be functional!

function findMilkDeclarative(boxes) {
    return boxes.filter(box => box.text == "milk")
} // Got it? Gimme! ... Got it?

ฟังก์ชันทั้งสองนี้จะส่งคืน คอลเลกชัน ของกล่องทั้งหมดที่มีข้อความ "นม" อยู่ ดังนั้นสิ่งที่พวกเขาทำก็เหมือนกัน

[
    {text: "milk", content: "eggnog"},
    {text: "milk", content: "milk"},
    {text: "milk", content: "nothing"}
]

แต่วิธีที่คุณนำไปใช้นั้นแตกต่างออกไปมาก

ไปที่ตู้เย็น!

ตอนนี้ฉันรู้แล้วว่าคุณพูดว่า: “มันดี แต่มันเป็นแค่ น้ำตาลเชิงวากยสัมพันธ์

และคุณก็พูดถูก จริงๆ แล้ว วิธีการประกาศสามารถแสดงพลังที่แท้จริงได้ในสถานการณ์ที่ซับซ้อนมากขึ้น

เหมือนตอนที่กล่องเหล่านี้อยู่ในตู้เย็นในห้องครัว

ถ้าเราเป็น "ผู้แอบอ้าง" เราต้องบอก "เด็ก" คำแนะนำทีละขั้นตอนให้มากขึ้นเรื่อยๆ: วิธีเข้าครัว และพวกเขาต้องเปิดประตูตู้เย็นเพื่อรับนมนั้น ไม่ลืมที่จะปิดมันในที่สุด

แล้วถ้าประตูตู้เย็นยังเปิดอยู่ล่ะ?

ผลข้างเคียงเกิดขึ้น...

ผลข้างเคียงหมายความว่ามีการเปลี่ยนแปลงอย่างอื่นนอกเหนือจากที่ตั้งใจไว้ ในการเขียนโปรแกรม มันคือการเปลี่ยนแปลงสถานะของบางสิ่งที่อยู่นอกขอบเขต (เช่น ค่าของตัวแปร การเขียนลงดิสก์หรือคอนโซล เป็นต้น)

เช่นเดียวกับในชีวิตจริงในตู้เย็นของคุณ ซึ่งสิ่งที่เลวร้ายสามารถเกิดขึ้นได้ในอาหารอันโอชะของคุณ มันอาจทำให้โค้ดของคุณไม่แน่นอน หรือมีข้อบกพร่องแปลกๆ ปรากฏขึ้นได้

ในขณะที่เราแค่อยากดื่มนม

อย่างไรก็ตาม เมื่อเราอาศัยอยู่ในโลกที่เปิดเผย มันอาจเกิดขึ้นได้ ผู้ใหญ่ที่คุณถามคือซูเปอร์ฮีโร่ และสามารถนำนมออกจากตู้เย็นโดยไม่ต้องเปิดมัน ยิ่งไปกว่านั้น เป็นไปได้ที่พวกเขาจะหยิบนมมาให้คุณโดยเดินตรงผ่านกำแพง !

คุณเพียงแค่ต้องรู้ว่าคุณต้องการอะไร ไม่ใช่ว่าจะบรรลุได้อย่างไร

และคุณไม่จำเป็นต้องดูแลประตูตู้เย็นบ้าๆ นั่นด้วยซ้ำ ดังนั้นคุณไม่ต้องกลัวผลข้างเคียง

ไชโย!