Saya tahu bahwa banyak dari kita memelihara perpustakaan pribadi kecil kita sendiri dengan alat dan utilitas yang sering kita gunakan.
Saya sudah memiliki milik saya sejak saya berusia 16 tahun sehingga telah tumbuh dengan ukuran yang cukup besar. Beberapa hal yang saya tulis sejak itu telah ditambahkan ke kerangka kerja. Saya menulis implementasi pohon ekspresi kecil saya sendiri untuk digunakan dengan algoritma genetika jauh sebelum LINQ, yang saya sangat suka dan bangga pada saat itu - tentu saja ini sangat tidak berguna sekarang. Namun baru-baru ini saya telah melaluinya dan meningkatkan ke .NET 4.0 dan kembali tertarik.
Jadi saya ingin tahu untuk apa Anda menggunakan perpustakaan Anda. Mungkin kita bisa mendapatkan ide-ide keren untuk potongan kecil yang berguna dan membagikannya di antara kita sendiri.
Jadi pertanyaan saya adalah:
- Apakah Anda memiliki perpustakaan utilitas lain-lain?
- Bagian mana yang paling Anda banggakan dan mengapa?
Berikan contoh kode jika Anda mau :-)
sumber
Jawaban:
Tidak.
Saya telah melihat beberapa efek mimpi buruk dari selusin pengembang semua menambahkan perpustakaan gaya "util.h" kecil mereka sendiri untuk proyek-proyek, dan mengubahnya menjadi kekacauan besar penamaan fungsi dan perilaku yang tidak konsisten. Sama seperti PHP. Jadi untuk alasan itu saya menghindari melakukannya.
Saya menghindari keharusan melakukan itu dengan menggunakan lingkungan pemrograman yang memberi saya hampir semua alat dan pustaka yang saya butuhkan di muka setiap kali memungkinkan, seperti C # dan python.
sumber
SmartFormat
Utilitas favorit saya adalah yang saya tulis - pembangun string / formatter sederhana yang membuatnya sangat mudah untuk mengubah data menjadi string dengan tata bahasa yang benar.
Sebagai contoh, kebanyakan programmer membangun teks dari template:
"There are {0} items remaining"
tapi mengarah ini untuk kesalahan tata bahasa:"There are 1 items remaining"
.Jadi, SmartFormat memungkinkan Anda menulis:
"There {0:is|are} {0} item{0:|s} remaining"
.Anda hanya mengganti
String.Format(...)
denganSmart.Format(...)
dan hanya itu!The SmartFormat kode open source: http://github.com/scottrippey/SmartFormat/wiki
sumber
java.text.MessageFormat
.MessageFormat
memilikiChoiceFormat
kelas yang memungkinkan sintaksis yang hampir sama! Sebuah contoh dari dokumentasi:"There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}."
. Terima kasih telah menyebutkan referensi ini."{Count:<0?negative|=5?five|>50&<100?large|other}"
. Ini memiliki refleksi (yaitu"There are {items.Length} items"
, dapat memformat item array dan rentang waktu. Plus, ia memiliki model plugin untuk mendukung lebih banyak fitur.Smart.Format("There are {0.Count} files: {0:'{}'|, |, and }.", files);
akan menghasilkan"There are 3 files: 'a.txt', 'b.txt', and 'c.txt'."
. Saya tidak bisa membayangkan "lokalisasi" tanpanya.K Combinator (C #, Scala)
Saya menggunakan K combinator di Ruby cukup sering, sebagian besar dalam lipatan ketika operasi lipat dilakukan melalui efek samping daripada nilai kembali, seperti dalam contoh ini:
Ini menghitung seberapa sering setiap elemen muncul di
some_collection
. Sayangnya, itu tidak benar-benar berfungsi, karena blok harus mengembalikan nilai baru akumulator pada setiap iterasi, tetapi dalam tugas Ruby mengevaluasi nilai yang diberikan.Jadi, Anda harus mengembalikan nilai akumulator baru seperti ini:
Tetapi saya menemukan urutan eksplisit yang jelek dalam gaya fungsional-ish ini menggunakan lipatan. Combinator K (dipanggil
Object#tap
dalam Ruby) untuk menyelamatkan:Saya sudah melewatkannya beberapa kali di C # (kebanyakan karena beberapa alasan mutator pengumpul seperti
List.Add
returnvoid
bukanthis
) dan Scala, jadi saya membawa sekitar ini:dan di Scala:
Fungsi Identitas (Ruby)
Sesuatu yang saya lewatkan di Ruby, adalah cara yang disebut dengan baik untuk mengakses fungsi identitas. Haskell menyediakan fungsi identitas dengan nama
id
, Scala dengan namaidentity
. Ini memungkinkan seseorang untuk menulis kode seperti:Setara dalam Ruby adalah
Tidak benar-benar menggulung lidah, bukan?
Cara mengatasinya adalah
ForEach (.NET)
Metode lain yang sangat hilang dalam C #:
sumber
Action
efek samping menyiratkan yang bertentangan dengan prinsip-prinsip desain LINQ.IEnumerable
Ekstensi ditambahkan untuk LINQ.ForEach
bukan operator LINQ. Mengapa pembatasan yang hanya berlaku untuk operator LINQ berlakuForEach
, yang bukan operator LINQ? Dan mengapa efek samping dilarangIEnumerable.ForEach
tetapi diizinkanList.ForEach
? Juga, mengapa efek samping dilarangIEnumerable.ForEach
tetapi diizinkanforeach
?List<T>
memilikiForEach
adalah wajar mengingat bahwa itu adalah tipe yang bisa berubah.Saya memiliki Java Type Converter. Ini memiliki tanda tangan publik
dan itu yang terbaik untuk mengkonversi nilai sumber ke tipe tujuan. Ini pada dasarnya memungkinkan Anda melakukan pengetikan dinamis dalam bahasa yang diketik secara statis :-)
Ini sebenarnya berguna dengan tipe numerik kotak. Betapa menjengkelkannya sehingga Anda tidak bisa menempatkan
Integer
ke tempatLong
yang diharapkan? Tidak masalah, cukup konversikan saja. Atau bagaimana jika fungsi Anda mengharapkandouble
, tetapi Anda harusnull
meletakkannya di sana? Kaboom, sebuah NPE. Tapi laluiconvert
, dan Anda mendapatkanNaN
.sumber
NaN
dukungan.NaN
sangat bagus. Sayang sekali tidak ada yang namanya bilangan bulat. Saya telah menggunakanInteger.MIN_VALUE
sebagai konvensi. Ini biasanya "cukup aneh" untuk diperhatikan, tidak seperti nilai default 0. Saya tidak tahu mengapa auto (un) tinju tidak memperlakukan(Double) null
sebagaiNaN
. Ini solusi yang jelas, IMHO.Dari kode misc yang saya tulis, sebagian besar hal-hal baik ada di CCAN sekarang, sedangkan sisanya saya cenderung menemukan versi yang lebih baik dalam proyek open source yang ada. Saya mendapati diri saya semakin sedikit menulis kode "misc" untuk keperluan umum, lebih suka menulis varian khusus aplikasi dari kode semacam itu, atau menulis modul tujuan umum yang dapat saya rilis sendiri.
C
Inilah fungsi dan typedef yang saya gunakan lebih dari sekali. Untuk aplikasi yang memerlukan pengaturan waktu, sulit untuk mengalahkan milidetik dalam hal kesederhanaan:
Dan lebih banyak fungsi C lain-lain yang cenderung saya gunakan berulang-ulang (dan berulang):
Haskell
nub :: (Eq a) => [a] -> [a]
Fungsi Haskell adalah O (n²) karena, berdasarkan jenisnya tanda tangan, itu hanya diperbolehkan untuk menguji apakah dua elemen sama. Alternatif O (n log n) sederhana adalahmap head . group . sort
, tetapi membutuhkan memaksa seluruh daftar input sebelum menghasilkan output, sedangkannub
dapat mulai memproduksi output segera. Berikut ini adalah alternatif O (n log n) untuknub
mengumpulkan item yang sudah terlihat diData.Set
:Dalam Haskell, saya menggunakan alternatif
sequence
,mapM
,forM
,replicateM
, danfilterM
. Tindakan ini masing-masing menghasilkan daftar, tetapi daftar tidak dapat digunakan sampai tindakan selesai secara keseluruhan (jika Anda menggunakan monad ketat seperti IO). Alternatif membangun daftar secara terbalik daripada membentuk menara pemukul, yang saya temukan melalui pembandingan menjadi lebih cepat, setidaknya dengan GHC.Catatan:
sequence_
,mapM_
,forM_
, danreplicateM_
fungsi masih pilihan yang lebih baik jika Anda tidak tertarik dalam daftar hasil.sumber
Saya akhirnya menerapkan split / join ala Perl dalam bahasa yang tidak memilikinya.
Saya juga telah mengimplementasikan ulang atoi dan itoa di C lebih dari yang saya ingin pikirkan (embedded system junk).
sumber
Tidak.
Saya melakukan sebagian besar pengkodean saya di Jawa, dan praktik terbaik adalah menggunakan kembali "utils" dari perpustakaan Apache Commons dan proyek serupa.
Jika Anda objektif tentang hal itu, ada beberapa kasus di mana koleksi "utils" Anda sendiri akan menjadi peningkatan signifikan pada apa yang telah dilakukan orang lain. Dan jika itu bukan perbaikan, maka perpustakaan utilitas Anda mungkin buang-buang waktu pengembangan, dan gangguan / beban bagi pengelola masa depan.
sumber
Saya memiliki beberapa manipulasi tanggal yang saya lakukan menggunakan Java, kemudian saya mulai menggunakan JodaTime karena saya telah mendengar hal-hal baik tentang itu dan itu akan dimasukkan dalam Java 7 (tidak yakin apakah ini masih terjadi, tetapi bahkan jika itu masih tetap tidak layak menggunakannya imho).
Itu mengubah kelas garis 50+ menjadi satu baris dengan sekitar tiga panggilan metode dirantai.
Bagi yang penasaran itu termasuk mendapatkan tanggal untuk setiap hari dari n minggu yang lalu: misalnya angka penjualan untuk Senin 10 minggu lalu dll dll).
Dan ini bagian dari itu
sumber
Saya selalu memiliki
utils
paket semacam itu, bahkan di Jawa, tetapi koleksi utils PHP saya adalah yang paling sering digunakan. Ada begitu banyak perpustakaan yang bagus di Jawa, sehingga saya sudah memiliki perpustakaan yang disertakan dalam proyek ini atau perlu mendesain beberapa utilitas yang hilang sendiri. Perpustakaan PHP cenderung melakukan terlalu banyak bagi saya untuk ingin memasukkannya ke dalam proyek saya.Saya suka fungsi ini untuk PHP, disempurnakan dengan bantuan di StackOverflow ...
Ini mirip dengan BeanUtils Apache untuk Java, dan saya menggunakannya untuk tujuan yang sama, memberikan elemen-elemen form dalam bahasa template satu kunci yang bisa mendapatkan / menetapkan nilai bersarang dalam array sumber:
Tentu saja, menjadi PHP, saya ingin menjaga metode sebagai ringan mungkin sehingga tidak cukup sebagai featureful sebagai BeanUtils
;)
sumber
Pustaka standar Scala tidak memiliki beberapa fungsi tingkat tinggi yang paling umum digunakan.
Dua fungsi yang paling saya butuhkan:
sumber
Saat ini, tidak. Saya punya satu ketika saya melakukan C, tapi sekarang saya melakukan Java, tidak lagi masuk akal, mengingat semua lib standar yang tersedia, ditambah semua barang yang berasal dari proyek Apache.
Salah satu hal yang berguna dalam lib C saya adalah implementasi mesin negara terbatas cepat & kotor, yang memungkinkan definisi mesin negara terbatas dengan hanya dua string dan array string. Ini dapat digunakan untuk memeriksa string terhadap aturan (misalnya "panjangnya harus 4,6 karakter, pertama huruf, angka istirahat"), tetapi ketersediaan regex membuat hal itu benar-benar sia-sia.
sumber
Saya tidak dapat menulis UI desktop sekarang tanpa dialog dinamis , berdasarkan eksekusi diferensial . Ini adalah hack yang saya temukan sekitar tahun 1985, dan saya telah mengimplementasikannya kembali dalam berbagai bahasa lebih dari yang saya ingat.
sumber
Saya menemukan saya sedang menulis banyak kode yang sama di Django, Lakukan hal yang umum ini, kemudian hal yang umum ini, dan akhirnya hal yang umum. Pada dasarnya dapatkan satu atau lebih item dari database, atau simpan hasil formulir.
Jika Masing-masing dari hal-hal ini terjadi hanya sekali dalam tampilan, maka saya dapat menggunakan pandangan umum Django. Sayangnya, itu tidak benar-benar komposer, dan saya perlu melakukan beberapa hal secara berurutan.
Jadi saya pergi dan menulis pustaka pandangan yang bahkan lebih umum, yang berfungsi dengan pertama-tama membuat daftar tindakan dari queryset yang relevan (atau apa pun), dan kemudian membungkus daftar itu menjadi sebuah tampilan.
Saya masih harus menulis beberapa pandangan dengan tangan, tetapi ini biasanya cukup kompleks sehingga tidak banyak yang dapat digunakan kembali di dalamnya. Semua pelat ketel hanya mendarat di tempat lain, baik dengan tampilan generik, atau sebagai dekorator tampilan (seringkali tampilan generik yang didekorasi). Ini biasanya berakhir menjadi sekitar 10% dari penangan yang saya tulis, karena beberapa penangan generik dapat melakukan segalanya.
sumber
Ya, tetapi hanya untuk struktur idiom khusus domain (seperti wadah khusus objek game).
Karena ini adalah alat utilitas sederhana dan kompleks, saya tidak bangga dengan apa pun di sana. Aku pengguna yang unik saat ini, jadi tidak ada yang bisa dibanggakan.
sumber
Sortir tidak langsung C ++, berdasarkan STL
sort
dan templat functor.Kebutuhan untuk penyortiran tidak langsung (di mana output yang diinginkan adalah indeks permutasi yang akan dihasilkan dari penyortiran data, tetapi bukan data yang disortir sendiri) muncul berkali-kali di sejumlah proyek. Saya selalu bertanya-tanya mengapa STL tidak menyediakan implementasi untuk itu.
Lain adalah vektor siklik C ++, di mana indeks positif dan negatif adalah modulo dengan ukuran vektor (sehingga nilai integer adalah indeks yang valid untuk vektor).
sumber
Saya menulis paket utilitas kecil ketika saya melakukan pengembangan Java di Comp saya. Kelas sci di sekolah menengah. Saya paling bangga dengan generator nomor acak saya.
Alat peraga untuk inspirasi saya.
sumber