สรุปงาน iOSDevTH Meetup #10

Kittisak Phetrungnapha
iTopStory

--

สวัสดีครับชาว iOS ทุกท่าน ห่างหายไปนานเลยสำหรับผม เนื่องจากไปเป็น Consultant มา งานค่อนข้างหนัก เลยไม่ค่อยมีเวลาเท่าไหร่น่ะครับ แต่วันนี้ก็เจียดเวลาเพื่อมางานนี้โดยเฉพาะให้ได้ โดยมีหัวข้อหลักๆ 2 หัวข้อ คือ Clean Architecture กับหัวข้อการอัพเดทสิ่งต่างๆ ที่น่าสนใจเกี่ยวกับ WWDC 2017 ที่ผ่านมานะครับ โดยสถานที่จัดงานในรอบนี้ ก็คือ Wongnai ที่เราคุ้นเคยกันนั่นเอง ส่วนเจ้าของบล้อกเพิ่งเคยมาครั้งแรก แหะๆ เอาล่ะ เพื่อไม่เป็นการเสียเวลา เรามาเริ่มที่หัวข้อแรกกันเลยดีกว่า ฟิ้ววววว

ปล. อาจจะตกหล่นไปบ้างนะครับ จำได้ไม่หมด ถถถ และก็จะไม่เขียนด้วย เพราะบทความนี้เป็นการสรุปภาพรวม ส่วนตัวโค้ดกับสไลด์ก็รอจาก speaker ได้ครับ

1. Clean Architecture

สำหรับหัวข้อนี้ได้ speaker จาก Kaidee.com อย่างคุณ รอด ที่เป็น Senior iOS Engineer มาเล่าให้ฟังถึง concept ของมันอย่างคร่าวๆ โดยไอ้เจ้า Clean Architecture เนี่ยถูกคิดค้นโดยตาลุง Uncle Bob เมื่อประมาณสักไม่กี่ปีที่ผ่านมา (ผมจำตัวเลขไม่ได้) โดยเริ่มต้นที่ Ruby จากนั้นก็มีคนเอาไปประยุกต์เข้าใช้กันกับภาษาอื่นๆ มากมาย โดยจะไม่ขอลงรายละเอียดละกัน จะได้ไปไวๆ หน่อย สนใจรายละเอียดอ่านได้ที่ https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html

Clean Swift

ต่อมา Raymond Law ได้เอา concept ของตาลุงมาประยุกต์ ปรับแต่งต่อ จนเกิดเป็น Clean Swift ออกมา โดยทางคุณรอดเล่าให้ฟังถึงปัญหาในการเขียน iOS ที่พบเจอมา ซึ่งผมคิดว่าทุกคนก็คงเคยเจอมาเช่นกัน ดังนี้

  1. MVC ตอนโปรเจคเล็กๆ ก็ไม่มีปัญหาอะไรหรอก แต่พอนานวันเข้า มีการเพิ่ม feature โน่นนี่เข้าไป ViewController อ้วนพีเลย กลายเป็น God ViewController ที่สามารถทำได้ทุกสิ่งทุกอย่าง LOC 1000+
  2. มองไม่เห็น user story ที่ชัดเจน
  3. ตัวโค้ดมีความ flexible น้อย รองรับการเปลี่ยนแปลง requirement ได้ไม่ดีพอ
  4. ปกติแล้ว dev อย่างเราๆ เนี่ย จะ “อ่าน” มากกว่า “เขียน” โค้ด ไม่ว่าจะเป็นโค้ดของตัวเอง โค้ดของคนอื่นก็ตาม ซึ่ง compiler เนี่ยมันไม่สนหรอก มัน compile ได้หมดแหละ แต่เราเป็นคนนะ ไม่ใช่คอม… ซึ่งพอเป็น GodViewController แล้วเนี่ย อ่านยากเหลือเกิน อย่าว่าแต่อ่านยากเลย ไม่อยากอ่านเลยมากกว่า :(
  5. MVC เขียนเทสได้ยาก เนื่องจากปัญหาการผูกติดกันของ view และ controller กับ lifecycle ของมัน
  6. class ตัวเดียว ทำหน้าที่มากกว่าหนึ่งอย่าง ทำให้ break single responsibility ไป แถม module ต่างๆ ก็ไปกระจุกกันอยู่ที่เดียวกันอีก
https://ymedialabs.com/lets-discuss-mvvm-for-ios/

ซึ่งทาง speaker ก็ได้เลือกใช้ Clean Swift มาใช้แก้ปัญหาที่กล่าวไปแล้วด้านบน โดยพัฒนากับแอป Kaidee มาเป็นระยะเวลาเกือบหนึ่งปีแล้ว

https://www.facebook.com/photo.php?fbid=10158970590145327&set=a.10150736657220327.727060.784415326&type=3&theater

ซึ่งเขาได้อธิบายถึงหัวใจของ Clean Swift ว่า ประกอบไปด้วยสามส่วน คือ V I P (Very Important Person) เอ้ย ต้อง View Interactor Presenter สิ

http://clean-swift.com/clean-swift-ios-architecture/

โดยมีกฎที่ถูกควบคุมด้วย protocol ของ Clean Swift คือ

  1. ViewController’s output == Interactor’s input
  2. Interactor’s output == Presenter’s input
  3. Presenter’s output == ViewController’s input

โดยแต่ละ component จะไม่ติดต่อกันโดยตรง และไม่จำเป็นแคร์เกี่ยวกับคนอื่นด้วย สนใจแค่ตัวเองก็พอ แต่จะติดต่อกันผ่าน layer ซึ่งก็คือ protocol input output ต่างๆ นั่นเอง

โดยตัวอย่างที่คุณรอดได้นำมาโชว์ให้ดู เป็นแอปอ่านข่าว Blognone ที่ถูกเขียนด้วย VIPER จากเจ้าของบล้อกเอง (ขายของนิดนึง) แล้วก็เอามาเขียนแบบ Clean Swift แทน

โดย Clean Swift จะมี step การทำงานง่ายๆ ดังนี้

  1. ViewController จะร้องขอข้อมูลข่าวผ่าน ViewController’s output ไปที่ Interactor ที่รอรับคำสั่งอยู่ด้วย Interactor’s input
  2. Interactor ไปทำการ fetch ฟีดข่าวมา (โดยจะใช้ worker หรือไม่ใช้ก็ได้ แต่แนะนำให้ใช้ดีกว่า ไม่งั้นอนาคตกลายเป็น GodInteractor แน่นอน) พอได้ข้อมูลมาแล้ว Interactor ก็จะทำการส่งต่อข้อมูลผ่าน Interactor’s output ให้กับ Presenter ที่รอรับข้อมูลอยู่ที่ Presenter’s input
  3. Presenter ทำการจัด format ข้อมูลให้เหมาะสมที่จะแสดงให้ผู้ใช้งานดู เช่น เปลี่ยนจาก Date เป็น String เป็นต้น แล้วเอาไปเก็บไว้ใน ViewModel
  4. Presenter ทำการเรียก Presenter’s output ส่งก้อนข้อมูล ViewModel ที่เก็บข้อมูลที่ใช้สำหรับแสดงผลจริงๆ เท่านั้น ไปให้ ViewController ที่ conform ViewController’s input อยู่นั่นเอง
  5. ViewController ที่ถือ ViewModel อยู่ ถูก update ค่า แล้วก็สั่ง tableView.reloadData() เพื่อแสดงข่าวสารขึ้นให้ผู้ใช้งานดู ก็เป็นอันครบ loop VIP ของ Clean Swift แล้ว

ส่วนการเขียนเทส ก็จะเขียนเทสเพียงแค่ว่า แต่ละ component ติดต่อกันผ่าน layer ด้วย protocol ถูกต้องหรือไม่ แค่นั้นเอง ไม่ยากครับ

Why Clean Swift instead of VIPER?

ซึ่งดูจากการทำงานคร่าวๆ ของ Clean Swift แล้ว แทบจะเหมือนกับ VIPER เลย แต่ทางคุณรอดได้บอกถึงเหตุผลที่เลือก Clean Swift เพราะว่า

  1. โค้ดของ VIPER ในส่วนของ Presenter นั้น ทำงานมากเกินไป เพราะนอกจากจะต้องคอยไปสั่ง Interactor ให้ไปเรียกข้อมูล ยังต้องทำการ format data ก่อนส่งกลับให้ ViewController แล้วก็ยังมีส่วนที่ต้องเรียก Wireframe เพื่อเปลี่ยนหน้าอีก กลายเป็น GodPresenter ไปอีกหนึ่งราย
  2. VIPER นั้นเป็น multi-directional data flow คือ ข้อมูลวิ่งได้สองทาง ต่างกับ Clean Swift ที่เป็น uni-directional data flow ที่จะวิ่งเป็นวงกลมทางเดียว ViewController -> Interactor -> Presenter -> ViewController ทำให้เข้าใจ flow การทำงานได้ดีกว่า
  3. VIPER ใช้ segue ไม่ได้ ในขณะที่ Clean Swift ใช้ได้ (สาย storyboard ถถถ)
  4. Document ของ VIPER มีน้อยกว่า Clean Swift

เนื่องจากเจ้าของบล้อกเคยใช้มาทั้งสองอย่าง ถามว่า เลือกอันไหน ตอนนี้ตอบได้แบบรวดเร็วเลยว่าเลือก Clean Swift ครับ เหตุผลก็คล้ายๆ กับคุณรอดนั่นแหละ แต่ห้ามไปเดินพูดแบบนี้แถว Agoda นะครับ เขาใช้ VIPER กันอยู่ เดี๋ยวโดนทุบหัว XD เงียบๆ ไว้ (หยอกเล่นนะ Devs Agoda จ๋า) ส่วนใครอยากอ่านรายละเอียดเต็มๆ ของ Clean Swift อ่านได้ที่

สำหรับตัวอย่างโค้ดและสไลด์ใน session ทางคุณรอดได้เตรียมให้เรียบร้อยแล้วครับ

2. Platform state of the Union

สำหรับหัวข้อต่อมาเป็นการสรุปเรื่องราวต่างๆ จากงาน WWDC 2017 โดยคุณ แบงค์ จาก Omise ที่เดินทางไปไกลถึง San Jose เพื่อเข้าร่วมงานนี้โดยเฉพาะ (รู้สึกคุณรอดก็ไป) ส่วนผมนี่นั่งดู Keynote อยู่บ้านครับ ไม่มีกะตังค์ T^T เอาล่ะมาเริ่มกันเลย เอาที่ผมจำได้ละกัน เพราะรายละเอียดเยอะมว้ากกก มึนนนน

Xcode 9

สำหรับ Xcode 9 ได้ถูกปรับปรุงจาก Xcode 8 มาเยอะมาก เรียกได้ว่าเป็น Xcode เวอร์ชันที่ดีที่สุดเลย

  1. All new editor Apple claim ว่าเร็วขึ้นมาก ทำการ highlight และ navigate code ได้ง่ายขึ้น แล้วก็ support Markdown ด้วย
  2. Refactoring Xcode 9 สามารถ refactor class ของ Swift ได้ซะที (ดีใจมาก) และก็ยัง support Objective-C, C, C++ เช่นกัน
  3. Debugging สามารถ Debug app บน device จริงแบบไร้สายได้แล้ว แต่ต้องต่อ network วงเดียวกัน
  4. Source Control สำหรับคนที่ใช้ Github ก็เฮกันไป เพราะ Apple ได้ integrate Github เข้ามาอยู่ใน Xcode 9 เรียบร้อยแล้ว กด push กันได้สบายเลย
  5. Xcode Server built-in เราสามารถรัน CI bots ได้โดยตรงผ่าน Xcode 9 ได้เลย ไม่ต้องใช้ macOS server แล้ว แต่เครื่องต้องแรงหน่อยนะ หุหุ
  6. New Build System เร็วขึ้นมาก แต่จำตัวเลขไม่ได้ว่ากี่เปอร์เซ็นต์
  7. Named colors support อันนี้ก็ดี สร้างสีได้เหมือนกับ images xcassets เลย
  8. Added option to preserve image vector data Xcode 9 support .pdf เต็มรูปแบบแล้ว สามารถย่อขยายภาพโดยภาพไม่เสียคุณภาพของรูป แต่ก็มีข้อเสียอยู่ตรงที่ว่า แอปบวม ไฟล์ใหญ่ขึ้น (ใช่ป่ะ ไม่แน่ใจ จำไม่ได้)
  9. กด command + หรือ command — เพื่อขยายหรือย่อ font ใน Xcode 9 ได้เลย (ซะที)

อ่านรายละเอียดเพิ่มเติมได้ที่

Simulator

  1. Run multiple simulators เราสามารถรัน simulator ได้พร้อมกันหลายๆ อันแล้ว เหมาะแก่การทำ UI Test มากเลยทีเดียว เมื่อก่อนก็มี LinkedIn ที่ทำ Bluepill ออกมาแนวๆ นี้ในการช่วยทำ UI Test ของ iOS แต่ตอนนี้ก็ใช้ของ native ได้เลย (มั้งนะ ยังไม่เคยลอง)
  2. สามารถย่อขยาย simulator ได้ตามใจชอบแล้ว ยืดๆ หดๆ กันยาวๆ ไป
  3. ใส่กรอบไอโฟนมาให้ใน simulator ด้วย สวยดี
  4. จำได้ว่ามีมากกว่านี้ แต่ลืมแล้ว ขอโทษ T^T

Swift 4

  1. Source Compatibility support ทั้ง Swift 3.2 และ Swift 4 นั่นหมายความว่า เราสามารถเอาโปรเจคที่เป็น Swift 3.2 ไปรันบน Xcode 9 ได้โดยไม่ต้อง convert ก็น่าจะผ่านได้เลย และก็ยังสามารถใช้ทั้ง Swift 3.2 และ Swift 4 ไปพร้อมๆ กันได้ด้วย เช่น 3rd party บางตัวอาจจะยังเป็น Swift 3.2 ก็สามารถใช้ได้เช่นกัน แต่สุดท้ายแล้วก็ไป Swift 4 กันเถอะ เนอะ เนอะ
  2. Dictionary enhancements อันนี้ก็เพิ่มพวก function การ merge, การ group
  3. Easier to use String อันนี้ผมชอบมาก String กลับเป็น collection แล้ว นั่นแปลว่าเราสามารถทำ functional หรือใช้ high-order function กับมันได้อย่างสนุกสนานเลยทีเดียว แล้วก็ยัง support multi-line text โดยใช้ “”” เปิด กับ “”” ปิด แจ่มมาก และก็เรื่องยิบย่อยอื่นๆ อีกพอสมควร
  4. Encoding & Decoding ถ้าใครเคยใช้ NSCoding มา ก็จะรู้ว่า มันจะต้องเขียนโค้ดเยอะพอสมควร แถม support แค่ reference type อีก แต่พอมาเป็น Codable ปุ้ป ชีวิตง่ายขึ้นเลย มันจัดการให้เราเกือบหมด struct ก็ใช้ได้
  5. Smart Keypaths ถ้าใครเคยใช้ valueForKeyPath ใน Objective-C ก็คงจะคุ้นเคยกับมันดี ตอนนี้ใน Swift 4 ทำได้แล้ว แถมยังระบุ type ให้เราถูกต้องอีกด้วย
  6. Small binaries ไฟล์ binaries จะมีขนาดเล็กลง (จะแปลทำไม ~~)

อ่านรายละเอียดเพิ่มเติมได้ที่

New Frameworks

  1. Core ML อันนี้ก็เป็น framework ที่ช่วยให้การทำ machine learning บน iOS ง่ายขึ้นมากๆ แต่ก็ยังต้อง train model เองอยู่ดีนะ
  2. Vision อันนี้ก็เป็น framework ที่ครอบ Core ML อยู่อีกที ช่วยให้ใช้งาน machine learning ได้สะดวกมากขึ้น เช่น face detection, object tracking
  3. ARKit ทำ Augmented Reality ได้บน iOS 11 แล้ว เย้
  4. MusicKit อันนี้จำไม่ได้
  5. Core NFC support NFC แล้ว แต่เฉพาะขารับอย่างเดียว ขาส่งน่าจะยังไม่ได้ อันนี้ไม่แน่ใจ
  6. Metal 2 อันนี้จำไม่ได้เช่นกัน
  7. PDFKit แอปไหนมีฟีเจอร์เกี่ยวกับ PDF เช่น อ่าน เขียน ชีวิตก็สะดวกขึ้นล่ะ ไม่ต้องใช้ 3rd party แล้ว
  8. IdentifierLookup จำไม่ได้
  9. DeviceCheck อันนี้เป็นค่าๆ หนึ่ง เก็บได้ 2 bits ซึ่งจะเป็น unique key ที่ผูกเข้ากับ device และ developer account นั่นหมายความว่า ถึงจะ hard reset iPhone ไป ค่านี้ก็ยังไม่เปลี่ยนอยู่ดี จนกว่าจะครบอายุการใช้งาน (จำไม่ได้ว่ากี่ปี หรือถ้าเข้าใจผิด ฝาก comment ให้ด้วยครับ) ส่วนจะเอาไปทำอะไรได้บ้างนั้น อันนี้คงต้องประยุกต์กันเอาเอง

Etc.

  1. ถ้าย้ายไฟล์จาก group หนึ่งไปอีก group หนึ่ง หรือสร้าง group ใหม่ Xcode 9 จะไปทำที่ physical ไฟล์ให้ด้วย ดีงาม
  2. มีการทำ Main Thread Checker ให้ด้วย ซึ่ง Xcode จะแจ้งเตือนให้เรารู้ว่า เรามีการเรียกคำสั่งที่เกี่ยวกับ UI ใน thread อื่นๆ เช่น background thread หรือไม่
  3. จริงๆ มีเยอะกว่านี้อีกนะ แต่ตอนนั้นสติหลุดไปแล้ว หิวพิชซ่า ><

ก็ประมาณนี้แหละครับ สรุปคร่าวๆ เกี่ยวกับงาน iOSDevTH Meetup #10 ส่วนถ้าใครสนใจศึกษาหัวข้อไหนเพิ่มเติมเป็นพิเศษ ก็ลอง google ดูครับ ข้อมูลเริ่มมีมากขึ้นแล้ว หรือจะไปดูวีดีโอ WWDC 2017 ตาม session ต่างๆ ก็ได้ แต่ก่อนอื่นอย่าลืมลง Xcode 9 beta 2 (ณ เวลาที่เขียน) กันด้วยล่ะ ส่วนใครเจอบัคอะไรเกี่ยวกับ Xcode 9 หรือ iOS 11 ก็แจ้งๆ Apple ไปหน่อย ช่วยๆ กัน เพื่อให้ได้ของที่มีคุณภาพที่ดีที่สุดออกมา (ใครก็ได้มาสอนผมหน่อย :( ยังไม่เคยทำเลย )

สำหรับวันนี้ก็ลากันไปเพียงเท่านี้ก่อน แล้วพบกันใหม่ บทความหน้า สวัสดีครับ :)

ติดตามเรื่องราวต่างๆ ทั้งเทคโนโลยี มุมมองชีวิต การเรียนรู้ การใช้ชีวิต ได้ที่ https://www.facebook.com/itopstory/

https://www.facebook.com/itopstory/

--

--

Kittisak Phetrungnapha
iTopStory

I am a software engineer who fall in love to code, read, and write. :) itopstory.com