Saya sering berhadapan dengan kelas pembantu atau kelas pemanfaatan di Jawa atau bahasa apa pun. Jadi saya bertanya pada diri saya sendiri apakah ini semacam Pola Anti dan keberadaan kelas-kelas semacam ini hanyalah kekurangan dalam desain dan arsitektur Perangkat Lunak.
Seringkali kelas-kelas ini dibatasi hanya dengan menggunakan metode statis, yang melakukan banyak hal. Tetapi sebagian besar memang tergantung pada konteks dan keadaan.
Pertanyaan saya adalah, apa pendapat Anda tentang jenis static helper / util class karena keuntungannya tentu saja adalah doa cepat hanya dengan menggunakan nama kelas.
Dan pada tingkat abstraksi seperti apa Anda akan menghindari penggunaan kelas-kelas semacam ini?
Menurut pendapat saya kata kunci "statis" seharusnya diperbolehkan dalam deklarasi kelas (Java) dan bukan untuk metode. Menurut pendapat saya, menggunakannya dengan cara ini, ini bisa menjadi alternatif dan middleway yang baik untuk dapat menggabungkan Paradigma Procuedural- dan OO di Jawa dan menghindari penyalahgunaan kata kunci.
Penambahan karena jawaban:
Pada awalnya saya berpikir bahwa itu benar-benar legal untuk dapat menggabungkan paradigma yang berbeda dan bahkan menggunakan bahasa scripting yang ditafsirkan runtime dalam mesin atau kode yang disusun vm.
Pengalaman saya adalah bahwa selama proses pengembangan proyek semacam pembantu dan utilitas atau apa pun namanya, tumbuh dan tumbuh dan digunakan di setiap sudut basis kode yang terlupakan, yang awalnya dirancang untuk modular dan fleksibel. Dan karena kurangnya waktu untuk membuat refactorings atau memikirkan desain lagi Anda hanya membuatnya jauh lebih buruk dari waktu ke waktu.
Saya pikir static
harus dihapus dari Jawa. Apalagi sekarang di mana dimungkinkan untuk menggunakan elemen bahasa fungsional yang lebih canggih.
sumber
Jawaban:
Yah, Java tidak memiliki fungsi gratis, jadi Anda terpaksa menempatkannya sebagai fungsi statis ke dalam beberapa kelas pro-forma. Upaya yang diperlukan tidak pernah anti-pola, meskipun mungkin tidak memiliki keanggunan.
Selanjutnya, tidak ada yang salah dengan fungsi gratis. Sebenarnya, menggunakan fungsi gratis mengurangi kopling, karena mereka hanya memiliki akses ke antarmuka publik alih-alih semua detail berdarah.
Tentu saja, menggunakan fungsi bebas / statis tidak dengan cara apa pun mengurangi bahaya negara yang bisa berubah, terutama global.
sumber
this
, dan memerlukan sesuatu yang dipakai tepatUtilitas statis atau fungsi pembantu bukan merupakan pola anti jika mereka mematuhi beberapa pedoman:
Mereka harus bebas dari efek samping
Mereka digunakan untuk perilaku spesifik aplikasi yang tidak termasuk dalam kelas atau kelas di mana fungsi ini beroperasi
Mereka tidak memerlukan status bersama
Kasus penggunaan umum:
Misalnya dalam aplikasi saya bekerja pada pengguna menyimpan entri jurnal untuk kegiatan mereka. Mereka dapat menentukan tanggal tindak lanjut dan mengunduh pengingat acara. Kami membuat kelas utilitas statis untuk mengambil entri jurnal dan mengembalikan teks mentah untuk file .ics.
Itu tidak memerlukan keadaan bersama. Itu tidak mengubah keadaan apa pun, dan membuat acara iCal jelas merupakan aplikasi khusus dan tidak termasuk dalam kelas entri jurnal.
Jika fungsi statis atau kelas utilitas memiliki efek samping atau memerlukan status bersama, saya akan merekomendasikan untuk mengevaluasi kembali kode ini, karena mengenalkan kopling yang mungkin sulit dipermainkan untuk pengujian unit.
sumber
Itu akan tergantung pada pendekatan Anda. Banyak aplikasi yang ditulis dengan lebih fungsional, tidak seperti pola pikir klasik (termasuk banyak situs tempat Anda berada).
Dengan pola pikir ini, akan ada banyak metode utilitas pada kelas pekerja yang dapat dirangkai sebagai metode statis. Mereka diberi makan / digunakan lebih dekat ke objek polos yang hanya menampung data dan bisa diedarkan.
Ini adalah pendekatan yang valid dan dapat bekerja dengan sangat baik, terutama pada skala.
sumber
Agent.Save(obj)
vsagentInstance.Save(obj)
. Dengan yang terakhir Anda memiliki kemungkinan untuk menyuntikkanagentInstance
ke dalam kode menggunakan. Karena Anda dapat menyuntikkan setiap kelas anak dariAgent
terlalu yang memungkinkan penggunaan kembali og kode menggunakan dengan berbeda "jenis" dariAgent
tanpa mengkompilasi ulang. Ini kopling rendah .Saya pribadi berpikir satu-satunya bagian penting tentang kelas-kelas penolong semacam itu adalah bahwa kelas itu dibuat pribadi. Selain itu - mereka benar-benar ide yang bagus (diterapkan dengan hemat).
Cara saya berpikir tentang ini - adalah jika dalam mengimplementasikan sebuah kelas (atau fungsi) - sesuatu seperti ini sangat membantu, dan membuat implementasi itu lebih jelas, bagaimana mungkin itu buruk? Dan SERING itu penting untuk mendefinisikan kelas pembantu pribadi untuk memungkinkan integrasi dengan dan penggunaan algoritma lain yang bergantung pada data yang berada dalam bentuk tertentu.
Apakah memberi label 'penolong' adalah masalah kecil selera pribadi, tetapi berkonotasi bahwa hal itu membantu dalam implementasi dan itu tidak menarik / digunakan untuk audiens yang lebih luas. Jika itu yang masuk akal - lakukanlah!
sumber
java.lang.Math
.Prevalensi
static
kelas penolong di didasarkan pada kesalahpahaman. Hanya karena kita memanggil kelas dengan hanyastatic
metode "kelas utilitas" tidak berarti bahwa itu tidak diperbolehkan untuk menulis perilaku umum di POJO.static
kelas pembantu adalah anti pola karena tiga alasan:Akses statis ke metode pembantu ini menyembunyikan ketergantungan . Jika "kelas utilitas" ini adalah POJO, Anda bisa menyuntikkannya ke kelas dependen sebagai parameter konstruktor yang akan membuat ketergantungannya jelas bagi setiap pengguna kelas dependen.
Akses statis ke metode pembantu ini menyebabkan kopling ketat . Ini berarti bahwa kode yang menggunakan metode pembantu sulit untuk digunakan kembali dan (sebagai efek samping) cepat untuk diuji.
Terutama jika mereka mempertahankan negara, ini hanyalah variabel global . Dan mudah-mudahan tidak ada yang berpendapat bahwa variabel global bagus ...
Kelas pembantu statis adalah bagian dari pola anti- kode STUPID .
OP menulis:
Konstruk statefull statis adalah negara global.
Ya, karena sebab. Dan hampir semua aplikasi membutuhkan semacam kondisi global .
Tetapi keadaan global ! = Variabel global .
Anda dapat membuat keadaan global dengan teknik OO melalui injeksi ketergantungan Tetapi Anda tidak dapat menghindari keadaan global dengan struktur statis statefull yang merupakan variabel global di bagian bawah.
sumber
Func<Result, Args>
objek, yang dipakai di tempat lain.