Penafian: Semua orang bisa, tetapi apa yang lebih buruk dari saya ?!
SOLID adalah seperangkat prinsip untuk mengatur kode. Bahkan, mereka menyatakan aturan tertentu yang akan membantu Anda menghemat waktu dan saraf Anda dan orang lain. Atau mereka mungkin tidak membantu.
Mari kita coba memahami prinsip-prinsip ini dengan jari, tanpa contoh kode dan SMS.
S - Prinsip Tanggung Jawab Tunggal (SRP)
Seharusnya ada satu dan hanya satu alasan untuk mengubah kelas (“Kelas seharusnya hanya punya satu alasan untuk berubah.” Robert C. Martin.)
Bayangkan Anda memiliki lima lagu favorit, beberapa film dan gambar kucing di komputer Anda. Anda membawa semua ini ke dalam “Dokumen Saya” dan, secara umum, nikmati hidup.
Kemudian Anda mengunduh lebih banyak film, album baru band favorit Anda dan selusin kucing baru. Dalam "My Documents" itu menjadi entah bagaimana tidak nyaman dan Anda meletakkan semuanya oleh ayah.
Musik
Film
Stempel
Kemudian Anda menghubungkan kecepatan yang tidak terbatas, turun dari gulungan dan mengunduh semua seri Simpsons penuh dengan diskografi kelompok favorit Anda, dan foto-foto dari perjalanan memancing dengan teman ditambahkan ke foto-foto kucing. Ayah mulai bercabang.
Musik
Pintu-pintunya
Menunggu matahari
Halo, I Love You.mp3
...
...
Rhcp
Agutin
Video
Acara TV
Film
Studio Pribadi
Foto
Stempel
Memancing
Preferensi di negara ini
pelacur
Dan apa yang kita miliki di sini?
- Musik - HANYA bertanggung jawab atas musik.
- The Doors - HANYA bertanggung jawab atas musik yang dimainkan oleh The Doors
- Waiting for the Sun - bertanggung jawab HANYA untuk album Waiting for the Sun
- Halo, I Love You.mp3 - HANYA bertanggung jawab atas lagu Hello, I Love You
Apa yang bisa menjadi alasan untuk perubahan The Doors? Hanya satu - (kualitatif atau kuantitatif) yang berubah dalam lagu-lagu The Doors. Tetapi penghapusan seri membosankan dari "/ Video / TV Series /" tidak bisa menjadi alasan seperti itu, sama seperti mengganti nama "Musik" menjadi "Musik".
Kesimpulan apa yang bisa ditarik?
- SRP adalah tentang dekomposisi (disortir ke dalam sub-folder) dan keterhubungan ("Halo, I Love You.mp3" hanya dikaitkan dengan "Waiting for the Sun" dan dia tidak peduli tentang perubahan ke "../Series". Di sisi lain, semua lagu "The Doors" ada di dalamnya dan tidak boleh ada di folder "Cats").
- Tingkat abstraksi alasan perubahan tidak boleh lebih tinggi dari tingkat abstraksi entitas yang diubah. Menambahkan subfolder "Alla Pugacheva" ke "Music" tidak dapat menjadi alasan untuk perubahan "Menunggu Matahari".
- Tidak perlu sampai pada titik absurditas. Jika Anda memiliki tiga lagu, satu video dan lima gambar kucing, maka mereka akan tampak hebat dalam satu tumpukan - memasukkannya ke dalam folder hanya akan membingungkan segalanya. Seperti koleksi “The best of The Doors”, Anda tidak boleh membaginya menjadi subfolder berdasarkan tahun, yang masing-masing akan memiliki satu lagu.
O - Prinsip Terbuka-tertutup atau OCP
Entitas perangkat lunak (kelas, modul, fungsi, dll.) Harus terbuka untuk ekstensi, tetapi ditutup untuk modifikasi. " Bertrand Meyer)
Mari kita kembali ke langkah sejarah kami ketika Anda menghubungkan kecepatan tanpa batas. Katakanlah pertama-tama Anda memompa semua jenis film tentang tukang ledeng dari perusahaan film Private dan, karena semuanya tentang tukang ledeng, membuat folder "/ Video / About Plumbers /".
Setelah beberapa waktu, Anda mengunduh lebih banyak film dari studio ini, tetapi sudah tentang pengiriman pizza. Selain itu, gadis baru Anda menulis SMS kepada Anda "Saya mengunduh film" Afonya "dan menyimpannya di folder / Video / About Plumbers /, oke?". Dan segala sesuatu tampaknya benar - tentang pipa ledeng, tetapi ada nuansa.
Dan di sini menjadi jelas bagi Anda bahwa mengubah fungsi tidak mungkin dilakukan tanpa mengubah struktur folder (kelas) yang ada, dan ini merupakan pelanggaran yang jelas terhadap prinsip OCP.
Bagaimana dalam hal ini harus dilakukan? Sangat sederhana untuk awalnya merancang sistem sehingga fungsionalitas baru tidak perlu mengubah kode lama. Yaitu jangan hardcode folder "../Pro tukang ledeng /", berharap bahwa di masa depan hanya akan ada tentang mereka, tetapi meningkatkan tingkat abstraksi ke "../Studio Pribadi /" dan dengan tenang memberi makan tukang pipa dan pizza delivery, dengan tenang, dll. -lainnya ...
Dan untuk Afoni, buat kelas baru, misalnya, "../Mosfilm/", perluas kelas "/ Video /"
Kesimpulan:
- Pikirkan ke depan tentang apa yang akan Anda lakukan jika film "lain" tentang tukang ledeng muncul. Mungkin Anda harus melakukannya segera di pikiran Anda agar tidak mengulanginya nanti?
- Prinsip ini terutama tentang kelas abstrak ("../Studio Pribadi /").
Prinsip Pengganti L - Barbara Liskov atau LSP
Objek dalam program harus diganti dengan instance subtipe mereka tanpa mengubah eksekusi program yang benar.
Nah, ini dia cukup sederhana.
Untuk penjelasan, mari beralih ke sweetness dan nanniness, dan secara khusus ke folder "/ Photo / Seals /".
Kami suka kucing dan kami telah mengumpulkan banyak foto.
Foto
Stempel
Gadis berambut merah
Bergaris
Basah
Hitam
Manula
Kebetulan kami bahkan langsung meluncurkan slideshow di seluruh folder root dan mengaguminya. Maka, pada satu saat yang baik, ketika Anda hampir mencapai nirwana, layar menampilkan:
Tidak dapat menampilkan file "/ Foto / Segel / Buku / Kucing di Boots.fb2"
Ternyata kemudian, teman Anda memutuskan untuk meningkatkan tingkat kelucuan dan mewarisi "Segel" dengan subfolder baru dari "Buku", setelah secara kasar melanggar LSP, karena subkelas "Buku" tidak dapat digunakan sebagai pengganti kelas dasar "Foto".
Kesimpulan:
- Namanya menakutkan, definisi itu rumit, tetapi prinsipnya sendiri sederhana dan intuitif.
- Jika metode Anda mengharapkan "Foto" untuk masuk, maka tidak masalah pewaris mana dari "Foto" Anda menyelipkannya: "Manuli", "Gadis berambut merah" atau "Basah", tetapi jika "Buku" datang ke sana, maka dia diharapkan tersedak teh.
I - Prinsip Pemisahan Antar Muka atau ISP
Klien tidak boleh bergantung pada metode yang tidak mereka gunakan.
Di sini akan sulit dijelaskan dengan folder dan file, tapi saya akan coba - jangan menilai secara ketat untuk beberapa ketegangan.
Anda sudah bosan dengan pemutar musik standar dan Anda memutuskan untuk mengunduh yang baru, trendi dan hype. Dia bahkan tahu cara menampilkan sampul album musik dan menampilkan subtitle dari lagu yang dimainkan. Tetapi masalahnya adalah, jika file "cover.jpg" dan "subtitles.txt" tidak ada dalam folder album, maka pemain mengalami crash dengan kesalahan. Dan sekarang, mengutuk segala sesuatu di dunia, Anda mulai membuat file rintisan ini di semua subfolder dengan album.
Artinya, menggambar analogi yang salah, kami mewajibkan kelas Musik dan semua pewarisnya untuk mengimplementasikan antarmuka AudioCoverSubtitles. Pada saat yang sama, antarmuka ini hanya sepenuhnya mengimplementasikan album "Waiting for the Sun", album "The Best of The Doors" hanya mengimplementasikan bagian "Audio + Cover", dan sisanya hanya "Audio".
Ini membawa kita pada gagasan bahwa masuk akal untuk membagi antarmuka AudioCoverSubtitles yang tebal menjadi tiga Audio, Sampul, dan Teks yang kecil dan menggunakannya hanya di tempat yang benar-benar diperlukan.
Kesimpulan:
- ISP tiba-tiba tentang pemisahan antarmuka.
- Jika antarmuka Anda memaksa Anda untuk membuat metode rintisan, maka ini adalah antarmuka yang buruk dan Anda harus menggunakannya dengan gunting.
Prinsip inversi D - dependensi atau DIP
Modul tingkat atas tidak harus bergantung pada modul tingkat bawah. Kedua jenis modul harus bergantung pada abstraksi.
Abstraksi tidak harus bergantung pada detail. Rinciannya harus bergantung pada abstraksi.
Modul “Doors” seharusnya tidak bergantung pada jenis file audio yang dikandungnya, .mp3, .flac atau .wav.
Modul Doors, sub-modul Waiting for the Sun (dan semua orang lain), tergantung pada abstraksi Musik tingkat atas, yang menentukan implementasinya (fakta bahwa mereka memiliki musik di dalamnya).
Misalkan kita memutuskan untuk memisahkan penyimpanan musik sesuai dengan prinsip kompresi - "lossy" dan "lossless". Ini adalah detail yang dipadukan oleh ketergantungan pada abstraksi “Musik” - di dalamnya, pada akhirnya, pasti masih ada musik. Selain itu, abstraksi "Musik" itu sendiri tidak tergantung pada detail ini. Dia tidak peduli jika musiknya hilang di sana atau tanpa mereka - karena itu musik, tetap begitu.
Kesimpulan:
- DIP - ini tentang itu, khusus harus bergantung pada umum, dan bukan sebaliknya.
- DIP adalah "Lebih banyak abstraksi bagi dewa abstraksi!"
- DIP juga tentang sebab dan akibat, tentang jawaban yang benar untuk pertanyaan: "Cabang berayun dari fakta bahwa angin berhembus atau angin berhembus dari fakta bahwa cabang berayun"
Terima kasih dan selamat menikmati akhir pekan!