Saya cukup baru dengan prinsip-prinsip desain SOLID . Saya memahami sebab dan manfaatnya, tetapi saya gagal menerapkannya pada proyek yang lebih kecil yang ingin saya refactor sebagai latihan praktis untuk menggunakan prinsip-prinsip SOLID. Saya tahu tidak perlu mengubah aplikasi yang berfungsi dengan sempurna, tetapi saya tetap ingin mengubahnya jadi saya mendapatkan pengalaman desain untuk proyek masa depan.
Aplikasi memiliki tugas berikut (sebenarnya jauh lebih dari itu tetapi mari kita tetap sederhana): Aplikasi ini harus membaca file XML yang berisi definisi Tabel Tabel / Kolom / Tampilan dll dan membuat file SQL yang dapat digunakan untuk membuat skema database ORACLE.
(Catatan: Tolong jangan membahas mengapa saya membutuhkannya atau mengapa saya tidak menggunakan XSLT dan sebagainya, ada alasannya, tetapi semuanya di luar topik.)
Sebagai permulaan, saya memilih untuk hanya melihat Tabel dan Kendala. Jika Anda mengabaikan kolom, Anda dapat menyatakannya dengan cara berikut:
Kendala adalah bagian dari tabel (atau lebih tepatnya, bagian dari pernyataan CREATE TABLE), dan kendala juga dapat merujuk tabel lain.
Pertama, saya akan menjelaskan seperti apa aplikasi saat ini (tidak menerapkan SOLID):
Saat ini, aplikasi memiliki kelas "Tabel" yang berisi daftar pointer ke Kendala yang dimiliki oleh tabel, dan daftar pointer ke Kendala yang merujuk pada tabel ini. Setiap kali koneksi terbentuk, koneksi mundur juga akan dibuat. Tabel ini memiliki metode createStatement () yang pada gilirannya memanggil fungsi createStatement () dari setiap kendala. Metode Said sendiri akan menggunakan koneksi ke tabel pemilik dan tabel referensi untuk mengambil nama mereka.
Jelas, ini tidak berlaku untuk SOLID sama sekali. Misalnya, ada dependensi melingkar, yang membengkak kode dalam hal metode "tambah" / "hapus" yang diperlukan dan beberapa destruktor objek besar.
Jadi ada beberapa pertanyaan:
- Haruskah saya menyelesaikan dependensi melingkar menggunakan Injeksi Ketergantungan? Jika demikian, saya kira Constraint harus menerima tabel pemilik (dan opsional yang direferensikan) dalam konstruktornya. Tapi bagaimana saya bisa melindas daftar kendala untuk satu tabel?
- Jika kelas Tabel keduanya menyimpan keadaan itu sendiri (misalnya nama tabel, komentar tabel dll) dan tautan ke Kendala, apakah ini satu atau dua "tanggung jawab", memikirkan Prinsip Tanggung Jawab Tunggal?
- Dalam kasus 2. benar, haruskah saya membuat kelas baru di lapisan bisnis logis yang mengelola tautan? Jika demikian, 1. jelas tidak lagi relevan.
- Haruskah metode "createStatement" menjadi bagian dari kelas Tabel / Kendala atau haruskah saya memindahkannya juga? Jika ya, kemana? Satu kelas Manajer per setiap kelas penyimpanan data (mis. Tabel, Kendala, ...)? Atau lebih tepatnya membuat kelas manajer per tautan (mirip dengan 3.)?
Setiap kali saya mencoba menjawab salah satu pertanyaan ini saya menemukan diri saya berputar-putar di suatu tempat.
Masalahnya jelas menjadi jauh lebih kompleks jika Anda memasukkan kolom, indeks dan sebagainya, tetapi jika kalian membantu saya dengan masalah Tabel / Kendala yang sederhana, saya mungkin dapat mengerjakan sisanya sendiri.