Mungkin Duplikat: Apa yang begitu buruk tentang Lajang?
It's dimengerti bahwa banyak pola desain dapat dalam beberapa kasus disalahgunakan, dan seperti ibu selalu bilang: "Terlalu banyak hal yang baik isn't selalu baik!"
I'm menyadari bahwa hari-hari ini, aku'm menggunakan Lajang banyak, dan I'm khawatir bahwa saya mungkin menyalahgunakan pola desain sendiri, dan berjalan lebih dalam dan lebih dalam ke yang buruk-praktek semacam kebiasaan.
Kami're mengembangkan aplikasi Flex yang memiliki cukup besar hirarkis struktur data yang disimpan dalam memori sementara pengguna yang bekerja di atasnya. Pengguna dapat memuat, menyimpan, mengubah dan menghapus data pada permintaan.
Data ini terpusat dengan cara Singleton class, yang menggabungkan beberapa ArrayCollections, Array, nilai benda-benda dan beberapa lainnya berasal variabel anggota yang terkena melalui getter dan setter.
Untuk mendapatkan referensi ke data kami dari mana saja di aplikasi, kami melakukan seluruh Model.getInstance() metode jenis hal, bahwa saya'm yakin semua orang akrab dengan. Hal ini memastikan bahwa kita selalu mendapatkan tangan kami pada salinan yang sama dari data, karena ketika kita merancang, kami mengatakan bahwa hanya sekali contoh diperbolehkan untuk eksis selama penerapan seumur hidup.
Dari pusat penyimpanan data, it's maka mudah bagi kita untuk misalnya, pengiriman properti diubah peristiwa, dan dapat memiliki beberapa komponen UI yang merujuk pusat data, update menampilkan mereka untuk mencerminkan perubahan data yang terjadi.
Sejauh ini, pendekatan ini telah efektif dan terbukti sangat praktis untuk keadaan kita.
I'm mencari bagaimanapun, bahwa saya'm sedikit terlalu bersemangat ketika membuat kelas baru. Pertanyaan-pertanyaan seperti harus kelas menjadi Singleton, atau harus itu bukan dikelola beberapa cara lain, seperti mungkin menggunakan sebuah pabrik misalnya, cenderung kadang-kadang menjadi sedikit sulit, dengan sedikit ketidakpastian.
Di mana saya bisa menarik garis dengan lajang? Apakah ada pedoman yang baik untuk memutuskan kapan untuk menggunakan Lajang dan kapan harus menjauh dari mereka.
Juga, siapa pun dapat merekomendasikan sebuah buku yang bagus tentang desain pola?
Ya, lajang yang buruk. Mereka buruk karena semua yang mereka lakukan untuk anda adalah menggabungkan dua sifat, yang masing-masing buruk sekitar 95% dari waktu. (Yang berarti bahwa secara rata-rata, lajang yang buruk 99.75% dari waktu ;))
Tunggal, seperti yang didefinisikan oleh GoF, adalah struktur data yang:
Yang pertama adalah umumnya dianggap sebagai hal yang buruk. Kami don't seperti globals. Yang kedua adalah sedikit lebih halus, namun umumnya, hampir tidak ada kasus-kasus di mana hal ini adalah wajar pembatasan untuk melaksanakan.
Kadang-kadang, itu hanya masuk akal untuk memiliki satu instance dari suatu objek. Dalam hal anda memilih untuk membuat hanya satu. Anda don't perlu singleton untuk menegakkan itu.
Dan biasanya, bahkan ketika itu "masuk akal" untuk hanya memiliki satu instans, ternyata tidak membuat rasa setelah semua. Cepat atau lambat, kau're akan membutuhkan lebih dari satu logger. Atau lebih dari satu database. Atau anda're akan memiliki untuk menciptakan sumber daya untuk masing-masing unit tes, yang artinya kita harus mampu menciptakan mereka di akan. Itu adalah prematur menghilangkan fleksibilitas dari kode kita, sebelum kita memahami konsekuensi.
Lajang menyembunyikan ketergantungan dan meningkatkan coupling (setiap kelas dapat berpotensi tergantung pada singleton, yang berarti kelas tidak dapat digunakan kembali dalam proyek-proyek lain kecuali kami juga menggunakan kembali semua kami lajang), dan karena dependensi ini tidak segera terlihat (seperti fungsi/parameter konstruktor), kita don't melihat mereka, dan biasanya don't berpikir tentang hal ini ketika kita menciptakan mereka. It's begitu mudah untuk hanya menarik di singleton, ia bertindak hampir seperti sebuah variabel lokal dan semua, sehingga kita cenderung untuk menggunakan mereka banyak sekali mereka're sana. Dan yang membuat mereka hampir tidak mungkin untuk menghapus lagi. Anda berakhir, mungkin tidak dengan spaghetti code, tapi dengan spaghetti ketergantungan grafik. Dan cepat atau lambat, anda pelarian ketergantungan akan berarti bahwa lajang mulai tergantung pada satu sama lain, dan kemudian anda mendapatkan melingkar dependensi ketika seseorang berusaha diinisialisasi.
Mereka membuatnya sangat sulit untuk unit-test. (Bagaimana anda menguji fungsi yang memanggil fungsi pada obyek singleton? Kami don't ingin sebenarnya singleton kode yang harus dilakukan, tapi bagaimana kita mencegah hal itu?
Ya, lajang yang buruk.
Kadang-kadang, anda ingin benar-benar global. Kemudian menggunakan global, tidak tunggal.
Kadang-kadang, sangat sangat sangat jarang, anda mungkin memiliki situasi di mana menciptakan multiple instance dari sebuah class adalah sebuah kesalahan, di mana ia dapat ** tidak dapat dilakukan tanpa menyebabkan kesalahan. (Tentang satu-satunya hal yang dapat saya pikirkan, dan bahkan yang dibikin adalah jika anda're mewakili beberapa perangkat keras. Anda hanya memiliki satu GPU, jadi jika anda're akan peta itu ke sebuah objek dalam kode anda, hal itu akan membuat rasa itu hanya salah satu contoh yang dapat hidup). Tetapi jika anda menemukan diri anda dalam situasi seperti ini (dan sekali lagi, untuk penekanan, situasi di mana beberapa contoh penyebab kesalahan yang serius, bukan hanya situasi di mana "aku't pikir dari setiap kasus penggunaan untuk lebih dari satu contoh"), kemudian menegakkan bahwa kendala, tetapi melakukannya juga tanpa membuat objek secara global terlihat.
Masing-masing dari dua sifat * bisa menjadi berguna, dalam kasus yang jarang terjadi. Tapi aku bisa't pikir dari satu kasus di mana kombinasi* dari mereka akan menjadi hal yang baik.
Sayangnya, banyak orang punya ide yang "Lajang adalah OOP-compliant globals." Tidak, mereka're tidak. Mereka masih menderita masalah yang sama seperti globals, selain untuk memperkenalkan beberapa lainnya, orang-orang yang sama sekali tidak berhubungan. Sama sekali tidak ada alasan untuk lebih memilih singleton lebih tua polos global.
Hal penting untuk diingat adalah bahwa pola desain hanyalah sebuah alat untuk membantu anda memahami konsep-konsep abstrak. Setelah anda memiliki pemahaman, membatasi diri sendiri khusus untuk "resep" dari sebuah buku adalah sia-sia dan menyakitkan kemampuan anda untuk menulis kode yang paling tepat untuk tujuan anda.
Yang mengatakan, membaca buku-buku seperti GoF akan hadir dengan lebih banyak cara untuk berpikir tentang masalah sehingga ketika saatnya tiba untuk melaksanakan sesuatu pada anda sendiri, anda'akan memiliki satu set yang lebih luas dari perspektif untuk mendekati masalah dari.
Dalam kasus anda, jika menggunakan singleton akal dalam setiap kasus, kemudian pergi kanan depan. Jika seperti itu, "semacam" cocok dan anda harus menerapkannya dalam beberapa kikuk, maka anda perlu untuk datang dengan solusi baru. Memaksa pola yang isn't adalah agak seperti memalu pasak persegi ke dalam lubang bundar.
Mengingat bahwa anda mengatakan "pendekatan ini telah efektif dan terbukti sangat praktis untuk keadaan kita," saya pikir anda're baik-baik saja.
Berikut ini adalah beberapa buku-buku yang baik:
Geng Empat Pesan - buku klasik untuk desain pola
Head First Design pattern - I've mendengar ini direkomendasikan oleh beberapa orang sebagai alternatif
Pengembang perangkat lunak tampaknya cukup merata dibagi menjadi dua kubu, tergantung pada apakah mereka mendukung idealis coding style atau pragmatis satu:
Secara pribadi, saya mendukung pendekatan pragmatis. Kadang-kadang masuk akal untuk melanggar aturan, tetapi hanya jika anda benar-benar memahami apa yang anda lakukan dan bersedia untuk menerima risiko terkait. Jika anda dapat menjawab "ya" untuk pertanyaan-pertanyaan di bawah ini mengenai kasus penggunaan khusus, singleton pattern dapat menghasilkan beberapa manfaat praktis.
Lajang don't membunuh program, programmer membunuh program.
Seperti pemrograman membangun, bila digunakan dengan tepat, anda tidak akan menembak diri di kaki.
Buku-buku yang direkomendasikan baik-baik saja, tapi mereka don't selalu memberikan cukup latar belakang yang dilengkapi dengan pengalaman pada saat anda akan membuat pilihan untuk menggunakan Singleton.
Pengalaman itu hanya datang ketika anda've ditemukan Singleton adalah pilihan yang buruk ketika anda perlu untuk memiliki beberapa contoh, dan semua tiba-tiba, anda've punya banyak masalah menyuntikkan objek referensi di mana-mana.
Kadang-kadang itu's baik untuk pergi ke depan dan memiliki referensi objek di tempat, tapi fakta bahwa anda menggunakan Singleton sama sekali tidak membantu untuk mengidentifikasi lingkup masalah yang akan anda hadapi jika anda harus refactor itu untuk desain yang berbeda. Yang saya percaya adalah hal yang sangat baik: yaitu hanya memiliki satu kelas sama sekali (bahkan jika dirancang dengan buruk) memberikan beberapa kemampuan untuk melihat efek dari perubahan ke kelas.
Kami telah memulai sebuah proyek di mana kami pada dasarnya menghadapi pertanyaan yang sama, yaitu, bagaimana akses model, dan terutama elemen root. Proyek ini tidak Flex app, tapi bermain! aplikasi web, tapi itu doesn't benar-benar peduli.
Memiliki satu objek unik dalam sistem ini baik-baik saja, masalah bagaimana untuk mengaksesnya. Jadi perdebatan tentang singleton adalah terkait dengan gagasan dependency injection (DI), dan bagaimana untuk mendapatkan benda-benda.
Argumen utama untuk DI adalah sebagai berikut:
Pendekatan yang mungkin untuk DI adalah (lihat klasik artikel dari Fowler):
Dalam perspektif ini, singleton pattern adalah salah satu jenis layanan locator, misal Model.getInstance()
.
Tetapi untuk memberikan fleksibilitas maksimum dalam menghadapi perubahan di masa depan, referensi ke objek yang unik harus berlalu sebanyak mungkin, dan diperoleh dengan Model.getInstance()
hanya bila diperlukan. Ini juga akan menghasilkan kode bersih.
Menurut pendapat saya penggunaan Lajang langsung sinyal cacat desain. Alasannya adalah bahwa mereka memungkinkan seseorang untuk memotong normal objek penciptaan dan kehancuran mekanisme yang dibangun ke C++. Jika sebuah objek membutuhkan referensi ke objek lain, itu harus lulus dalam referensi untuk itu pada saat konstruksi atau membuat sebuah instance baru dari internal. Tapi ketika anda menggunakan singleton anda're secara eksplisit obfuscating penciptaan dan teardown siklus. Terkait masalah ini adalah bahwa hal itu sangat sulit untuk mengontrol seumur hidup dari singleton. Akibatnya, banyak paket yang mencakup generik singleton implementasi juga mencakup kikuk objek seumur hidup manajer dan sejenisnya. Kadang-kadang aku bertanya-tanya jika ini don't ada hanya untuk mengelola lajang.
Pada dasarnya, jika anda perlu untuk menggunakan sebuah objek di banyak tempat, itu harus dibuat secara eksplisit di level tertinggi titik yang sama dalam stack dan kemudian diteruskan ke bawah melalui referensi untuk semua orang yang menggunakannya. Kadang-kadang orang menggunakan Lajang karena mereka memiliki masalah melewati beberapa args untuk thread baru, tapi don't jatuh untuk ini, secara eksplisit mendefinisikan thread anda args dan melewati mereka ke thread baru dengan cara yang sama. Anda'll menemukan bahwa program anda mengalir jauh lebih bersih dan tidak ada kejutan karena statis inisialisasi dependensi atau keliru teardown.
Saya tahu ini adalah thread lama tapi sepertinya tidak ada lagi yang sebenarnya pola yang sesuai dengan apa yang OP mencoba untuk melakukan. Apa yang saya percaya dia adalah menggambarkan kebutuhan untuk disebut Mediator Pola. SourceMaking adalah situs yang fantastis untuk belajar / referensi informasi seperti ini. Pasti saya pergi ke tempat untuk memperkenalkan orang-orang untuk perangkat lunak pola. Juga, it's umumnya ide yang baik untuk tidak membeli ke gagasan bahwa setiap pola desain yang selalu inheren baik atau jahat. Mereka semua memiliki mereka gunakan, it's hanya belajar kapan dan di mana untuk menggunakannya itu adalah trik. Orang-orang yang menyatakan tidak pernah menggunakan Lajang, untuk saya, don't memahami kegunaannya.
Lajang tentu tidak buruk. Mereka telah menggunakan mereka, beberapa dari mereka sangat baik. Lajang cenderung berlebihan oleh pengembang berpengalaman sebagai it's sering pertama desain patten mereka belajar tentang, dan's cukup sederhana, sehingga mereka chuck sekitar di semua tempat tanpa berpikir tentang implikasi.
Setiap kali anda ingin menggunakan singleton, cobalah untuk mempertimbangkan mengapa anda melakukan itu, dan apa manfaat dan negatif dari menggunakan pola ini.
Lajang yang tidak efektif membuat global dapat diakses set 'hal-hal yang' (baik data atau metode) dan saya pikir kebanyakan orang akan setuju bahwa terlalu banyak menggunakan variabel global adalah bukan ide yang bagus. Inti dari kelas-kelas dan objek orientasi adalah untuk mengelompokkan hal-hal yang menjadi daerah diskrit bukan hanya melemparkan semuanya ke dalam satu global besar-besaran ruang.
Salah satu 'pola' saya menemukan saya cenderung memilih lebih dari lajang adalah untuk lulus dibutuhkan benda-benda yang jatuh dari atas. Aku membuat mereka sekali selama saya apps tahap inisialisasi, dan melewati mereka ke bawah melalui semua benda-benda yang membutuhkan akses ke mereka. Meniru 'satu-ciptaan' bagian dari singleton pattern, tapi tanpa 'global' bagian.
Seluruh titik tunggal adalah bahwa hal itu's untuk benda-benda di mana hanya 1 akan pernah ada. Anda menyebutkan kontrol data set kelas. Mungkin mempertimbangkan bahwa sebenarnya, ada kasus di mana sebuah aplikasi yang mungkin ingin membuat 2 set data kelas kontrol, jadi mungkin menegakkan singleton ini isn't cukup tepat. Sebaliknya, jika anda membuat data-data kelas pada aplikasi init, dan melewati mereka ke bawah, anda akan hanya membuat 1 set seperti itu adalah apa yang anda saat ini app membutuhkan, tetapi anda meninggalkan terbuka kemungkinan bahwa di beberapa titik, jika anda membutuhkan set kedua anda dapat dengan mudah membuat mereka. Juga, harus data kelas kontrol benar-benar dapat di akses globaly dari mana saja di app. Saya pikir tidak, sebaliknya mereka mungkin harus hanya dapat diakses dari tingkat yang lebih rendah data access layer.
Beberapa orang yang telah merekomendasikan buku GOF. Saya akan mengatakan, ya itu adalah buku yang bagus, tapi pertama-tama mencoba dan menemukan sebuah buku pada umumnya arsitektur pertama, baca sekitar 2/3/n-tier desain, enkapsulasi, abstraksi, dan semacam ini prinsip yang pertama. Ini akan memberi anda lebih banyak dasar yang solid yang dapat digunakan untuk memahami penggunaan yang tepat dari pola GOF berbicara tentang.
[Edit: lain kali singleton varian yang dapat berguna ketika anda ingin titik akses tunggal untuk sesuatu, tapi implementasi detail yang mungkin benar-benar lebih dari satu hal. Pemanggil doesn't perlu tahu, bahwa di bawah selimut permintaan mereka untuk obyek singleton adalah benar-benar diselesaikan terhadap beberapa benda-benda yang tersedia dan satu dikembalikan. I'm memikirkan sesuatu seperti kolam thread di sini, di mana penggunaan pergi, hei, berikan aku benang, yang saya butuhkan 1, tapi aku don't peduli yang salah satu]
Google tampaknya akan yakin yang Lajang adalah ide yang buruk.
Yang's tidak berarti bahwa segala sesuatu yang Google tidak sempurna atau bahwa mereka setiap pendapat adalah akhir dari setiap argumen, tapi mereka've pergi sejauh untuk menulis ini Singleton detektor untuk membasmi mereka. Membuat pikiran anda sendiri.
Lajang yang tidak "yang buruk". Jika anda memiliki banyak terkait Lajang dan anda dapat mengganti/mengkonsolidasikan beberapa dari mereka menggunakan sebuah Pabrik, tanpa kehilangan apa pun yang anda sayangi, maka yang's ketika anda harus begitu.
Seperti buku-buku, nah, ada's jenis canon.