Saya baru saja menemukan fungsi ini di proyek tempat saya bekerja:
-- Just returns the text unchanged.
-- Note: <text> may be nil, function must return nil in that case!
function Widget:wtr(text)
return text
end
Sayang sekali, coder tidak lagi bekerja di perusahaan. Mengapa seseorang membuat fungsi yang tidak melakukan apa-apa, tetapi mengembalikan parameter yang dipanggilnya?
Apakah ada kegunaan untuk fungsi seperti itu, tidak ditentukan untuk contoh ini, tetapi secara keseluruhan dalam hal apa pun?
Disebabkan oleh
function aFunction(parameter)
return parameter
end
Berakhir di
aFunction(parameter) == parameter
Mengapa saya menulis sesuatu seperti
aFunction(parameter) == whatIWantToCheck
dari pada
parameter == whatIWantToCheck
?
functions
parameters
lua
method-chaining
Sempie
sumber
sumber
this
.int getParam(int param) { //DO NOTHING return param; }
Dari perspektif metode rantai itu adalah panggilan yang benar-benar berlebihan dan tidak perlu karena Anda dapat meninggalkan fungsi OP dari rantai metode dan itu tidak akan membuat perbedaan tunggal.new Foo()->method();
bukan sintaks yang valid, dan konstruk likefunction with($what) { return $what; }; with(new Foo())->method();
digunakan sebagai solusinya.Jawaban:
Pertanyaan Anda seperti menanyakan apa gunanya angka nol jika setiap kali Anda menambahkannya ke sesuatu, Anda mendapatkan nilai yang sama kembali. Fungsi identitas seperti nol untuk fungsi. Agak tidak berguna dengan sendirinya, tetapi kadang-kadang berguna sebagai bagian dari ekspresi menggunakan fungsi tingkat tinggi, di mana Anda dapat mengambil fungsi sebagai parameter atau mengembalikannya sebagai hasilnya. Itu sebabnya sebagian besar bahasa pemrograman fungsional memiliki
id
atauidentity
di perpustakaan standar mereka.Dengan kata lain, itu membuat fungsi default yang berguna. Sama seperti Anda mungkin ingin menetapkan
offset = 0
sebagai integer default, meskipun itu membuat offset tidak melakukan apa pun, mungkin berguna untuk dapat ditetapkanfilterFunction = identity
sebagai fungsi default, meskipun itu membuat filter tidak melakukan apa pun.sumber
filter
tingkat tinggi.filter
Fungsi orde pertama memiliki tipe[a] -> [a]
,.OrderBy(x => x)
Tentu. Bayangkan API eksternal yang memungkinkan Anda mengambil hal-hal dari tempat yang benar-benar Anda butuhkan, tetapi Anda harus menentukan kriteria filter dan output formatters untuk setiap permintaan, bahkan jika Anda menginginkan semua hasil dan ingin mendapatkannya persis seperti yang disimpan.
Maka Anda harus menciptakan fungsi "terima segalanya" yang sepele dan "kembali tidak berubah" yang sepele untuk mendapatkan data.
wtr
adalah pseudo-formatter yang sepele. Jika Anda sering menggunakan API itu, akan sangat berguna untuk memiliki fungsi pseudo-helper ini di sekitar daripada harus membuat fungsi anonim setiap kali Anda menanyakan sesuatu. (Anda mungkin mempertimbangkan untuk menyebutnyaidentity
daripadawtr
agar segera jelas itu tidak melakukan apa-apa.)sumber
null
sebagai argumen, Anda menggunakan fungsi filter kosong yang memfilter dengan 'tidak ada' untuk membuat program berhenti mengeluh.WHERE
klausa? Secara longgar itu adalah masalah gula sintaksis. Pada dasarnya tidak adanyaWHERE
klausa persis sama seperti jika Anda memilikiWHERE
klausa yang berjalan terus dan memungkinkan semuanya. Fakta bahwa perancang SQL membiarkan Anda tidak menentukanWHERE
klausa, alih-alih memaksa Anda meletakkan satu klausa, bahkan ketika klausa menerima semuanya, adalah gula sintaksis yang kurang lebih, dan mereka baru saja memberi Anda opsi itu untuk kenyamanan sederhana. ..Bukankah itu hanya polimorfisme?
Dari pengalaman saya dengan Qt
tr()
danwtr()
metode seharusnya digunakan (di sana, di Qt ) dalam pelokalanWidget
teks.Jadi, dengan kembali teks tidak berubah metode ini hanya mengatakan:
Widget does no localization (translation of the text) by default. Override this function to enable your own logic
.sumber
Kasus yang sangat umum untuk ini adalah 'fungsionalitas yang ditambahkan nanti'. Jadi programmer berpikir bahwa mungkin ada beberapa perubahan pada fungsi itu nanti. Karena Anda mengaksesnya sebagai fungsi dan bukan sebagai parameter itu sendiri, Anda dapat dengan mudah mengubahnya secara global. Katakanlah Anda memiliki indeks dengan:
dan karena indeks Anda mulai dari 0, ini tidak masalah. Anda kemudian mengubah komponen di tempat lain, komponen ini membutuhkan Anda untuk menerjemahkan indeks Anda mulai dari 1. Anda harus menambahkan ratusan indeks +1 di mana-mana dalam kode Anda. Tetapi dengan metode seperti ini, cukup katakan:
dan kamu baik-baik saja. Fungsi seperti ini dapat dengan cepat mengarah pada rekayasa berlebihan tetapi pada beberapa titik mereka banyak masuk akal!
sumber
Fungsi rintisan seperti ini adalah umum dalam situasi jenis-warisan. Kelas dasar mungkin tidak berguna, tetapi kelas turunan mungkin melakukan berbagai hal dengan input. Mendeklarasikan fungsi rintisan di kelas dasar memungkinkan semua kelas turunan memiliki fungsi nama itu, dan kelas turunan individu untuk menimpanya dengan sesuatu yang lebih rumit dan berguna.
sumber
Satu skenario tambahan mirip dengan penggunaan properti python dan C #, tetapi dalam bahasa yang tidak memiliki fitur.
Secara umum, Anda dapat mendeklarasikan sesuatu hanya sebagai anggota kelas; katakanlah, 'namai' sebagai string. Ini berarti Anda mengaksesnya seperti ini:
Kemudian, Anda memutuskan bahwa nama tersebut benar-benar harus bergantung pada apa yang ada di objek. Jadi itu harus benar-benar berfungsi. Ups! Bahkan tanpa argumen, itu berarti semua kode yang mengaksesnya sekarang harus diubah
Tetapi jika Anda memiliki banyak contoh panggilan ini, kemungkinan tidak ada yang salah dengan itu cukup rendah - di suatu tempat perubahan ini tidak akan dilakukan, program akan macet ketika Anda sampai ke titik itu, dll.
Properti di C # / Python memungkinkan Anda untuk menggantikan fungsi dalam untuk apa yang dulunya atribut, sementara masih memungkinkan untuk diakses seperti atribut yaitu tanpa perubahan. Anda bahkan tidak perlu merencanakan sebelumnya.
Jika bahasa Anda tidak memiliki itu, Anda harus merencanakan ke depan, tetapi Anda masih bisa mendukungnya seperti yang dilakukan orang sebelumnya dengan menjadikannya fungsi dari awal yang tidak melakukan apa-apa. Pada awalnya, itu tidak akan melakukan sesuatu yang menarik, dan sepertinya itu harus dihapus, dan banyak fungsi jenis ini tidak pernah berubah. Tetapi kemudian, jika Anda menyadari bahwa benar-benar setiap kali Anda menelepon
Widget.wtr
Anda perlu menghapus beberapa karakter khusus, itu bukan masalah besar - itu sudah berfungsi, Anda hanya menambahkan itu dan Anda selesai.TL; DR Ini hanya bisa menjadi programmer yang bijaksana merencanakan ke depan untuk perubahan di masa depan.
sumber
print data
. Kemudian, Anda menyadari bahwa semua string harus menjadi huruf besar - Anda harus mencari setiap cetakan dalam program Anda dan mengubahnya menjadiprint data.upper()
. Tetapi jika Anda memilikidef cdata(data): return data
dan di mana-mana mengatakanprint cdata(data)
, maka Anda hanya mengubahdef cdata(data): return data.upper()
dan itu satu-satunya perubahan.Bukan tidak berguna, sebenarnya ini bisa sangat berguna, karena membuat kode Anda lebih seragam dan fleksibel.
Katakan, misalnya, bahwa Anda memiliki daftar orang dan dropdown untuk dipilih pengguna jika kami ingin melihat "semua" atau hanya mereka yang "pria" atau "wanita".
Anda dapat menangani "semua" sebagai kasus khusus, dalam hal ini Anda akan memerlukan tambahan jika dan untuk memeriksa kasus ini secara eksplisit, atau Anda dapat memiliki fungsi filter yang hanya mengembalikan parameternya (mis. Memungkinkan semuanya untuk dilewati), ditugaskan untuk digunakan untuk kasus "semua".
sumber
Filter
kelas atau antarmuka denganMaleFilter
danFemaleFilter
subclass, dan kode Anda memerlukan beberapa filter, filter yang tidak melakukan apa pun (mengembalikan parameternya tidak berubah) adalah cara Anda menanganiAll
. Fungsi tidak pernah melakukan apa pun, tetapi dapat diganti dengan yang tidak.