Setara dengan prinsip SOLID untuk pemrograman fungsional

36

Saya telah menemukan prinsip - prinsip SOLID cukup berguna ketika berpikir tentang desain berorientasi objek.

Apakah ada seperangkat prinsip agnostik bahasa-yang serupa / setara yang dirancang untuk pemrograman fungsional?

mikera
sumber
12
FWIW, ini dibahas secara singkat pada SO setahun yang lalu
StuartLC
Video ini dan juga slide-slide ini menyajikan prinsip-prinsip SOLID yang diterapkan pada Pemrograman Fungsional. Mereka berdua menggunakan bahasa Clojure sebagai contoh, tetapi prinsip-prinsip itu berlaku dalam bahasa lain.
Mascip

Jawaban:

14

Agak sulit untuk menemukan yang setara tetapi saya dapat mencoba:

  • S (SRP) dalam fungsi FP membuat SELALU output yang sama untuk argumen yang sama ini disebut transparansi referensial
  • O (OCP) di FP ada konsep yang disebut tipe data aljabar, lihat bagaimana hubungannya dengan hierarki Kelas dan masalah apa yang keduanya coba pecahkan 1
  • L (LSP) Prinsip Pengganti Liskov adalah Contravariance 2
  • D (DIP) dalam pemrograman fungsional umum mencapai abstraksi melalui komposisi fungsi, ada juga mekanisme lain dengan bantuan teori kategori (misalnya monoid atau functor), untuk "Ketergantungan Injeksi" 3
Andreas Secheert
sumber
21
Saya masih berpikir tentang bagaimana Anda dapatkan dari Prinsip Tanggung Jawab Tunggal untuk transparansi referensial . Keduanya tidak berhubungan. SRP adalah tentang fungsi yang memiliki satu tujuan. Ini mungkin atau mungkin tidak transparan secara referensi, berkenaan dengan itu.
Goran Jovic
3
Ah, salahku - aku mengerti sekarang. Ini adalah padanan dalam arti menjadi prinsip dan membentuk akronim yang sama, bukan dalam arti makna hal yang sama atau serupa. Maaf untuk downvote!
Goran Jovic
1
Benar itulah cara yang dimaksudkan untuk membacanya. Saya mencoba menggambarkan pemetaan istilah-istilah tersebut dalam konteks fp.
AndreasScheinert
Man I hate bahwa Anda tidak dapat mengedit komentar, pada kenyataannya hal-hal HARUS berarti setidaknya sesuatu yang serupa.
AndreasScheinert
Mungkin fungsi tingkat tinggi dapat memberikan semacam injeksi ketergantungan: Anda menyuntikkan fungsi konkret sebagai parameter ke fungsi generik (tingkat tinggi).
Giorgio
45

SOLID ternyata juga merupakan ide bagus untuk ranah fungsional / imperatif juga.

SRP - 'Only do one thing' diambil dari pemrograman imperatif sejak awal. Memiliki fungsi yang kecil dan fokus adalah baik.

OCP - Memungkinkan Anda untuk mengubah perilaku tanpa mengubah kode adalah baik. Pemrograman fungsional menggunakan fungsi urutan yang lebih tinggi daripada warisan, tetapi prinsipnya tetap berlaku.

LSP - Mematuhi kontrak antarmuka sama baiknya dalam pemrograman fungsional seperti pada berorientasi objek. Jika fungsi sortir mengambil pembanding, maka Anda akan mengharapkan '0 sama dengan, kurang dari memberikan hasil negatif, lebih besar dari perilaku hasil positif'.

ISP - Sebagian besar bahasa fungsional masih memiliki struct. Menentukan set data terkecil yang diperlukan oleh suatu fungsi masih merupakan praktik yang baik. Membutuhkan antarmuka paling spesifik untuk data (mengapa menggunakan Daftar int ketika Pencacahan T juga berfungsi?) Masih merupakan praktik yang baik.

DIP - Menentukan parameter untuk suatu fungsi (atau fungsi urutan yang lebih tinggi untuk mengambilnya) daripada pengkodean keras fungsi untuk mendapatkan beberapa nilai sama baiknya dalam pemrograman fungsional seperti dalam berorientasi objek.

Dan bahkan ketika melakukan pemrograman berorientasi objek, banyak dari prinsip-prinsip ini berlaku untuk desain metode dalam objek juga.

Telastyn
sumber