Lewati ke isi

Pengembangan Skrip / Perencanaan dan Organisasi Kode

Kumpulan Skrip, Skrip, dan fungsi harus diorganisasikan dengan logika tertentu, bukan sekadar menumpuk kode secara sembarangan. Penataan Kumpulan Skrip dan Skrip yang wajar bermanfaat untuk pemeliharaan kode dan efisiensi operasional sistem.

1. Membagi Kumpulan Skrip dan Skrip secara wajar berdasarkan kegunaan dan jenis

Secara umum, disarankan untuk memilih cara-cara pengorganisasian kode berikut:

  • Buat Kumpulan Skrip terpisah untuk Skrip pemrosesan bisnis berdasarkan industri, proyek, organisasi, misalnya: eShop, IoT, monitor, sales, marketing, dll.
  • Jika ukuran kode terlalu besar, bagi Skrip yang jarang digunakan dan Skrip yang sering digunakan berdasarkan frekuensi penggunaan, misalnya prediction, advanced_prediction

2. Memanggil Fungsi dalam Skrip Lain

Skrip dapat dibagi ke dalam Skrip atau Kumpulan Skrip yang berbeda berdasarkan berbagai kebutuhan seperti fungsi, kegunaan, dan lain-lain; kode dalam Skrip yang berbeda dapat saling memanggil. Ketika perlu memanggil fungsi dalam Skrip lain, cukup import Skrip yang bersangkutan.

Saat mengimpor Skrip lain, harus mengikuti cara penulisan yang tetap:

Python
1
2
3
4
5
6
# import <ID Kumpulan Skrip>__<ID Skrip>
import demo__script

# atau gunakan alias untuk mempersingkat
# import <ID Kumpulan Skrip>__<ID Skrip> as alias
import demo__script as script

Di editor Skrip, Anda dapat mengarahkan kursor ke ikon tanda tanya di bilah sisi kiri untuk langsung menyalin pernyataan terkait

Jika perlu mengekspor Kumpulan Skrip, maka Skrip lain yang menjadi dependensi dalam Kumpulan Skrip ini juga perlu diekspor bersama. Jika tidak, Kumpulan Skrip yang diekspor tidak akan benar-benar berjalan karena kekurangan fungsi!

Skrip atau Kumpulan Skrip bukanlah modul Python, dan sebenarnya tidak dapat diimpor dengan import

Tetapi DataFlux Func secara internal menerapkan mekanisme pemuatan dinamis dan mengizinkan penggunaan pernyataan import untuk memuat kode dinamis. Oleh karena itu, penulisan berikut semuanya salah.

Python
1
2
3
4
5
6
# Penulisan salah 1: Mengimpor Kumpulan Skrip sebagai modul
import demo

# Penulisan salah 2: Mengimpor Skrip sebagai modul
import demo.script
from demo import script

Selain itu, saat mengimpor Skrip, perhatikan agar tidak terjadi referensi melingkar, seperti:

Python
1
2
3
4
5
6
7
8
# Skrip script2 dalam Kumpulan Skrip demo
import demo__script2

# Skrip script3 dalam Kumpulan Skrip demo
import demo__script3

# Skrip script1 dalam Kumpulan Skrip demo
import demo__script1

Perhatian, ketika mengedit beberapa Skrip secara bersamaan, jika saat ini Anda mengimpor Skrip lain, Skrip yang dirujuk sebenarnya akan dieksekusi menggunakan versi yang telah dipublikasikan, dan sistem tidak akan pernah mengimpor versi draf!

3. Ukuran Kode dan Rantai Ketergantungan pada Satu Skrip

Karena ketika DataFlux Func menjalankan Skrip, ia menggunakan pemuatan dinamis untuk mengeksekusi Skrip yang diperlukan. Jika salah satu Skrip mengimpor Skrip lain, Skrip yang diimpor juga akan dimuat secara dinamis.

Oleh karena itu, jika ada beberapa fungsi dalam sebuah Skrip yang dipanggil dengan sangat sering, pertimbangkan untuk mengekstraknya menjadi Skrip terpisah untuk mengurangi beban pemuatan. Disarankan agar ukuran satu Skrip dibatasi tidak lebih dari 1000 baris.

Selain itu, hindari juga rantai ketergantungan yang terlalu panjang, karena dapat menyebabkan pemborosan kinerja yang tidak perlu. Contoh:

  • Skrip 1 bergantung pada Skrip 2
  • Skrip 2 bergantung pada Skrip 3
  • Skrip 3 bergantung pada Skrip 4
  • Skrip 4 bergantung pada Skrip 5
  • ...

Modul bawaan Python dan modul pihak ketiga tidak terpengaruh oleh batasan ini

4. Kasus Tanpa Pembagian Skrip

Meskipun di atas telah disebutkan perencanaan Skrip yang wajar dan cara pemanggilan antar Skrip, dalam beberapa situasi tertentu (misalnya ketika fungsi publik yang benar-benar digunakan sangat sedikit dan sederhana), Anda dapat mempertimbangkan untuk tidak membagi Skrip dan menempatkan semua kode dalam satu Skrip yang sama.

Dengan cara ini, meskipun kode menjadi sedikit redundan, cara ini juga memberikan beberapa manfaat tambahan:

  • Satu Skrip saja sudah dapat berjalan, mengurangi beban pemuatan
  • Tidak akan terpengaruh oleh perubahan fungsi publik
  • Tidak perlu mempertimbangkan ketergantungan saat mengekspor Skrip

Silakan pilih cara yang paling wajar untuk mengorganisasikan Skrip sesuai dengan situasi aktual

5. Penyingkatan Referensi Antar Skrip dalam Kumpulan Skrip yang Sama

Ditambahkan pada versi 1.1.0rc51

Dalam Kumpulan Skrip yang sama, referensi antar Skrip dapat ditulis tanpa menyertakan bagian ID Kumpulan Skrip (yaitu hanya menulis bagian yang diawali dengan __).

Hal ini memudahkan saat Kumpulan Skrip dikloning; setelah ID Kumpulan Skrip diubah, fungsi-fungsi internal tetap dapat saling merujuk dengan benar.

Contoh:

Python
1
2
3
4
# Skrip: demo__utils

def echo(msg):
    return msg
Python
1
2
3
4
5
6
7
# Skrip: demo__test

# Setara dengan import demo__utils as utils
import __utils as utils

def my_func(msg):
    return utils.echo(msg)

6. Hindari Enkapsulasi Berlebihan

Python adalah bahasa pemrograman multi-paradigma; kita dapat menggunakan pemrograman prosedural yang sederhana, dan juga dapat menggunakan pemrograman berorientasi objek.

Namun, di DataFlux Func, demi kemudahan debugging, disarankan untuk menulis kode dengan gaya pemrograman yang cenderung prosedural dan menghindari enkapsulasi yang berlebihan.

Misalnya, fungsi yang sama dapat diimplementasikan dengan 2 cara yang berbeda:

Python
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import requests

# Prosedural
def query_some_api(url, params):
    r = requests.get(url, params)
    return r.json()

# Berorientasi objek
class APIQuery(object):
    def __init__(self, url):
        self.url = url

    def do(self, params):
        r = requests.get(self.url, params)
        return r.json()

def test_api_query(url, params):
    api_query = APIQuery(url)
    api_query.do(params)

Pada contoh di atas, meskipun keduanya dapat mengimplementasikan fungsi yang sama, karena query_some_api(...) adalah fungsi yang dapat dipanggil secara langsung, di editor Anda dapat memilih fungsi ini lalu langsung mengisi parameter untuk menjalankannya.

Sedangkan jika ingin men-debug dan menjalankan metode do(...) dari kelas APIQuery, Anda harus membuat instance objek terlebih dahulu sebelum dapat memanggilnya, sehingga Anda perlu menulis fungsi pengujian terpisah test_api_query(...) untuk memanggilnya.

Metode mana yang digunakan, silakan pilih sesuai dengan situasi aktual.