Arsitektur

Perancangan batas antara aplikasi host dan lapisan skrip Lua.

Daftar isi

Topik ini merancang batas antara aplikasi host Pencatat dan lapisan skrip Lua yang menyertainya. Pembahasan dimulai dari pembagian kepemilikan antara host dan skrip, dilanjutkan dengan kontrak API dua arah, tiga prinsip desain, dan struktur direktori proyek. Diagram batas pada bagian akhir merangkum seluruh keputusan tersebut dalam satu gambar. Setelah topik ini dibaca, setiap berkas proyek memiliki tempat yang jelas, dan aliran panggilan antara host dan skrip sudah tergambar.

Pembagian kepemilikan antara host dan lapisan skrip#

Host Pencatat memiliki segala hal yang memerlukan akses sistem atau kinerja tinggi, sedangkan lapisan skrip memiliki segala hal yang sering berubah menurut selera pengguna. Penyimpanan catatan, I/O berkas, dan jendela aplikasi adalah wilayah host, karena ketiganya berhubungan langsung dengan sistem berkas dan antarmuka aplikasi. Tema tampilan, batas panjang catatan, pola nama berkas, dan label antarmuka adalah wilayah lapisan skrip, karena seluruhnya berupa aturan yang berubah ketika berkas skripnya diubah tanpa kompilasi ulang.

Pembagian ini menentukan tempat setiap perubahan di kemudian hari. Penyesuaian warna tema cukup dilakukan pada berkas data, sedangkan perubahan cara menyimpan catatan tetap menjadi urusan host. Apabila pembagian ini diabaikan, misalnya tema ditanam dalam kode host, pengguna kehilangan kemampuan menyesuaikan tampilan melalui berkas konfigurasi. Pembagian yang sama juga menjelaskan tempat mesin validasi, karena seluruh aturan yang diperiksa mesin memang milik lapisan skrip. Tabel berikut merangkum pembagian tersebut.

AspekDimiliki hostDimiliki lapisan skrip
Penyimpanan catatanmenulis dan membaca berkas catatanmenyediakan pola nama berkas yang sah
Tampilanmerender jendela aplikasimenyediakan nama tema, warna, dan ukuran teks
Batasan masukanmembatasi masukan saat aplikasi berjalanmenyediakan nilai batas panjang catatan
Label antarmukamemasang label pada elemen antarmukamenyediakan teks label

Kontrak API dua arah#

Kontrak API menetapkan fungsi apa saja yang melewati batas beserta parameter dan nilai baliknya. Arah pertama adalah fungsi yang disediakan host kepada skrip, yaitu simpan_catatan(nama, isi) yang menyimpan catatan melalui host dan daftarkan_tema(tema) yang mendaftarkan tema baru beserta warnanya. Kedua fungsi ini didaftarkan host sebelum lapisan skrip dimuat, sehingga skrip melihatnya seperti fungsi Lua biasa. Skrip tidak pernah menulis berkas catatan sendiri, karena seluruh penyimpanan melewati simpan_catatan.

Arah kedua adalah fungsi yang dipanggil host kepada lapisan skrip, yaitu muat_konfigurasi(kandidat) yang mengembalikan konfigurasi final beserta daftar pelanggarannya. Host memanggilnya sekali saat aplikasi dimulai, lalu menggunakan hasilnya untuk menyiapkan tema, batasan, dan label jendela aplikasinya. Kontrak dua arah ini membuat kedua sisi dapat diuji terpisah, karena masing-masing hanya bergantung pada daftar fungsi yang disepakati. Registrasi fungsi host dilakukan pada API C dengan lua_register, sebagaimana diperlihatkan pada potongan berikut. Potongan ini hanya menggambarkan model, karena kompilasinya memerlukan kepala lua.h dan pustaka Lua yang tidak tersedia di lingkungan latihan.

c Contoh: registrasi fungsi host kepada lapisan skrip
// tidak-dijalankan
/* daftarkan fungsi host yang boleh dipanggil lapisan skrip */
lua_register(L, "simpan_catatan", host_simpan_catatan);
lua_register(L, "daftarkan_tema", host_daftarkan_tema);

/* setelah registrasi, host memuat berkas inti lapisan skripnya */
luaL_dofile(L, "mesin.lua");

Fungsi C host_simpan_catatan membaca dua argumen yang dikirim skrip melalui stack, yaitu struktur tumpukan yang menjadi jembatan nilai antara C dan Lua, memeriksa pola nama berkasnya, lalu menulis berkas catatan ke penyimpanan host. Fungsi C host_daftarkan_tema menyimpan pasangan warna yang dikirim skrip ke table tema milik host. Registrasi dilakukan sekali sebelum mesin.lua dimuat, sehingga urutan pemuatan tidak pernah membingungkan skrip dengan kemampuan yang belum ada.

Prinsip desain: data-driven, fail-safe, dan sandbox#

Tiga prinsip mengikat kedua sisi batas. Prinsip pertama adalah data-driven, yakni perilaku yang sering berubah disimpan sebagai table data pada berkas konfigurasi, bukan tertanam dalam kode host. Prinsip ini menempatkan nilai seperti warna tema dan batas panjang catatan pada data, sehingga host tidak perlu dikompilasi ulang setiap preferensi berubah.

Prinsip kedua adalah fail-safe, yakni kegagalan konfigurasi tidak boleh menjatuhkan aplikasi. Setiap kunci bermasalah pada kandidat digantikan nilai bawaannya, dan host selalu menerima konfigurasi final yang lengkap. Aplikasi catatan dengan konfigurasi yang rusak tetap dapat menyimpan catatan, hanya saja tampilannya menggunakan tema bawaan.

Prinsip ketiga adalah sandbox, yakni lapisan skrip berjalan dengan kemampuan terbatas yang dibuka host. Skrip tidak membaca atau menulis berkas sendiri, tidak menyentuh jendela aplikasi secara langsung, dan setiap kemampuan yang digunakan harus melewati fungsi yang didaftarkan host. Batasan ini membuat skrip yang berisi kesalahan tetap tidak merusak penyimpanan catatan milik host.

Struktur direktori dan diagram batas#

Struktur direktori proyek mengikuti pembagian peran pada komposisi komponennya. Keempat berkas proyek berada sejajar tanpa subdirektori, karena jumlahnya masih kecil dan perannya sudah terpisah jelas. Host C tidak berada di dalam pohon direktori ini, karena pada lingkungan latihan sisi host cukup dimodelkan, sehingga keempat berkas Lua menjadi seluruh isi proyek yang dapat dieksekusi.

text Struktur direktori proyek
pencatat/
├── konfigurasi.lua   data konfigurasi dan konten yang dibaca host
├── mesin.lua         inti validasi dan resolusi konfigurasi final
├── demo.lua          demonstrasi pemakaian mesin
└── uji-mesin.lua     test harness beserta kasus uji

Diagram berikut merangkum batas antara host dan lapisan skrip beserta aliran panggilan dua arahnya. Panah ke kanan memperlihatkan host memanggil muat_konfigurasi pada lapisan skrip, sedangkan panah ke kiri memperlihatkan skrip memanggil fungsi host yang sudah didaftarkan.

batas APIAplikasi host Pencatatpenyimpanan catatanI/O berkasjendela aplikasiLapisan skrip Luakonfigurasi.luamesin.luaaturan dan preferensimemanggilmuat_konfigurasimemanggil API hostsimpan_catatan
Batas antara aplikasi host Pencatat dan lapisan skrip Lua beserta aliran panggilan dua arah

Kedua panah pada diagram memperlihatkan kontrak dua arah dari bagian sebelumnya. Batas dijaga tetap tipis, karena hanya fungsi yang disepakati yang melewatinya, dan seluruh perubahan perilaku dikelola pada sisi skrip. Penataan sejajar juga menyederhanakan eksekusi, karena berkas yang memuat berkas lain menemukannya tanpa pengaturan jalur tambahan. Dengan batas semacam ini, keputusan desain seluruh komponen proyek berpegang pada satu gambar yang sama.

Ringkasan#

  • Host memiliki penyimpanan catatan, I/O berkas, dan jendela aplikasi, sedangkan lapisan skrip memiliki aturan dan konfigurasi.
  • Kontrak API berjalan dua arah, yaitu host menyediakan simpan_catatan dan daftarkan_tema kepada skrip, sedangkan host memanggil muat_konfigurasi pada lapisan skrip.
  • Tiga prinsip desain mengikat kedua sisi, yaitu konfigurasi berbasis data, kegagalan yang digantikan nilai bawaan, dan pelaksanaan skrip dalam sandbox.
  • Struktur direktori proyek memisahkan data, inti mesin, demonstrasi, dan pengujian tanpa subdirektori.

Referensi#