Saya memiliki satu set fungsi tujuan tunggal yang saya butuhkan dalam dua pengontrol terpisah. Saat ini saya hanya memiliki kode duplikat dan saya ingin menyingkirkannya. Kode ini adalah bagian dari pengontrol dan tidak termasuk dalam lapisan layanan saya. Di mana Anda akan meletakkannya?
mvc
code-smell
Erin
sumber
sumber
Jawaban:
Anda tidak mengatakan jenis logika apa yang Anda bagikan. Singkatnya, apakah ini kontroler logika atau fungsi pembantu? Dua metode berurusan dengan ini dalam bahasa berorientasi objek adalah pewarisan dan komposisi. Warisan masuk akal jika ada aksi bersama antara dua pengendali. Komposisi masuk akal sepanjang waktu. Contoh menggunakan warisan terletak pada jawaban asli saya di bawah pembagi.
Tidak jarang memiliki kelas utilitas atau kelas pembantu tergantung pada kerangka kerja Anda. Misalnya, dalam kerangka kerja Java dan C # Anda mungkin memiliki paket / namespace untuk utilitas. Di Ruby on Rails, Anda mungkin memanfaatkan
Helper
kelas yang membagikan logika antara pengontrol dan tampilan. Pada dasarnya, akan terlihat seperti ini:Atau, Anda bisa menjadikannya kelas yang Anda instantiate. Kunci pola kelas statis di atas adalah untuk membuat fungsi Anda fungsi murni. Dengan kata lain, Anda lulus dalam kondisi apa pun yang perlu dilakukan tugasnya, dan fungsinya tidak merujuk keadaan statis lain di sistem.
Dalam kedua kasus, Anda akan mengaksesnya di setiap pengontrol Anda seperti ini:
Jawaban Asli
Anda tidak mengatakan apa platform Anda, karena itu dapat mempengaruhi jawabannya. Dengan asumsi bahwa itu adalah bahasa berorientasi objek, pendekatan yang paling umum adalah membuat kelas dasar yang diperluas oleh kedua pengontrol. Misalnya di Ruby on Rails yang mungkin Anda miliki:
Anda dapat menerjemahkan ide ke bahasa lain juga. Pendekatan yang sama akan bekerja untuk ASP.NET MVC, Apache Wicket, Grails, atau hampir semua kerangka kerja web berorientasi objek lainnya. Jika bahasa Anda tidak berorientasi objek, maka itu benar-benar tergantung pada bagaimana kerangka kerja dirancang sebagai pendekatan terbaik .
sumber