Desain pipeline
- Pilihan para senior di dalam tim.
- Keunggulan Pipeline adalah memungkinkan
VSeedmengontrol alur eksekusi setiap jenis chart secara independen. Dengan desain yang baik, implementasi setiap jenis chart dapat terlepas satu sama lain sekaligus tetap dapat digunakan ulang secara lokal, dan setiap jenis chart dapat mengontrol detail apa pun secara presisi. Inilah yang dibawa Pipeline, dan inilah yang paling dibutuhkanVSeed. - Dibandingkan dengan itu, kekurangan pola Pipeline dapat dihindari saat desain. Selama ukuran setiap
Pipediperkecil dan dependensi antar-Pipedikurangi, kekurangan pola ini dapat sangat dihindari. - Setelah empat generasi desain dan optimasi Pipeline, di VSeed ini sudah menjadi versi kelima. Lubang yang perlu dilewati sudah pernah dilewati.
Apa itu Pipeline?
Pipeline adalah abstraksi dan praktik engineering yang kuat. Ia memecah tugas kompleks menjadi serangkaian langkah kecil yang saling terhubung dan dijalankan berurutan. Filosofi desain dan implementasinya sangat dipengaruhi oleh ide inti functional programming (FP).
Keunggulan Pipeline:
- Modularitas: implementasi atomik, lalu menyusun atom menjadi modul.
- Otomatisasi: cukup menentukan input, output dapat diperoleh otomatis tanpa perlu memperhatikan implementasi internal.
- Pure function: input tertentu pasti menghasilkan output yang diharapkan, ini adalah ciri pure function.
- Paralelisme: secara alami mendukung concurrency.
- Reusability: setiap modul dapat digunakan ulang.
- Testability: secara teori setiap modul independen dan dapat diuji terpisah untuk memastikan kualitas.
- Traceability: input dan output setiap tahap jelas, sehingga mudah menemukan masalah dan memantau status proses.
- Cacheability: secara teori output satu
Pipedapat dicache secara terpisah, sehingga menghindari komputasi berulang dan meningkatkan efisiensi.
Kekurangan Pipeline:
- Dependensi berurutan: ketika antar-
Pipememiliki dependensi urutan, biaya pemahaman meningkat, karena tahap sebelumnya harus dipahami sebelum tahap berikutnya. Pemahaman menyeluruh atas proses diperlukan untuk cepat menemukan masalah. - Biaya debugging: karena Pipeline dijalankan berurutan, kegagalan satu tahap menyebabkan seluruh Pipeline gagal. Ini membuat debugging lebih sulit karena tahap yang gagal harus ditemukan dan diperbaiki.
- Masalah performa: karena Pipeline dijalankan berurutan, output setiap tahap harus menunggu tahap sebelumnya selesai. Ini dapat menimbulkan masalah performa, terutama ketika salah satu tahap berjalan lama.
- Functional programming: perlu memahami konsep baru, sehingga ada biaya belajar. Karena itu prinsip desain dan detail implementasi perlu ditulis dalam contribution guide agar developer lain dapat memahami dan menggunakannya.
Bagaimana menulis Pipeline di VSeed?
Pola Komposisi Pipe
Beberapa Pipe fungsional dapat disusun menjadi Pipe fungsional yang lebih besar, atau menjadi Pipeline yang lebih kompleks.
Di VSeed, satu Pipeline lengkap berkorespondensi dengan implementasi satu jenis chart. Dengan mendeskripsikan hubungan komposisi antar-Pipe, kita dapat membuat berbagai jenis chart. Pada tahap komposisi Pipeline, detail implementasi setiap pipe tidak perlu diperhatikan.
Perbedaan Komposisi
Contoh:
Line chart dan area chart dapat menggunakan ulang banyak fungsi, seperti label, legend, dan axis. Namun line chart tidak memiliki style mark area, sehingga pipeline menyelesaikan perbedaan ini melalui komposisi Pipe fungsional, tanpa satu pun pernyataan if.
Pola Adapter Pipe
Selain pola komposisi, pembuatan Pipe sering kali memiliki kondisi tertentu. Untuk memenuhi komposisi Pipe di kondisi yang berbeda, VSeed banyak menggunakan adapter Pipe.
Kondisi Komposisi
Contoh:
Line chart memiliki kemampuan pivot. Tanpa pivot, chart dirender oleh VChart dan menghasilkan VChart spec. Dengan pivot, chart dirender oleh VTable dan menghasilkan VTable spec.
Pivot line chart pada dasarnya perlu menggunakan ulang fungsi dasar line chart, seperti label, legend, dan axis. Karena itu diperlukan pola adapter untuk mengadaptasi Pipe line chart menjadi Pipe pivot line chart.
Singkatnya, setiap adapter adalah satu if else. Kondisi yang tersembunyi di dalam pipe dapat diabstraksikan menjadi adapter, sehingga if else dipindahkan ke level paling atas. Hasilnya adalah Pipeline dengan dependensi yang lebih jelas dan biaya maintenance yang lebih rendah.
Unit paling dasar Pipeline: Pipe fungsional
VSeed mengharapkan semua jenis chart menggunakan fungsi sebagai unit paling dasar, menyediakan kemampuan reuse dan ekstensi yang cukup. Pipeline satu jenis chart dibangun dari bawah ke atas. Setiap Pipe fungsional sebaiknya menjadi modul yang independen, dapat diuji, dan dapat digunakan ulang.
Hal terpenting adalah mengabstraksikan perbedaan fungsi menjadi Pipe yang berbeda (yaitu menulis lebih sedikit if else), bukan menulis satu Pipe besar yang mencakup semuanya.
Pipe Fungsional yang Datar
Contoh:
Bar chart, column chart, line chart, area chart, dan scatter chart semuanya memiliki sumbu X dan Y. Mereka mirip tetapi sedikit berbeda. Jika menulis satu axes pipe besar yang mencakup semuanya, bentuknya mungkin seperti ini:
Logika di atas memilih sub-pipe fungsional yang berbeda berdasarkan jenis chart di dalam satu Pipe fungsional. Ini menimbulkan dua masalah:
- Bagaimana fungsi yang berulang di
xy,yx, danyydigunakan ulang? Banyak subfungsi yang mirip tetapi berbeda harus dipanggil berulang di berbagai sub-pipefungsional. Dependensi mudah menjadi rumit dan meningkatkan biaya maintenance. - Saat mengubah fungsi line chart atau area chart, bar chart mudah terlewat karena logika sudah bercabang. Karena itu perbedaan harus dipertimbangkan saat mengimplementasikan fungsi baru.
Ketika ukuran seluruh spec pipeline berkembang hingga ratusan pipe, cara penulisan seperti ini akan membawa biaya maintenance yang sangat tinggi. Karena itu kita membutuhkan cara yang lebih sederhana untuk memilih sub-pipe fungsional yang berbeda berdasarkan jenis chart.
Melanjutkan contoh di atas, perbedaan diabstraksikan menjadi Pipe yang berbeda, dikemas pada granularitas fungsi yang lebih halus, lalu dikomposisikan langsung di dalam pipeline. Dengan demikian masalah di atas dapat dihindari.
Pada contoh di atas, tidak ada axes pipe yang diimplementasikan. Sebaliknya, xBandAxis, yBandAxis, xLinearAxis, dan yLinearAxis langsung dikomposisikan. Ini menghindari masalah pemilihan sub-pipe fungsional berbeda di dalam axes pipe berdasarkan jenis chart, menghindari branching berdasarkan jenis chart, dan mengurangi penggunaan if else.
Semua percabangan perbedaan jenis chart sebaiknya berada di atas Pipeline. Kecuali benar-benar terpaksa, Pipeline tidak perlu memilih sub-pipe fungsional yang berbeda berdasarkan jenis chart.
Cara komposisi ini sesuai dengan filosofi desain VSeed: menggunakan komposisi Pipe fungsional yang lebih datar, bukan menggunakan kondisi if else untuk membuat satu Pipe fungsional besar yang mencakup semuanya.