Funny

Reactive Programming in Swift คืออะไร ? (ตอน 1)


Reactive Programming คืออะไร ?
ทำไมต้องพัฒนาแอพในแบบ Reactive Programming ?
ถ้าจะนำมาใช้ใน Swift ควรเริ่มต้นยังไง ?
เป็นคำถามในตอนแรกๆเลย ที่มันทำให้เราอยากหาคำตอบ ว่ามันคืออีหยัง ?
ผมเลยอยากจะมาเล่าในแบบฮาๆให้ฟัง จากประสบการณ์ที่พึ่งเจอมาหมาดๆ กรุ่นๆ สดๆ ร้อนๆ กับตัวเอง ในฐานะน้องใหม่ในการเขียนโปรแกรมแบบนี้
สำหรับมือใหม่ ผมอาจอธิบายได้ไม่ค่อยดีนัก แต่จะขอเล่าตามความเข้าใจที่เจอมานะครับ หากตรงไหนผมอธิบายแปลกๆ หรือผิดจากคอนเซ็ปไป รบกวนช่วยคอมเม้นให้ผมได้แก้ไขด้วยนะครับ จะขอกรอบพระคุณจริงๆครับ เพราะในตอนที่ 1 นี้ คงจะเหมาะกับมือใหม่แบบผมเป็นแน่แท้ 😀

Reactive Programming คืออะไร ?

มันคือการเขียนโปรแกรมที่มีรูปแบบของผู้สังเกตการณ์ (จะแปลเป็นไทยแม่งก็เข้าใจยาก .. ฮา) มันก็คือ Observer Pattern นั่นแหละครับ ซึ่งจะสนับสนุนการจัดการและการโอนถ่ายข้อมูลหรือเราอาจคุ้นๆที่เรียกกันคร่าวๆ ว่า Signal (สัญญาณ) หรือ Sequence ที่ถูกปล่อยมาจากผู้ถูกสังเกตการ (ผู้ปล่อยสัญญาณ) หรือที่เรียกว่าเจ้า Observable และเจ้า Observable นี่เองก็เหมือนกับตัวท่อหรืออะไรสักอย่างที่ให้ดาต้าได้ไหลผ่านมัน โดยหลักของมันก็คือเราจะเน้นไปที่เรื่องของ Asynchronous data streams … อ้าว งง ผมก็งงนะ ไม่ใช่ไม่งง ฮา.

everything is a stream
คือ ถ้าจะให้เข้าใจง่ายๆ มันก็เหมือนกับว่า โอเค! เรามีมือถืออยู่เครื่องนึง ซึ่งไอ้มือถือเครื่องนี้ เราจะเรียกมันว่า Observable ซึ่งเจ้ามือถือของเราเนี่ย จะชอบมีการปล่อย Notification ต่างๆ เช่นจาก Facebook, Line, Email, หรือ Messages ต่างๆ มาแสดงผลที่หน้าจอ เราจะเรียก Noti เหล่านั้นว่า Sequence ซึ่งตัวเราเองในตามธรรมชาติแล้ว ก็จะหยิบมันขึ้นมาดูว่ามันเป็น Notification ของอะไร การทำแบบนี้เรียกว่าเป็นการ Subscribed และพอเราหยิบมาดูเสร็จ เราเองจะเป็นคนเลือกว่าจะทำอะไรกับ Noti หรือที่เราเรียกว่า Sequence เหล่านั้นอีกที และสุดท้าย เราเองก็คือ Observer.
จากตัวอย่างด้านบน คงแยกได้เป็น 3 อย่างหลักๆ ดังนี้

  1.  Observable = มือถือ
  2. Sequence= Notifications(Signal) ต่างๆ บลาๆ (จริงๆเจ้า Sequence เนี่ย มันเกิดมาได้จากหลายอย่างมากนะครับ แต่ขออธิบายแบบนี้ก่อน)
  3.  Observer = เราเองจ้า

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

โฟลว์การทำงานก็คงประมาณนี้
SearchBar -> Weather API -> TextLabel

แล้วอะไรคืออะไรหละ ?
SearchBar ของเราจะทำหน้าที่เป็นตัว Observable ที่จะคอยปล่อยสัญญาณของ ตัวอักษร หรือ คำ ที่เราพิมพ์ลงไป โดยมีเจ้า Weather API เป็นตัวที่คอย Subscribed ว่าเราพิมพ์เสร็จหรือยัง อันนี้เราอาจสร้างเงื่อนไขให้ได้ ว่าจะรอหากไม่พิมพ์ต่อเนื่องกันใน 3 วินาที ถ้าเกิน 3 วินาทีขึ้นไป เจ้า API ก็จะเอาค่าจาก SearchBar ที่ได้มาประมวลผล โดยที่เจ้า Weather API นี่เองก็อาจเป็นได้ทั้งตัว Observer และ Observable เพราะสุดท้ายแล้ว จะถูกเจ้า TextLabel คอยดูอีกที ว่ามีค่าอะไรกลับออกมาไหม ถ้าให้ค่าที่ถูก ก็จะแสดงข้อมูลอุณภูมิ ถ้าผิด ก็ว่ากันไปว่าจะทำอะไรต่อ

callback everywhere

จากสองตัวอย่างด้านบน ผมเดาว่าเพื่อนๆ(และตัวผมเอง)คงเข้าใจเพิ่มขึ้น และเราจะมาดูกันต่อว่า ทำไมเราต้องพัฒนาแอพพลิเคชั่นในแบบของ Reactive Programming

ทำไมต้องพัฒนาแอพในแบบ Reactive Programming ?

เอาเป็นข้อๆและคร่าวๆ แบบยังไม่ลงรายละเอียดก่อนละกันนะครับ

  1. โค้ดสั้นลง ลด nested block ที่ซ้อนกันเยอะๆ
  2. ไม่ต้องกลัว callback hell
  3. โค้ดอ่านง่ายขึ้น (ซึ่งมือใหม่แบบผมยังเถียงในใจอยู่นิดๆ .. ฮา)
  4. เราสามารถเอา Sequence ต่างๆมาใช้แทน Delegate ได้เลย
  5. มี Operators ให้ใช้มากมาย เช่น map, flatMap, zip, combineLatest, scan etc… อีกเยอะ ซึ่งเราจะนำไปประยุกใช้ได้หลายท่ามากๆ
  6. เขียนเทสได้ง่ายขึ้น เขียนได้หลายแนว จะ Hit หรือไม่ Hit Network ก็อ่านง่าย(อ่านง่ายอีกละ 55) แต่เผื่อไว้นิดนึงว่าถ้าจะเขียนให้ Hit Network มันบ่ค่อยดีเท่าไร ลองไปอ่านตามนี้ดูครับ Why hitting the network is bad for your tests
  7. เข้าใจง่ายและชัดเจนขึ้น …. (พิมพ์ไปน้ำตาไหลไป)
  8. Less stateful จ้าาาา
  9. จัดการ Resource ได้ง่าย leaks ยากกกก
  10. คิดไม่ออกแล้ว รอให้ประเทศเป็นประชาธิปไตยก่อนค่อยคิดออก ปัดโถ่ว จะอะไรนักหนา

approves

จะนำมาใช้ใน Swift ควรเริ่มต้นยังไง ?

จะเริ่มยังไงดีเหรอ Google เลยครับ … เห้ย ไม่ใช่ละ ก่อนอื่นผมว่าสำคัญสุดเลย คือ

  1. ต้องเข้าใจคอนเซป Reactive Programming ก่อนเลยครับ ทำไมผมถึงบอกอย่างนั้น ?. ก็เพราะผมอ่านมาตั้งนานก็ยังไม่เข้าใจสักที เลยมาเขียนวางยาคนอ่านอยู่นี่ไงครับ 555. คือคอนเซ็ปสำคัญมากจริงๆ ผมว่ามันจะพาเราไปได้ไกลและประยุกใช้ได้ถูกต้องและเป็นประโยชน์จริงๆ ซึ่งก็นี่ยังบิกินเนอร์ เหมือนพึ่งเข้าป่าฟาร์มเอาบลิ้งยังไงยังงั้น
  2. ต้องเปลี่ยนแนวคิดใหม่ แรกจะมึนๆ งงๆ จากที่เราอาจยัดค่าใส่ตัวแปลตรงๆ กลายมาเป็นต้องมานั่งดูมันเกิดอะไรขึ้นแทน
  3. สำหรับ Swift ก็เจ้านี่เลยRxSwift ซึ่งมันคือ Reactive Extensions เวอร์ชั่นที่เขียนมาเพื่อ Swift โดยตรง มันก็คือ ReactiveX สำหรับ Swift ครับ
  4. เขียน Swift ให้เป็นก่อน(เหมือนเสียงมันกลับมาก้องอยู่ในหูตัวเองยังไงก็ไม่รู้) ผมว่า Swift เป็นภาษาที่เจ๋งมากๆอีกภาษานึง ท่ีจะมาช่วยในการพัฒนาแอพพลิเคชั่นบนไอโฟนให้เรา ตอนนี้ผมคงใช้เพอร์ฟอร์แมนซ์ของมันได้สัก 30% 555
  5. Mentor ที่ดี อันนี้ต้องขอบคุณจริงๆ ผมได้อะไรจาก Mentor เยอะมากครับ ทริคดีๆ เทคนิคดีๆ ที่เขาได้ตกผลึกแล้ว ซึ่งจะทำให้เราเข้าใจมากขึ้นครับ
  6. Google เลย ตัวอย่างและวิดีโอเพียบเลยครับ ผมเจออันนี้มา ซึ่งเค้ารวม Learning sources ไว้ให้เราเยอะมากเลย ดูหมด อ่านหมด นี่ติดปีกบินลงจากตึกได้เลยครับ
    https://gist.github.com/JaviLorbada/4a7bd6129275ebefd5a6
    ใครกลัวลืมก็ fork ไว้เลยก็ได้นะครับ
  7. ซ้อมๆ ซ้อม แล้วก็ซ้อม ฝึกเขียนเยอะๆครับ เขียนๆไปแล้วจะอ๋อไปเรื่อยๆเอง ยิ่งเราอยู่กับมัน เรายิ่งจะเข้าใจมันมากขึ้นครับ อย่าพึ่งยอมแพ้ มันสิต้องยอมแพ้เรา

สรุปตอนที่ 1

เฟดเฟ่ เหมือนจะมีสาระถ้าคุณได้อ่านมันจนจบ ผมก็หวังว่าผมจะเขียนให้มีสาระจริงๆนะ บทความด้านบนเป็นเพียงส่วนย่อยที่ผมได้ประสบพบเจอมาเท่านั้นเอง และมาเขียนเพื่อทดสอบความเข้าใจตัวเอง และอยากจะแชร์ประสบการณ์ในการเขียนโปรแกรมในแบบ Reactive Programming จากที่ได้เล่นกับ RxSwift มาพักนึง
ซึ่งคิดว่าในตอนต่อไป คงจะลงลึกเข้าไปอีก น่าจะเห็นภาพและเข้าใจกันได้ง่ายมากขึ้น
หากบทความข้างต้นมีข้อผิดพลาดประการใด รบกวนช่วยฝากคอมเม้นเป็นแรงใจ… เห้ยยย มาเป็นนักร้องลูกทุ่งเลย .. ช่วยฝากคอมเม้นให้ผมได้แก้ไขและนำไปพัฒนาในบทความตอนต่อไปด้วยครับ

restart

ขอบคุณครับ ฮรี่ๆ

iOS
How to make tableviewcell animation using Swift
iOS
View Controller Transitions on Swift
Funny
Beginner play Test-Driven Development(TDD) in swift
  • Dave

    DaveDave

    Author Reply

    สำหรับผมคิดว่าการทำความเข้าใจ หลักการของ Reactive Programming สำหรับคนที่เพิ่งเริ่มสำคัญมาก

    เพราะเป็นส่วนที่ต้องปรับเปลี่ยนมุมมองและแนวคิดในออกแบบโปรแกรม กันค่อนข้างมากเลยทีเดียว

    ของผมก็กำลังศึกษาได้มาระยะนึงแล้ว แต่ใช้เขียนบน Angular 2 (RxJs)

    ยอมรับว่าต้องใช้เวลามากพอสมควรเลย กว่าจะเข้าใจคอนเซ็ปต์ของมันได้