Google Flutter

5 แนวทางเพื่อเขียน Plugin ที่ดีให้กับ Google Flutter

เรื่องที่เกี่ยวข้อง - ,

Flutter นั้นขึ้นชื่อเรื่องความสะดวกในการสร้าง Plugin เอาไว้ใช้งานเอง แต่ก็เหมือนกับการเขียน Application นั่นคือก่อนจะเขียนโค้ดสร้าง เราควรระลึกถึงแนวคิดที่ช่วยให้งานของเราไม่ยุ่งยาก หรือทำให้โปรเจคนั้นวุ่นวายในภายหลัง

จริงๆ Flutter ก็ได้เผยแพร่แนวคิดนี้ไว้บน Medium ก็ขอเอามาแปลให้เข้าใจง่ายๆ ตามสไตล์โค้ชพลแล้วกันครับ

1. เขียนเน้นไปที่การใช้งาน ไม่ใช่สร้างให้เทียบเท่า API

อย่าสร้าง Plugin ที่เทียบเท่า API

โดยปกติ เป้าหมายของการสร้าง Plugin ขึ้นมาใช้งานใน Google Flutter คืออยากให้ภาษา Dart ในโปรเจคของเรา สามารถเรียกใช้ Native API ได้

ถือว่าเป็นเป้าหมายที่ดี แต่ตอนที่เราเขียนตัวภาษา Dart ไม่ควรเริ่มจากการไล่สร้าง Method ที่ทำงานเหมือนกับตัว Native API

แต่ให้เลือกสร้าง Method ตามการใช้งานครับ

เพราะว่าในแต่ละ Platform ถึง API จะชื่อเดียวกัน แต่ method ดันชื่อแตกต่างกัน

หากตั้งชื่อ Method ใน Plugin ตามชื่อของ Native API เดียวจะเวียนหัวเอา

เช่นตัวอย่างที่ยกขึ้นมาคือ การที่เราจะเขียน Plugin ใช้งาน Local Storage เขียนเก็บข้อความ String เอาไว้

class StoragePlugin {
  
  /// Reads a string
  Future<String> getString(String key) async {}
  
  /// Writes a string
  Future<void> setString(String key, String value) async {}
}

จากนั้นก็ค่อยเรียกใช้ Native API ตามความเหมาะสมของแต่ละ Platform ครับ

class StoragePlugin {
  
  Future<String> getString(String key) async {
    if (Platform.isIos) {
      return await callMethodChannel('fetchValue', {'id': base64encode(key)});
    } else if (Platform.isAndroid) {
      return await callMethodChannel('fetchValue', {'id': key});
    }
  }
  
  Future<void> setString(String key, String value) async {
    if (Platform.isIos) {
      await callMethodChannel('setValue', {'id': base64encode(key), 'value': value});
    } else if (Platform.isAndroid) {
      await callMethodChannel('setValue', {'id': key, 'value': value});
    }
  }
}

แล้วถ้า API นั้นไม่มีใน Platform ที่ต้องการล่ะ???

ถึงจุดนี้ Plugin คุณ ก็ควรจะยินยอมที่ “ไม่สามารถทำส่ิงต้องการ” บน Platform นั้นครับ (ก็มันไม่มี API ให้ใช้ จะทำได้งั้ยยย)

จุดนี้คำแนะนำคือ

  • อธิบายข้อจำกัดดังกล่าวลงในวิธีใช้งาน หรือเอกสาร
  • อีกทางคือไปเรียกร้องให้มีความสามารถดังกล่าวจากเจ้าของ Platform ครับ คล้ายกับการร้องของ Feature

2. อย่าตั้งชื่อ Method แยกตาม Platform

ตัวคำสั่งต่างๆ ใน Flutter ออกแบบมาโดยไม่อิงกับ Platform ตัวใดตัวหนึ่ง ดังนั้นเวลาเราสร้าง Plugin ไม่ควรทำให้เกิดการนำมาเขียนใช้งานแยกตาม Platform

เช่น ไม่ควรให้ตอนเขียนใช้งาน Plugin เราต้องมาเรียก method แยกกันแบบนี้ในตัว Flutter Application ของเรา

if (Platform.isIos) {
  myPlugin.doIOSThing();
} else if (Platform.isAndroid) {
  myPlugin.doAndroidThing();
}

แต่ควรเขียนเรียกใชข้งานแบบนี้แทน

myPlugin.doThing();

ซึ่งจะทำให้ได้แนวทางเหมือนกับในข้อ 1 นั่นเอง

3. ไม่ควรเขียน Plugin เฉพาะ Platform

…นอกเสียจากจะระบุให้ชัดเจนในชื่อ หรือเอกสารแนะนำการใช้งาน

จริงๆ อยู่ว่าการเขียน Plugin ตอนเริ่มนั้น เราควรจะเริ่มจากเล็กๆ ก่อนเช่น เขียนรองรับเฉพาะ Android หรือ iOS อย่างเดียว

ซึ่งไม่ใช่ส่ิงที่ผิดร้ายแรงนะครับ สำหรับการเขียนใช้เอง

แต่อย่าลืมว่า ถ้าเอาไปเผยแพร่ ตรงนี้ต้องคำนึงถึงความคาดหวังของผู้ที่มาพบ Plugin ของเรา และนำไปใช้ด้วย

เขียนแจ้งชัดๆ ไว้ใน Document, README หรือตั้งชื่อแบบมี Platform อยู่ในชื่อไปเลย

4. ทำให้ Plugin ง่ายที่จะอ่าน และทดสอบ

  • ทำให้ code ส่วน Logic ของเราอยู่ในส่วนภาษา Dart จะทำให้เรียบเรียง และทดสอบง่ายกว่า
  • ส่วนที่จำเป็นต้องเขียนใน Native Layer จริงๆ ให้พยายามรวมไว้ใน Class เดียว เพื่อที่จะใช้ Unit test ทดสอบง่ายๆ

หากใช้แนวคิดด้านบนในการเขียน Plugin โค้ดของเราจะซับซ้อนน้อยกว่า เพราะเรารวบรวม logic ส่วนใหญ่ไว้ในส่วนของ Dart

แทนที่จะต้องไปเขียนซ้ำแล้วซ้ำอีกในส่วนของ Native Layer ของแต่ละ Platform นั่นเอง

5. หลีกเลี่ยงการเขียน Global หรือ Static Method

เนื่องจากภาษา Dart นั้น ไม่ได้บังคับให้เราต้องเขียน Code ในเชิง Object (OOP) ทำให้หลายครั้งเราอาจจะประกาศ Plugin Method แบบนี้ในไฟล์ Dart ได้

Future<User> authenticate() async {
  // Some code
}

แต่แนะนำให้ประกาศแบบ Class จะดีกว่า

class AuthenticatePlugin {
  Future<User> authenticate() async {
    // Some code
  }
}

เพราะแบบที่ 2 จะสามารถเขียน Mockup ข้อมูลขึ้นมาได้ง่ายกว่า (ตัว Flutter Application มักจะเขียนในเชิง Object อยู่แล้ว) และง่ายกว่าในการทำ Unit Testing ด้วยนะ

นั่นแหละ 5 ข้อของเรา

สนใจเริ่มต้นเรียนรู้ Google Flutter สไตล์โค้ชพล คลิกดูรายละเอียดที่นี่ได้นะครับ

และสามารถติดตามอัพเดตใหม่ๆ ได้ต่อเนื่องทาง Facebook และ Youtube ครับผม

เปิดอบรม Google Flutter สำหรับผู้เริ่มต้น

เหมาะสำหรับโปรแกรมเมอร์, เข้าใจง่าย, ใช้ได้จริง

สอบถาม หรือติดต่อจัดอบรมโทร 083-071-3373

อ้างอิง – Writing a good Flutter plugin

Loading Facebook Comments ...

Leave a Reply

Your email address will not be published. Required fields are marked *

Fill out this field
Fill out this field
Please enter a valid email address.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Menu