Apakah boleh menggunakan metode fungsi lambda dalam perangkat lunak bisnis?

26

Saya perhatikan posting di sini menunjukkan penggunaan fungsi delegasi \ lambda untuk memecahkan lubang di ide tengah tanpa banyak pengulangan: http://www.markhneedham.com/blog/2009/04/04/functional-c -the-hole-in-the-middle-pattern /

Masalahnya tampaknya bahwa pengembang junior dan yang lainnya tidak perlu memahami apa konsep fungsi pointer \ delegate \ lambda, yang tampaknya membuat pembacaan (dan mungkin debugging) kode lebih sulit.

Haruskah kita menghindari atau sangat membatasi penggunaan alat ini dalam menulis perangkat lunak bisnis, terutama di tim kecil atau toko pengembang tunggal?

Atau apakah dapat diterima untuk menggunakannya dengan komentar yang sesuai dan berharap bahwa ketika saya tidak lagi tahu bahwa pengembang berikutnya akan memahami atau mempelajari tentang fungsi lambda?

Peter Smith
sumber
10
Di Ruby, lambdas (seperti diri mereka sendiri, dan dalam bentuk balok) adalah konsep bahasa inti. Mereka digunakan di mana-mana, dari Arraykelas hingga ORM yang rumit. Yah, tidak ada yang mengeluh.
whitequark
18
Saya memposting ini sebagai komentar daripada jawaban karena itu hanya variasi pada apa yang orang lain katakan: Saya akan teruskan dan menggunakannya. Berlawanan dengan apa yang dikatakan kebanyakan orang, saya tidak akan repot-repot menambahkan komentar di semua tempat hanya untuk menjelaskan bahwa Anda menggunakan fitur bahasa yang sejujurnya agak sederhana. Komentar harus menjelaskan logika bisnis dan mengapa pilihan implementasi dibuat, bukan mendidik pengembang tentang fitur bahasa yang sudah mereka kenal. Jika Anda tahu junior devs Anda tidak mengerti lambda, duduklah dan jelaskan konsepnya.
Mitch Lindgren
3
Bagaimana jika seorang programmer Junior ingin menggunakan lambdas tetapi khawatir bahwa peretas C ++ lama tidak akan mendapatkannya? Kedengarannya tidak seperti lambdas, atau ... algoritma harus digunakan dalam perangkat lunak bisnis.
Pekerjaan
10
Jika karena sikap ini, kami masih akan membuat api dengan menggosok dua monitor monokrom.
sbi
3
Petunjuk penting untuk fungsi dipikirkan dalam mata kuliah universitas C. Dan Anda juga memiliki delegasi dalam C #, jadi hampir semua pengembang harus cukup nyaman dengan fungsi sebagai tipe data / parameter. Tulis kode yang paling bisa Anda tulis.
Daniel Iankov

Jawaban:

23

Masalahnya tampaknya bahwa pengembang junior dan yang lainnya tidak perlu memahami apa konsep fungsi pointer \ delegate \ lambda

Sejujurnya, itu masalah mereka. Untuk itulah Anda memastikan mereka memiliki pelatihan. Anda tidak dapat tidak menggunakan teknik yang baik hanya karena beberapa orang mungkin tidak memahaminya. Jika mereka butuh bantuan, mereka bisa datang bertanya kepada penulis. Lebih penting lagi, fungsi lambda menjadi fitur bahasa yang sangat umum.

Haruskah kita tidak menggunakan warisan karena beberapa orang tidak memahaminya? Sial, beberapa orang menolak untuk percaya pada sains atau kuman atau hal-hal konyol apa pun. Anda harus dapat melanjutkan dan tidak membiarkan kemungkinan orang lain tidak dapat mengikuti Anda menghentikan Anda dari menulis kode terbaik yang Anda bisa. Fungsi Lambda adalah fitur hebat dan sangat membantu dalam penulisan kode, dan Anda harus mengambil semua bantuan yang bisa Anda dapatkan.

Pengembang harus tahu cara menggunakan bahasa yang mereka miliki atau tidak. Jika mereka tidak melakukannya, maka pecat mereka dan temukan seseorang yang melakukannya, atau latih mereka begitu mereka melakukannya.

DeadMG
sumber
11
Yah, saya akan melarang warisan sebelum melarang lambdas ...;)
fredoverflow
49

Ya, gunakan itu.

Saya adalah pengembang junior, dan saya tahu / mengerti lambdas (dan konsep lain yang Anda sebutkan). Tidak ada yang bisa kulihat untuk mencegah pengembang junior mempelajari semua konsep itu dalam waktu yang sangat singkat. Junior mungkin tidak memiliki jumlah pengalaman / keahlian yang sama ketika datang ke banyak gotcha pengembangan perangkat lunak, namun, konsep seperti lambdas dapat dengan mudah dipahami oleh siapa saja dengan pemahaman dasar pemrograman dan koneksi internet. Juga, tampaknya aneh bahwa Anda memilih lambdas sebagai contoh, mengingat jika Anda menggunakan C # kemungkinan Anda bahkan tidak memiliki banyak kesempatan untuk mulai belajar lambdas daripada pengembang junior (mereka baru diperkenalkan pada 2008, jika saya ingat dengan benar).

Singkatnya, tidak perlu membodohi kode Anda untuk kami orang baru. Kami akan baik-baik saja, dan akan benar-benar memilih untuk bekerja pada implementasi sebaik mungkin yang dapat Anda lakukan. :)

Morgan Herlocker
sumber
4
Kecuali kita, neophytes lambat. Dalam hal ini tolong bodohkan kode untuk kami, atau ... jangan mempekerjakan kami sejak awal.
Pekerjaan
19
@ Pekerjaan - Saya pikir kita hanya harus jujur ​​dan mengatakan bahwa jika seorang junior tidak dapat memahami sintaks lambda yang diberikan beberapa hari (bersikap sangat murah hati), maka itu mungkin benar-benar masalah perekrutan.
Morgan Herlocker
2
Arahkan neophytes ke stackoverflow.com/questions/2167360/ ... ... ini adalah jawaban yang sangat baik untuk pertanyaan saya pada saat itu dan membantu loncatan pemahaman saya tentang Linq dan lambdas.
IAbstract
20

Jika mereka solusi yang masuk akal untuk masalah Anda maka Anda harus menggunakannya.

Jangan membatasi diri secara artifisial - Anda cenderung berakhir dengan kode berkualitas buruk yang sulit dipertahankan.

Jika kode ditulis dengan baik dengan komentar yang sesuai maka mereka yang mengikuti harus dapat belajar dari Anda.

ChrisF
sumber
13

Letakkan tautan ke dokumentasi msdn di komentar di bagian atas blok yang menggunakannya lalu lanjutkan. Anda tidak perlu takut untuk menggunakan teknologi baru / kompleks, bagian dari pekerjaan pengembang untuk mempelajari hal-hal yang tidak mereka ketahui.

Tom Squires
sumber
14
apakah tautan benar-benar diperlukan?
Morgan Herlocker
3
Apakah Anda benar-benar memasang tautan setiap kali Anda menggunakan lambda?
Federico klez Culloca
kompleksitas adalah musuh ...
Robert S Ciaccio
11

Masalahnya tampaknya bahwa pengembang junior dan yang lainnya tidak perlu memahami apa konsep fungsi pointer \ delegate \ lambda

Maka mereka perlu mempelajarinya. Periode.

  1. Ini bukan sudut esoterik dari C #. Anda harus memahaminya untuk memanfaatkan banyak perpustakaan .Net.
  2. Ini bukan topik bahasa esoterik, secara umum. Hampir setiap bahasa dalam penggunaan populer saat ini memiliki beberapa penunjuk fungsi, dan sebagian besar memiliki (atau segera mendapatkan, dalam kasus Java dan C ++) penutupan.

Hanya perlu beberapa menit untuk menjelaskannya kepada mereka. Itu tidak sulit.

Lumpur
sumber
5

Anda harus menggunakan alat yang tepat untuk pekerjaan itu. Jika ada cara yang lebih sederhana dan jelas untuk menyelesaikan masalah yang ada, gunakan itu. Jika Anda perlu masuk ke sesuatu yang menurut Anda mungkin menjadi topik lanjutan untuk pengelola masa depan, tandai dengan jelas dan sertakan penunjuk ke dokumentasi yang menjelaskan teknik tersebut.

konsep fungsi pointer \ delegate \ lambda fungsi

Perlu dicatat bahwa itu adalah tiga hal yang berbeda.

Caleb
sumber
3

Dua skenario yang mungkin:

a) Rekan kerja Anda (atau kebanyakan dari mereka) cukup terampil. Mereka perlu belajar lambda, mereka bagian dari bahasa, dan kadang-kadang, mereka adalah alat yang tepat untuk pekerjaan itu. Jadi ketika mereka memang alat terbaik, tentu saja, gunakan mereka. Hindari menggunakannya karena Anda baru saja mempelajarinya sendiri dan Anda semua bersemangat dan menganggapnya sebagai peluru perak.

b) Anda, kolega (atau kebanyakan dari mereka) tidak kompeten. Tidak ada cara mereka akan sepenuhnya memahami lambdas, penutupan, pointer fungsi, atau konsep meta-coding serupa lainnya. Mereka mungkin sedang berjuang untuk memahami petunjuk, referensi, dan rekursi. Dalam situasi ini, yang terbaik yang dapat Anda lakukan adalah menggigit peluru, menggunakan solusi canggung, bebas-lambda, lambda, dan memoles cv Anda, karena Anda harus mencari pekerjaan.

tammmer
sumber
2

Di sinilah konsistensi dapat banyak membantu. Jika Anda menggunakannya secara konsisten dengan gaya yang sama, dll., Maka pembaca hanya perlu mempelajarinya sekali, dan kemudian mereka mengenalinya di mana-mana.

Juga, mungkin membantu untuk menjadi eksplisit, setidaknya pada awalnya. Misalnya, keduanya setara:

doSomething(() => someMethod());

doSomething(someMethod);

private void doSomething(Action someAction) { ... }
private void someMethod() { ... }

... tetapi dalam kasus pertama, jelas, jika Anda tahu sintaks lambda, apa yang kami lakukan. Bahkan jika Anda tidak tahu sintaks lambda, sudah jelas Anda melihat sesuatu yang baru, dan Anda harus mencarinya. Dalam kasus kedua, sepertinya Anda melewati variabel.

Saya tahu bahwa ReSharper mendorong Anda untuk mengubahnya ke kasus kedua, tapi saya ingin tahu apakah itu selalu merupakan ide yang bagus. Dalam kasus kedua, Anda harus tahu bahwa doSomethingmembutuhkan Action.

Scott Whitlock
sumber
1
Saya akan menggunakan yang kedua, saya melihat bahwa beberapa Metod dilewatkan, dan untuk menentukan apa beberapa Metod adalah, saya akan klik kanan, dan pergi ke def'n. lihat itu fungsi / metode dan itu harus masuk akal untuk setiap programmer pada saat itu.
CaffGeek
@Chad - itu seperti mengatakan "Saya akan menggunakan kata yang lebih pendek sehingga pembaca cenderung tidak tahu, dan saya akan berasumsi mereka membacanya di Kindle, jadi mereka harus mengarahkan kursor ke kata itu, sehingga terlihat di kamus untuk mereka, daripada hanya menggunakan kata yang lebih deskriptif, saya cukup yakin mereka tahu. Dan mengacaukan orang-orang tanpa Kindles. " Saya tidak setuju dengan logika itu. Kode dibaca lebih dari yang tertulis.
Scott Whitlock
"Dalam kasus kedua, kamu harus tahu itu doSomethingperlu Action." Dan bagaimana bisa berbeda dari harus tahu yang functionWithNameThatDoesNotSpecifyItsArgumentTypesmembutuhkan ObjectOfSomeType? Faktanya, dalam bahasa-bahasa di mana fungsi adalah objek kelas satu, itu tidak berbeda.
JAB
1

Saya sering menemukan konsep-konsep tertentu sulit dipahami karena mereka hanya dijelaskan secara abstrak, daripada menjumpainya dalam situasi praktis dan kehidupan nyata. Jadi saya pribadi akan setuju untuk menemui konstruksi seperti itu.

Skenario utama yang dapat saya pikirkan untuk menghindari melakukan ini adalah jika pemrograman bukan tugas utama orang lain. Sebagai contoh, seorang administrator sistem, atau seorang ahli bioinformatika yang menghabiskan sebagian besar waktunya untuk melakukan percobaan yang sebenarnya ("tikus lab").

Andrew Grimm
sumber
1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

Sekarang, mungkin di sini kita memanggil DoAction karena tubuhnya terlalu panjang untuk masuk ke dalam lambda itu sendiri. Dalam hal itu, menggunakan metode ekstensi ForEach () ke Daftar tidak memberi kita banyak manfaat dibandingkan menggunakan loop foreach biasa, meskipun itu menghemat beberapa baris kode, saya kira. Tetapi dalam kasus khusus ini, menggunakan ForEach () mungkin telah menidurkan kami untuk melakukan sesuatu yang sebenarnya mengambil lebih banyak kode, dan menyebabkan beberapa pukulan tambahan pada stack daripada yang diperlukan; Argumen yang Berlalu Tidak Perlu Menjadi Lambda Sama sekali

Anda cukup memanggil DoAction seperti ini:

itemsList.ForEach(DoAction);

Tidak ada Lambda sama sekali. Kuncinya adalah untuk mengingat apa yang sebenarnya Anda lewati ketika Anda membuat ekspresi lambda: sesuatu cara pintas untuk mendefinisikan contoh delegasi. Ya, itu juga memiliki manfaat seperti penutupan, tetapi orang tidak boleh kehilangan situs apa yang diharapkan metode panggilan. Dalam hal ini, itu mengharapkan alamat ke metode yang cocok dengan tanda tangan Tindakan. DoAction sudah merupakan metode seperti itu, jadi membuat lambda hanya menambahkan panggilan metode yang sama sekali tidak perlu.

dhillon manpreet
sumber
-1

IMHO, menulis pada tingkat teknis apa pun yang lebih tinggi dari tingkat teknis tim, salah. Jika anggota tim Anda tidak benar-benar nyaman dengan ekspresi dan fungsi lambda dan mereka tidak punya waktu untuk mempelajarinya (mereka harus menghabiskan waktu mereka di database penyempurnaan kinerja, bekerja di UI lebih banyak, membuat komponen, dll.), Maka saya sangat sarankan untuk tidak menggunakannya . Namun, jika mereka mau belajar dan memiliki waktu luang, atau mereka sudah tahu pengetahuannya, lalu mengapa tidak?

Saya pikir ini adalah masalah relatif yang harus dinilai per tim dan tingkat teknis tim. Dan ini bukan hanya kasus fungsi lambda. Ini adalah kasus pengetahuan teknis. Jadi, misalnya setiap kali tim tahu tentang pola penyimpanan memiliki keahlian untuk menerapkan dan memeliharanya, maka mari kita lakukan. Tetapi jika tidak, cukup cari cara lain. Jika mereka tahu tentang OO JavaScript, maka biarkan mereka membuat kode yang lebih skalabel dalam JavaScript. Tetapi jika tidak, cukup kembali ke JavaScript prosedural.

Saeed Neamati
sumber