Daftar parameter panjang versus daftar variabel status panjang

10

Dalam buku C ++, penulis mengatakan kita tidak lagi membutuhkan fungsi dengan daftar parameter yang panjang karena sebagian besar parameter dapat dire-refored menjadi variabel status dalam sebuah kelas. Di sisi lain, buku pemrograman fungsional mengatakan variabel negara jahat karena menyebabkan efek samping yang menyebabkan bug rentan dan sulit untuk memparalelkan kode. Saya menjadi bingung. Haruskah kode menghindari ketergantungan pada variabel status sebanyak mungkin dengan memindahkan variabel statusnya ke daftar parameter fungsi?

TomCaps
sumber
Apakah buku aslinya mengomentari C ++ sebagai bahasa fungsional?
Martin York

Jawaban:

7

Tergantung jika Anda pemrograman dalam proceduralatau functionalparadigma. Kondisi yang bisa berubah diperlukan untuk yang pertama dan melumpuhkan untuk yang berikutnya. Ini apel dan jeruk. Mereka berdua benar di bailiwicks mereka!

Anda dapat menerapkan penugasan tunggal dan teknik fungsional lainnya ke bahasa prosedural imperatif, keadaan tidak berubah membuat pemrograman bersamaan lebih deterministik, tetapi membuat setiap objek tidak dapat diubah dalam bahasa seperti Java atau C ++ hampir mustahil karena model ingatan mereka tidak mudah mendukung paradigma ini.


sumber
:Terima kasih! Buku << 97 hal yang harus diketahui setiap programmer >> mengatakan kita harus menerapkan prinsip pemrograman fungsional seperti menghindari efek samping. Tidak bisakah kita menerapkan prinsip pemrograman fungsional dalam konteks kode imperatif?
TomCaps
Negara tidak diperlukan untuk pemrograman prosedural. Itu biasa, tetapi tidak diharuskan. Yang umum adalah lebih disebabkan oleh kebiasaan daripada yang lain. Meskipun saya akan mengakui bahwa pasti ada situasi di mana menjaga variabel (negara bagian) di sekitar lebih mudah daripada alternatif (misalnya pemrosesan asinkron).
Marjan Venema
@Marjan apa pun yang memiliki variabel tidak berubah adalah state
@Jarrod: Sekarang Anda membuat saya bingung. Membaca jawaban Anda lagi, saya melihat saya melewatkan "Mutable" di "Mutable state diperlukan". Tetapi komentar Anda tampaknya mengatakan bahwa memiliki variabel yang tidak dapat diubah adalah keadaan. Jangan paham. Bisa jadi karena saya tidak terbiasa bergaul dan berpikir tentang bisa berubah dan tidak berubah dalam istilah ini. Adakah referensi untuk saya baca?
Marjan Venema
@ Marsjanen: Ya, memiliki variabel yang tidak dapat diubah adalah status. Perbedaan dalam penanganan keadaan antara pemrograman prosedural dan fungsional bukan pada proc.prog. memiliki negara, dan fungsional tidak - lebih tepatnya, perbedaannya adalah proc itu. prog. memiliki status yang bisa berubah , sedangkan status selalu tidak berubah dalam pemrograman fungsional (murni). Lihat misalnya en.wikipedia.org/wiki/Purely_functional , yang menjelaskan bahwa bahasa yang murni fungsional menghindari pembaruan.
sleske
1

Jika saya memahami pertanyaan Anda dengan benar, Anda mempertanyakan kondisi apa yang memenuhi syarat baik penggunaan parameter atau variabel kelas / anggota / bidang / dll? Saya berasumsi Anda merujuk pada suatu metode, dan bukan suatu fungsi. Jika ini tentang C ++ secara khusus, saya sarankan untuk memindahkan pertanyaan Anda ke stack overflow.

Daftar parameter panjang mungkin merupakan tanda bahwa Anda mungkin perlu mengubah metode Anda menjadi satu set yang lebih granular. Secara umum, menggunakan parameter akan membuat kode Anda lebih longgar digabungkan. Saya tidak yakin apakah ini benar untuk sebagian besar bahasa OO modern lagi, tetapi pembuatan objek bisa mahal, terutama jika ada banyak variabel kelas yang terlibat; jadi, jika variabel kelas Anda objek dan direferensikan sering dalam suatu program, maka mereka dapat dibenarkan sebagai variabel kelas.

Juga:

  • Bisakah metode lain memanfaatkan variabel kelas? Jika ya, maka pertimbangkan untuk menggunakan variabel kelas.
  • Apakah metode Anda publik? Jika publik, gunakan parameter.
  • Dapatkah daftar parameter Anda secara tepat direpresentasikan sebagai hash / map / array / collection / list / etc? Jika demikian, anggap itu pilihan.
  • Apakah metode Anda statis? Jika ya, gunakan parameter.
Travis J
sumber
0

Tidak, variabel keadaan per se tidak menyebabkan efek samping.

Memanggil metode setter (pada struktur data yang terlihat di tempat lain) adalah efek samping.

Anda dapat memiliki struktur data untuk menyembunyikan daftar parameter yang panjang dan menghindari efek samping jika Anda membuatnya sesuai. Ini adalah contoh kecil (di Jawa, belum diuji):

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

Tentu saja, konstruktor ManyParams masih akan memiliki daftar parameter panjang dengan cara ini. Tapi itu tersembunyi.

Ingo
sumber