Sintaks pemrograman favorit saya: "pipelining"
(herecomesthemoon.net)- Pipelining adalah fitur penting dalam bahasa pemrograman yang meningkatkan keterbacaan dan kemudahan pemeliharaan kode
- Ini memungkinkan aliran data diekspresikan secara alami dari kiri ke kanan, dari atas ke bawah
- Dalam bahasa seperti Rust, pipelining memperjelas alur kode dan meningkatkan produktivitas pengembang melalui fitur pelengkapan otomatis IDE
- Diterapkan di berbagai bahasa seperti Haskell, Elm, dan SQL, serta builder pattern atau method chaining juga dapat dianggap sebagai bentuk pipelining
- Memberi dampak positif pada keterbacaan, kemudahan penyuntingan, dukungan IDE, dan alat kontrol versi (diff, blame)
- Dibanding cara fungsi bersarang, ini memungkinkan penulisan kode yang lebih ringkas dan jelas sehingga lebih menguntungkan untuk kolaborasi dan pemeliharaan
Sintaks pemrograman favorit saya, pipelining
Apa itu pipelining?
- Fitur yang memungkinkan satu argumen dihilangkan dari daftar parameter dengan meneruskan nilai sebelumnya
- Meningkatkan keterbacaan kode dan memudahkan penambahan komentar
- Gaya sintaks yang menerapkan rangkaian proses berurutan dengan berpusat pada data
- Dalam kode bergaya fungsional, sering digunakan dalam bentuk method chaining seperti
.map().filter().collect() - Di Rust, kode berikut adalah contoh yang representatif:
data.iter() .filter(|w| w.alive) .map(|w| w.id) .collect() - Sebaliknya, jika semua fungsi disarangkan, strukturnya menjadi seperti berikut sehingga harus dibaca dari dalam ke luar:
collect(map(filter(iter(data), |w| w.alive), |w| w.id))
Mengapa pipelining itu bagus?
-
1. Keterbacaan dan kemudahan pemeliharaan
- Mudah dibaca dari atas ke bawah → aliran data yang sama dengan urutan manusia membaca
- Mudah menambahkan komentar di setiap baris
- Ringkas dan jelas tanpa tumpukan tanda kurung pada baris panjang
-
2. Kemudahan penyuntingan
- Fungsi baru seperti
.map()dapat ditambahkan dengan mudah dalam satu baris di tengah alur - Di
git diffataugit blame, pelacakan perubahan juga terlihat lebih rapi
- Fungsi baru seperti
-
3. Dukungan IDE / LSP
- Cocok dengan struktur yang menampilkan daftar pelengkapan otomatis saat tombol
.ditekan - Menguntungkan untuk analisis statis yang membutuhkan tipe diketahui dengan jelas
- Agar fitur ini bekerja dengan baik, bahasa tersebut harus berbasis tipe statis (mis. Rust, TypeScript)
- Cocok dengan struktur yang menampilkan daftar pelengkapan otomatis saat tombol
SQL juga punya pipelining?
- Ada usulan untuk mengubah kueri SELECT bertingkat di SQL menjadi gaya pipeline
- Contoh:
FROM customer |> LEFT OUTER JOIN orders ON ... |> AGGREGATE COUNT(...) GROUP BY ... |> ORDER BY ... - Dibanding SQL yang ada saat ini, alurnya lebih jelas dan keterbacaannya meningkat
- Kekurangan: saat klausa
SELECTdipindahkan ke atas, tipe hasil bisa lebih sulit dipahami → bisa diatasi
Keterkaitan dengan Builder pattern
- Bentuk seperti
Builder::new().option().option().build()di Rust adalah struktur pipeline yang khas - Dengan menyusun pengaturan opsional sebagai method, pelacakan kode dan pengelolaan perubahan menjadi mudah
Peningkatan pipelining di Haskell
- Operator Haskell seperti
$,&,|>memungkinkan penggunaan pipeline alih-alih komposisi fungsi - Perbandingan sebelum dan sesudah:
-- 기존 checkPalindromes content = unlines $ map (show . isPalindrome) $ lines $ map toLower content -- 개선 checkPalindromes content = content & map toLower & lines & map (show . isPalindrome) & unlines
Kelebihan pipelining di Rust
- Method chaining, inferensi tipe, dan ekstensibilitas struktural berbasis trait semuanya sangat selaras dengan pipelining
- Rust memiliki struktur yang terasa seperti hanya mengambil keunggulan dari sintaks fungsional dan berorientasi objek, sehingga penggunaan pipelining terasa paling alami
Kesimpulan
- Pipelining bukan sekadar sintaks, melainkan fitur inti yang memengaruhi alur kode, kemudahan penyuntingan, hingga kolaborasi
- Dibanding bentuk bersarang seperti
f(g(h(x))), strukturx |> h |> g |> flebih ramah bagi manusia - Di bawah aturan sederhana “satu pekerjaan per baris”, pipelining adalah cara terbaik untuk mengekspresikan alur yang alami
“Setiap potongan pipa menerima data utama dan menjalankan satu tugas. Pada akhirnya, jika diberi nama yang jelas, itulah struktur kode yang paling ideal.”
11 komentar
https://github.com/tc39/proposal-pipeline-operator
Mirip dengan konteks bahwa untuk teks apa pun
baris baru dan indentasi penting untuk keterbacaan.
LINQ yang terbaik!
Gleam juga mendukung ini, jadi penulisan kodenya bisa dilakukan dengan cukup rapi.
Ngomong-ngomong, mungkin karena ada blok kode di isi utama, tampilannya juga muncul dengan layout desktop di mobile.
Kalau dipikir-pikir,
elmjuga bisa ya.Untuk data dalam jumlah kecil dan kode sederhana seperti contoh di atas, menurut saya tampilannya cukup bagus dan tidak ada masalah.
Tetapi ketika sedikit demi sedikit kode masuk ke dalam
map()... ada kecenderungan membuat kode makin lama makin gemuk,dan meskipun pengaruhnya bergantung pada bahasa atau library implementasinya, ketika jumlah datanya membesar, dibandingkan memprosesnya sambil sekadar menumpuk atau memanipulasi data di struktur data, cara ini bisa dengan mudah menjadi ribuan kali lebih lambat.
Lalu ada satu lagi alasan baru kenapa saya jadi tidak menyukainya: waktu saya membaca artikel ini di ponsel, lebarnya tetap dipertahankan seperti di PC, sehingga ukuran hurufnya jadi sekecil kotoran mata dan artikelnya sangat sulit dibaca T.T
Pada dasarnya saya memang tidak menyukainya, dan saya tidak sengaja berusaha menulis dengan cara seperti itu.
Tolong juga dukung
js|> mohon mohon|>sangat indahIni sintaks yang paling saya benci
Kalau stack trace-nya saja sudah sedikit kusut, debugging jadi yang paling parah
Benar banget
Komentar Hacker News
Penulis menyebutnya "pipelining", tetapi menurut saya istilah yang tepat adalah "method chaining"
Secara pribadi saya mendukung agar set fitur bahasa tetap kecil dan cepat mencapai set fitur yang matang
|>milik ElixirMakro Lisp memberikan solusi umum yang dapat menentukan urutan rantai pemanggilan, bukan hanya operator koleksi yang dirangkai
Saya mempelajari istilah ini sebagai antarmuka fasih. Pipelining adalah hal yang berbeda
Operator pipeline adalah semacam penerapan parsial, yang memungkinkan pengikatan beberapa argumen untuk membuat fungsi baru lalu meneruskan keluarannya ke fungsi lain
Pengguna tidyverse di R sudah menggunakannya
Pipelining sulit untuk di-debug. Penanganan pengecualian juga sulit sehingga cabang perlu ditambahkan ke dalam pipeline
Sintaks SQL terlalu rumit tanpa perlu
|>kurang ekspresif dan menambah gangguan visualPenulis mengklaim bahwa "semantik mengalahkan sintaks", tetapi justru berfokus pada preferensi sintaks
effect-ts memungkinkan Anda menulis baik pipeline maupun kode imperatif