18 poin oleh GN⁺ 2025-04-22 | 11 komentar | Bagikan ke WhatsApp
  • 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 diff atau git blame, pelacakan perubahan juga terlihat lebih rapi
  • 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)

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 SELECT dipindahkan 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))), struktur x |> h |> g |> f lebih 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

 
progdesigner 2025-04-23

Mirip dengan konteks bahwa untuk teks apa pun
baris baru dan indentasi penting untuk keterbacaan.

 
forgotdonkey456 2025-04-23

LINQ yang terbaik!

 
bus710 2025-04-23

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.

 
bus710 2025-04-23

Kalau dipikir-pikir, elm juga bisa ya.

 
galadbran 2025-04-22

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.

 
bichi 2025-04-22

Tolong juga dukung js |> mohon mohon

 
secret3056 2025-04-22

|> sangat indah

 
howudoin 2025-04-22

Ini sintaks yang paling saya benci
Kalau stack trace-nya saja sudah sedikit kusut, debugging jadi yang paling parah

 
cosine20 2025-04-25

Benar banget

 
GN⁺ 2025-04-22
Komentar Hacker News
  • Penulis menyebutnya "pipelining", tetapi menurut saya istilah yang tepat adalah "method chaining"

    • Bandingkan dengan pipeline sederhana di Bash: setiap komponen berjalan secara paralel dan hasil perantara di-streaming
    • Di Ruby, setiap baris diproses secara berurutan dan array lengkap dibuat di antara tiap tahap
    • Ini membuat debugging lebih sulit, jadi belakangan saya menulis kode yang lebih eksplisit
    • Kode yang eksplisit memang terlihat kurang rapi, tetapi lebih mudah untuk memeriksa status perantara
  • Secara pribadi saya mendukung agar set fitur bahasa tetap kecil dan cepat mencapai set fitur yang matang

    • Namun, saya berharap semua bahasa mengadopsi sintaks |> milik Elixir
  • Makro Lisp memberikan solusi umum yang dapat menentukan urutan rantai pemanggilan, bukan hanya operator koleksi yang dirangkai

    • Misalnya, (foo (bar (baz x))) dapat ditulis sebagai (-> x baz bar foo)
    • Ini juga bisa menangani kasus dengan argumen tambahan
    • Untuk detail lebih lanjut, lihat panduan threading macro di Clojure
  • 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

    • Penerapan parsial sangat berguna untuk menulis program, dan suatu hari nanti bahasa-bahasa (non-Haskell) akan menggunakannya sebagai dasar komposisi program
  • Pengguna tidyverse di R sudah menggunakannya

  • Pipelining sulit untuk di-debug. Penanganan pengecualian juga sulit sehingga cabang perlu ditambahkan ke dalam pipeline

    • Pipeline hanya berguna saat memprogram happy path
  • Sintaks SQL terlalu rumit tanpa perlu

    • SQL sebenarnya sudah merupakan bahasa operator, tetapi memiliki banyak batasan karena alasan historis
    • Jika sintaks baru diizinkan, ini bisa ditulis dengan jauh lebih sederhana
    • Sintaks |> kurang ekspresif dan menambah gangguan visual
  • Penulis mengklaim bahwa "semantik mengalahkan sintaks", tetapi justru berfokus pada preferensi sintaks

    • Pipelining makin sulit di-debug seiring rantainya makin panjang
    • Ia kritis terhadap Python tetapi tidak memberikan alasan yang spesifik
    • Definisi "pipelining" tidak dijelaskan dengan jelas
  • effect-ts memungkinkan Anda menulis baik pipeline maupun kode imperatif

    • Menyediakan dokumentasi tentang penulisan pipeline dan penggunaan generator
    • Sebagian besar komunitas akhirnya lebih menyukai generator bergaya imperatif
    • Tampaknya lebih mudah untuk debugging dan pemeliharaan