Pada wawancara kerja baru-baru ini, saya tidak bisa menjawab pertanyaan tentang SOLID - selain memberikan makna dasar dari berbagai prinsip. Itu benar-benar menggangguku. Saya telah melakukan beberapa hari untuk menggali dan belum membuat ringkasan yang memuaskan.
Pertanyaan wawancara adalah:
Jika Anda melihat proyek .Net yang saya katakan benar-benar mengikuti prinsip-prinsip SOLID, apa yang akan Anda lihat dalam hal proyek dan struktur kode?
Saya sedikit bingung, tidak benar-benar menjawab pertanyaan, dan kemudian dibom.
Bagaimana saya bisa menangani pertanyaan ini dengan lebih baik?
Jawaban:
S = Prinsip Tanggung Jawab Tunggal
Jadi saya berharap melihat struktur folder / file yang terorganisir dengan baik & Object Hierarchy. Setiap kelas / bagian dari fungsionalitas harus dinamai bahwa fungsinya sangat jelas, dan seharusnya hanya berisi logika untuk melakukan tugas itu.
Jika Anda melihat kelas manajer besar dengan ribuan baris kode, itu akan menjadi pertanda bahwa tanggung jawab tunggal tidak diikuti.
O = Prinsip Terbuka / tertutup
Ini pada dasarnya adalah gagasan bahwa fungsionalitas baru harus ditambahkan melalui kelas-kelas baru yang memiliki dampak minimal pada / memerlukan modifikasi fungsionalitas yang ada.
Saya berharap dapat melihat banyak penggunaan objek warisan, sub-mengetik, antarmuka dan kelas abstrak untuk memisahkan desain sepotong fungsi dari implementasi aktual, memungkinkan orang lain untuk datang dan mengimplementasikan versi lain di samping tanpa mempengaruhi asli.
L = Prinsip substitusi Liskov
Ini berkaitan dengan kemampuan untuk memperlakukan sub-tipe sebagai tipe induknya. Ini keluar dari kotak di C # jika Anda menerapkan hierarki objek yang diwariskan yang tepat.
Saya berharap melihat kode memperlakukan objek umum sebagai tipe dasar dan metode panggilan pada kelas dasar / abstrak daripada membuat instance dan bekerja pada sub-tipe itu sendiri.
I = Prinsip Segregasi Antarmuka
Ini mirip dengan SRP. Pada dasarnya, Anda mendefinisikan himpunan bagian kecil dari fungsi sebagai antarmuka dan bekerja dengan mereka untuk menjaga sistem Anda dipisahkan (misalnya
FileManager
mungkin memiliki tanggung jawab tunggal berurusan dengan File I / O, tetapi yang dapat mengimplementasikanIFileReader
danIFileWriter
yang berisi definisi metode khusus untuk membaca) dan penulisan file).D = Prinsip Pembalikan Ketergantungan.
Sekali lagi ini berkaitan dengan menjaga sistem dipisahkan. Mungkin Anda akan mencari penggunaan perpustakaan .NET Dependency Injection, yang digunakan dalam solusi seperti
Unity
atauNinject
atau sistem ServiceLocator sepertiAutoFacServiceLocator
.sumber
Banyak kelas kecil dan antarmuka dengan injeksi ketergantungan di semua tempat. Mungkin dalam proyek besar Anda juga akan menggunakan kerangka kerja IoC untuk membantu Anda membangun dan mengelola masa hidup semua benda kecil itu. Lihat https://stackoverflow.com/questions/21288/which-net-dependency-injection-frameworks-are-worth-looking-into
Perhatikan bahwa proyek .NET besar yang KERAS mengikuti prinsip-prinsip SOLID tidak selalu berarti basis kode yang baik untuk bekerja dengan semua orang. Tergantung pada siapa pewawancara itu, dia mungkin ingin Anda menunjukkan bahwa Anda memahami apa arti SOLID dan / atau memeriksa seberapa dogmatisnya Anda mengikuti prinsip-prinsip desain.
Anda lihat, untuk menjadi SOLID, Anda harus mengikuti:
S prinsip tanggung jawab perapian di tungku, sehingga Anda akan memiliki banyak kelas kecil masing-masing melakukan satu hal saja
Prinsip O pen-closed, yang dalam. NET biasanya diimplementasikan dengan injeksi dependensi, yang juga membutuhkan I dan D di bawah ...
Prinsip substitusi L iskov mungkin tidak mungkin dijelaskan dalam c # dengan one-liner. Untungnya ada pertanyaan lain yang mengatasinya, misalnya https://stackoverflow.com/questions/4428725/can-you-explain-liskov-substitusi-principle-with-a-good-c-sharp-example
Saya menerapkan Prinsip Segregasi bekerja bersama dengan prinsip Terbuka-Tertutup. Jika diikuti secara harfiah itu berarti lebih memilih sejumlah besar antarmuka yang sangat kecil daripada sedikit antarmuka "besar"
D ependency inversi prinsip kelas tingkat tinggi tidak harus bergantung pada kelas tingkat rendah, keduanya harus bergantung pada abstraksi.
sumber
Beberapa hal dasar yang saya harapkan untuk dilihat di basis kode toko yang mendukung SOLID dalam pekerjaan sehari-hari mereka:
Banyak pola Adaptor dan Komposit - Saya berharap penggunaan banyak pola Adaptor (kelas yang mengimplementasikan satu antarmuka dengan "melewati" ke fungsi antarmuka yang berbeda) untuk menyederhanakan penyumbatan dalam ketergantungan yang dikembangkan untuk satu tujuan menjadi sedikit tempat berbeda di mana fungsinya juga diperlukan. Pembaruan sesederhana mengganti logger konsol dengan file logger akan melanggar LSP / ISP / DIP jika antarmuka diperbarui untuk mengekspos cara untuk menentukan nama file yang akan digunakan; sebagai gantinya, kelas file logger akan mengekspos anggota tambahan, dan kemudian Adaptor akan membuat file logger terlihat seperti konsol logger dengan menyembunyikan barang baru, jadi hanya objek yang memecah semua ini bersama-sama yang harus mengetahui perbedaannya.
Demikian pula, ketika sebuah kelas perlu menambahkan ketergantungan dari antarmuka yang sama seperti yang sudah ada, untuk menghindari mengubah objek (OCP), jawaban yang biasa adalah untuk menerapkan pola Komposit / Strategi (kelas yang mengimplementasikan antarmuka ketergantungan dan mengkonsumsi beberapa lainnya. implementasi dari antarmuka itu, dengan berbagai jumlah logika yang memungkinkan kelas untuk meneruskan panggilan ke satu, beberapa, atau semua implementasi).
sumber
Mengalihkan perhatian mereka dengan diskusi Jon Skeet tentang bagaimana 'O' di SOLID adalah "tidak membantu dan kurang dipahami" dan membuat mereka berbicara tentang "variasi yang dilindungi" Alistair Cockburn dan "desain warisan" milik Josh Bloch "atau melarangnya".
Ringkasan singkat dari artikel Skeet (meskipun saya tidak akan merekomendasikan menjatuhkan namanya tanpa membaca posting blog asli!):
OP bertanya, "Bagaimana saya bisa menangani pertanyaan ini dengan lebih baik?" Sebagai seorang insinyur senior yang melakukan wawancara, saya akan jauh lebih tertarik pada seorang kandidat yang dapat berbicara secara cerdas tentang pro dan kontra dari gaya desain kode yang berbeda daripada seseorang yang dapat mengeluarkan daftar poin-poin.
Jawaban lain yang baik adalah, "Yah, itu tergantung pada seberapa baik mereka memahaminya. Jika yang mereka tahu adalah kata-kata SOLID, saya akan berharap penyalahgunaan warisan, terlalu banyak menggunakan kerangka injeksi ketergantungan, satu juta antarmuka kecil tidak ada yang mencerminkan kosakata domain yang digunakan untuk berkomunikasi dengan manajemen produk .... "
sumber
Mungkin ada sejumlah cara yang dapat dijawab dengan jumlah waktu yang bervariasi. Namun, saya pikir ini lebih sesuai dengan kalimat "Apakah Anda tahu apa artinya SOLID?" Jadi menjawab pertanyaan ini mungkin hanya bermula untuk mencapai poin dan menjelaskannya dalam hal proyek.
Jadi, Anda berharap melihat yang berikut:
sumber
Ini adalah pertanyaan yang sangat bagus, meskipun saya pikir ini adalah pertanyaan wawancara yang sulit.
Prinsip-prinsip SOLID benar-benar mengatur kelas dan antarmuka dan bagaimana mereka terkait satu sama lain.
Pertanyaan ini benar-benar salah satu yang lebih berkaitan dengan file dan belum tentu kelas.
Pengamatan atau jawaban singkat yang akan saya berikan adalah bahwa secara umum Anda akan melihat file yang hanya memiliki antarmuka, dan sering konvensi adalah bahwa mereka mulai dengan huruf kapital-I. Di luar itu, saya akan menyebutkan bahwa file tidak akan memiliki kode duplikat (terutama di dalam modul, aplikasi, atau perpustakaan), dan kode itu akan dibagikan secara hati-hati melintasi batas-batas tertentu antara modul, aplikasi, atau perpustakaan.
Robert Martin membahas topik ini dalam ranah C ++ dalam Merancang Aplikasi C ++ Berorientasi Objek Menggunakan Metode Booch (lihat bagian tentang Kohesi, Penutupan, dan Dapat Digunakan Kembali) dan dalam Kode Bersih .
sumber