ทำไมต้อง MapConductor
โค้ดของแอปที่มีฟังก์ชันแผนที่มักจะผูกกับ SDK แผนที่เฉพาะอย่างลึกซึ้ง เมื่อต้องการเปลี่ยน การเขียนใหม่ไม่ได้จบเพียงแค่ส่วนแผนที่ แต่ยังกระทบถึงตรรกะของหน้าจอด้วย MapConductor จะทำหน้าที่แทนที่การผูกนั้นด้วย API ทั่วไปเพียงชั้นเดียว
01 · ปัญหาคืออะไร
ค่าธรรมเนียมและสัญญามีการเปลี่ยนแปลง
โครงสร้างการเรียกเก็บเงินของ Maps API จะเปลี่ยนไป อาจเกิดสถานการณ์ที่คุณต้องการเปลี่ยน แต่โค้ดของแอปไม่อนุญาต
เขียนฟังก์ชันเดียวกัน 3 ครั้ง
หากคุณใช้ Maps SDK ที่แตกต่างกันสำหรับ Android, iOS และ Web การจัดการเครื่องหมายและความหมายของกล้องจะไม่สอดคล้องกัน จำเป็นต้องหารือเกี่ยวกับข้อกำหนด 3 ครั้ง
ค่าตัวเลขไม่ตรงกัน
หากปล่อยให้ยูทิลิตี้ของ SDK จัดการสเกลที่ซูมระดับ 14 ชี้ไปและระยะห่างระหว่างสองจุด จะเกิดความแตกต่างในแต่ละสภาพแวดล้อม ใน QA คุณจะต้องตัดสินใจทุกครั้งว่า "อันไหนถูกต้อง"
ล้มเหลวเมื่อจำนวนเพิ่มขึ้น
เมื่อเครื่องหมายมีมากกว่าหลายพันรายการ การดำเนินการกล้องจะช้าลงเมื่อใช้การนำไปใช้งานแบบพื้นฐาน มาตรการแก้ไขแตกต่างกันไปในแต่ละผู้ให้บริการ และคุณจะต้องเขียนใหม่ทุกครั้ง
02 · คำตอบของ MapConductor
แอปจะขึ้นอยู่กับ API แบบครบวงจรเพียงอย่างเดียว ไดรเวอร์จะดูดซับความแตกต่างระหว่างผู้ให้บริการ และการเปลี่ยนแปลงทำได้เพียงแค่สลับโมดูลที่พึ่งพาและประเภทของมุมมอง
พิกัดและสถานะใช้ร่วมกัน
GeoPoint, MarkerState และ MapCameraPosition มีชื่อและความหมายเหมือนกันในทั้ง 3 แพลตฟอร์ม ไม่มีประเภทเฉพาะของผู้ให้บริการปรากฏขึ้น
ซูมและระยะทางตรงกัน
ซูมถูกทำให้เป็นมาตรฐานบนสเกลทั่วไป และระยะทาง ทิศทาง และพื้นที่ถูกคำนวณด้วยการนำไปใช้จริงของ SDK เอง หากข้อมูลนำเข้าเหมือนกัน ค่าที่ส่งคืนจะเหมือนกันไม่ว่าจะใช้ผู้ให้บริการรายใด
ส่งผ่านสถานะเท่านั้น
หากคุณส่งผ่าน „อาร์เรย์ของสถานะที่ควรจะเป็นในขณะนี้“ Core จะคำนวณความแตกต่างจากครั้งก่อนและสะท้อนสิ่งที่จำเป็นเท่านั้นลงบนแผนที่ คุณไม่จำเป็นต้องจัดการการเพิ่ม อัปเดต หรือลบเอง
ปัญหาเรื่องจำนวนรายการ SDK จะเป็นผู้แก้ไข
เมื่อมีมาร์กเกอร์มากกว่า 2,000 รายการ เอนจิ้นการเรนเดอร์ภายในจะสลับไปใช้การวาดแบบไทล์แรสเตอร์โดยอัตโนมัติ แม้จะมีหลายหมื่นรายการ การจัดการกล้องยังคงลื่นไหล และโค้ดฝั่งแอปไม่ต้องเปลี่ยนแม้แต่บรรทัดเดียว ค่าเกณฑ์สามารถเปลี่ยนแปลงได้ในตัวเลือกมุมมองแผนที่
03 · ไม่ใช่ Wrapper แบบบางๆ
หากเป็น Wrapper ที่เรียกเมธอดของแต่ละ SDK เท่านั้น สิ่งที่ทำได้จะถูกจำกัดอยู่ที่ "SDK ที่มีฟังก์ชันน้อยที่สุด" MapConductor นั้นวาดฟังก์ชันที่ขาดไปเองเพื่อเติมเต็ม ดังนั้นรูปลักษณ์และพฤติกรรมจึงสม่ำเสมอแม้จะเปลี่ยนผู้ให้บริการ
04 · สิ่งที่ส่งผลต่อทีม
เมื่อใส่ API ทั่วไปไว้ตรงกลางสักชั้นหนึ่ง ลักษณะของโค้ดที่สามารถเขียนได้ก็จะเปลี่ยนไป โค้ดที่ไม่มีชื่อของแผนที่ SDK ปรากฏขึ้น จะยังคงอยู่ได้ตามเดิมแม้จะเปลี่ยนผู้ให้บริการหรือย้ายไปยังแพลตฟอร์มอื่น
ต้องจำ API เพียงตัวเดียว
เนื่องจากแนวคิดและการตั้งชื่อของแผนที่ SDK แตกต่างกันไปตามผู้จำหน่าย ทุกครั้งที่เปลี่ยนผู้ให้บริการหรือย้ายแพลตฟอร์ม คุณจะต้องเรียนรู้ใหม่อีกครั้ง ด้วย MapConductor สิ่งที่ต้องจำคือ API เพียงตัวเดียว และสามารถใช้ชื่อและความหมายเดียวกันได้ทั้งใน Android, iOS และ React ความรู้ที่ได้จากแพลตฟอร์มหนึ่งสามารถนำไปใช้ได้ทันทีบนแพลตฟอร์มอื่น และเมื่อมีคนใหม่เข้ามาในทีม เอกสารที่ต้องอ่านจะไม่เพิ่มขึ้นตามจำนวนของผู้ให้บริการ
โค้ดที่ไม่ขึ้นกับแผนที่ SDK
GeoPoint และ MarkerState เป็นประเภทที่ไม่ได้ขึ้นกับแผนที่ SDK ใดๆ การสร้างเส้นทาง การตรวจสอบว่าอยู่ในช่วงหรือไม่ และการตัดสินใจว่าจะแสดงอะไร — คุณสามารถเขียนตรรกะเหล่านี้โดยแยกจากประเภทของแผนที่ SDK ได้ ดังนั้นเมื่อเปลี่ยนผู้ให้บริการจึงไม่ต้องเขียนใหม่ คุณยังสามารถแยกส่วนประกอบส่วนกลางรอบๆ แผนที่ออกเป็นไลบรารีได้โดยไม่ต้องสร้างแยกตามผู้ให้บริการ
05 · จากมุมมองของผู้จัดจำหน่ายข้อมูล
จนถึงตอนนี้เป็นเรื่องของฝั่งที่ฝังแผนที่ เป้าหมายของ MapConductor ไม่ใช่แค่การปลดปล่อยจากการล็อกอินของผู้ขาย แต่ยังรวมถึงการทำให้สามารถตัดสินใจเลือกผู้ขายโดยไม่ขึ้นกับการเลือก SDK แผนที่
จะต้องใช้ SDK เชิงพาณิชย์
ยกเว้นกรณีที่ใช้แผนที่แบบเปิดอย่างสมบูรณ์ ในการใช้งานจริงคุณจะต้องใช้ SDK แผนที่เชิงพาณิชย์บางแห่ง เนื่องจากสัญญาและการจัดซื้อ บางครั้งตัวเลือกอาจมีเพียงอย่างเดียวตั้งแต่แรก MapConductor มีประโยชน์ในสถานการณ์ดังกล่าวเพราะคุณไม่ต้องทิ้งทรัพยากรที่มีอยู่
แยก SDK แผนที่และข้อมูล
ทรัพยากร เช่น ข้อมูลแผนที่ การระบุพิกัดภูมิศาสตร์ และไทล์ ถูกสันนิษฐานว่าจะใช้คู่กับ SDK แผนที่ของผู้ให้บริการที่จัดหาไว้ หากสามารถแยกสองอย่างนี้ออกจากกันได้ สิ่งต่างๆ เช่น การใช้เนื้อหาที่สะสมไว้ใน ArcGIS บนหน้าจอของ SDK แผนที่อื่นก็เป็นไปได้
เฉพาะการระบุพิกัดภูมิศาสตร์ เฉพาะข้อมูล
ผู้ให้บริการที่มีเพียงการระบุพิกัดภูมิศาสตร์หรือข้อมูลเฉพาะทางเท่านั้น มีการใช้งานที่จำกัดมาเพราะไม่มี SDK แผนที่ของตัวเอง หากสามารถแยกออกจากด้านการแสดงผลได้ ก็จะสามารถใช้บนแผนที่ใดก็ได้
06 · จากมุมมองของผู้ให้บริการ SDK แผนที่
เลเยอร์ร่วมอาจดูเหมือนสิ่งที่ทำให้การมีอยู่ของตัวเองจางลงสำหรับฝั่งที่ให้บริการ SDK แผนที่ MapConductor ไม่ได้ออกแบบเช่นนั้น สิ่งที่ทำให้เป็นสามัญคือส่วนที่มีอยู่ในทุกผู้ให้บริการเท่านั้น จุดแข็งของแต่ละบริษัทยังคงแสดงออกไปข้างนอกเหมือนเดิม
ลูกค้าจากภายนอก
เมื่อผู้ให้บริการหลายรายสามารถจัดการได้ในรูปแบบเดียวกัน พวกเขาจะถูกพิจารณาเป็นตัวเลือกจากแอปที่สร้างด้วย SDK ของบริษัทอื่นด้วย การที่อุปสรรคในการเปลี่ยนลดลงนั้น ยังมีผลในทางที่อ่อนแอลงในการรักษาลูกค้าที่มีอยู่ไว้ แต่ในทางกลับกัน เหตุผลในการที่จะถูกเลือกจะกลายเป็น "ราคา ความครอบคลุม และคุณภาพการแสดงผลเอง" ไม่ใช่ "เพราะเปลี่ยนไม่ได้
ไม่ซ่อนจุดแข็ง
สิ่งที่ทำให้เป็นมาตรฐานคือฟังก์ชันพื้นฐานที่มีอยู่ในทุกผู้ให้บริการเท่านั้น หากคุณเรียก getMapViewHolder() ของออบเจ็กต์สถานะ คุณจะได้มุมมองแผนที่เนทีฟและอินสแตนซ์แผนที่กลับมาโดยตรง ดังนั้นฟังก์ชันที่มีเฉพาะผู้ให้บริการนั้นๆ สามารถเขียนได้โดยตรงด้วย API ของแต่ละบริษัท หากเป็น wrapper ที่ปกปิดทุกอย่างอย่างสมบูรณ์ ปัจจัยการแตกต่างจะหายไป แต่เราไม่ได้ทำเช่นนั้น
แข่งขันบนพื้นฐานที่เหมือนกัน
หลังจากที่เบราว์เซอร์จัดทำการใช้งานให้สอดคล้องกันใน HTML5 แล้ว เบราว์เซอร์แต่ละตัวก็เริ่มแข่งขันกันด้วยความเร็วและฟีเจอร์โดยตรง ไม่ใช่การรักษาความเข้ากันได้เอง SDK แผนที่ก็เช่นกัน เมื่อมีการกำหนดอินเทอร์เฟซทั่วไปแล้ว สิ่งที่จะถูกถามคือสามารถวาดได้เร็ว แม่นยำ และครอบคลุมพื้นที่กว้างขวางแค่ไหนบนพื้นฐานนั้น เรามองว่าการทำให้เป็นมาตรฐานไม่ได้หยุดวิวัฒนาการของ SDK แต่ละตัว แต่เป็นการจัดทิศทางของวิวัฒนาการให้สอดคล้องกัน
07 · กรณีที่เหมาะสมและไม่เหมาะสม
- ต้องการมอบประสบการณ์แผนที่เดียวกันบนหลายแพลตฟอร์ม
- ต้องการเก็บความเป็นไปได้ไว้ว่าอาจจะเปลี่ยนผู้ให้บริการในอนาคต
- การแสดงผลแผนที่มาตรฐาน เช่น มาร์กเกอร์ รูปทรง และกล้อง เป็นส่วนหลัก
- จัดการมาร์กเกอร์ตั้งแต่หลายพันไปจนถึงหลายหมื่นรายการ
- ต้องการความสอดคล้องกันในการแสดงผลระยะทางและพื้นที่
- การแสดงผลขั้นสูงเฉพาะของผู้ให้บริการเป็นส่วนสำคัญ (เชดเดอร์ที่กำหนดเอง เลเยอร์เฉพาะผู้ขาย)
- ฟีเจอร์เฉพาะของ SDK เป็นเป้าหมายโดยตรง เช่น การนำทางแบบ turn-by-turn
- 1 แพลตฟอร์ม 1 ผู้ให้บริการ สมบูรณ์ภายในตัวเอง ไม่มีแผนจะเปลี่ยนแปลง
อย่างไรก็ตาม สามารถใช้ร่วมกันได้เพียงบางส่วน เนื่องจากคุณสามารถเข้าถึงอินสแตนซ์แผนที่เนทีฟได้ตลอดเวลา จึงสามารถกำหนดค่าให้เขียนเฉพาะส่วนพิเศษด้วยโค้ดเฉพาะของผู้ให้บริการได้