Saya sedang mengerjakan proyek perangkat lunak di mana kami harus membangun tiga API. Satu untuk saluran home banking, satu untuk saluran agensi dan yang ketiga untuk saluran seluler .
API agensi adalah yang paling lengkap karena memiliki semua fungsionalitas .. lalu API Beranda yang sedikit lebih kecil dan kemudian API seluler.
Arsitek di sini membuat layer umum (layanan lintas saluran EJB yang dibagikan oleh semua API). Tetapi kemudian API berbeda.
Tidak ada perbedaan besar untuk saat ini antara API. Tim besar mulai dengan saluran agensi, dan kami mengadaptasinya sekarang untuk saluran rumah. Kami hanya memperkaya objek khusus ke aplikasi rumah kami. Kalau tidak, kodenya 95% sama antara API. API dibangun di atas Spring MVC , dan memiliki (pengontrol, model & beberapa utilitas).
Pada dasarnya pengontrol melakukan pemetaan BO ke ChannelObject (menurut saya bukan tempat yang tepat untuk melakukan itu), dan beberapa utilitas tambahan dan serializers. Semua duplikat untuk saat ini. Mereka mengatakan bahwa alasan untuk duplikasi adalah mereka ingin API independen. "Jika besok kita menginginkan perilaku yang berbeda untuk rumah daripada agensi atau ponsel, kita tidak akan berjuang !!"
Apakah ada kasus di mana kita harus menerima kode duplikat?
Jawaban:
Duplikasi bisa menjadi hal yang benar untuk dilakukan, tetapi tidak untuk alasan ini.
Mengatakan "kita mungkin ingin tiga tempat dalam basis kode ini berperilaku berbeda meskipun saat ini, mereka identik" bukanlah alasan yang baik untuk duplikasi skala besar. Gagasan ini dapat berlaku untuk setiap sistem, dan dapat digunakan untuk membenarkan duplikasi apa pun , yang jelas tidak masuk akal.
Duplikasi harus ditoleransi hanya ketika menghapusnya akan secara keseluruhan lebih mahal sekarang karena beberapa alasan lain (tidak bisa memikirkan yang bagus saat ini, tetapi yakinlah akan ada satu - hampir semua yang ada dalam pemrograman merupakan trade-off daripada hukum).
Untuk apa yang Anda lakukan, solusi yang tepat bisa berupa mengekstraksi perilaku yang diduplikasi sekarang menjadi Strategi atau pola lain yang memodelkan perilaku sebagai kelas dan kemudian menggunakan tiga contoh dari kelas yang sama. Dengan begitu, ketika Anda melakukan ingin mengubah perilaku dalam salah satu dari tiga tempat, Anda hanya harus membuat strategi baru dan instantiate yang di satu tempat. Dengan begitu Anda hanya perlu menambahkan beberapa kelas dan membiarkan sisa basis kode hampir tidak tersentuh.
sumber
Sandi Metz, seorang insinyur perangkat lunak dan penulis terkenal di ekosistem Ruby, memiliki posting blog yang hebat dan pembicaraan di mana dia juga berbicara tentang hubungan antara duplikasi dan abstraksi. Dia sampai pada kesimpulan berikut
Dan saya sepenuhnya setuju dengannya. Biarkan saya memberi Anda lebih banyak konteks untuk kutipan ini. Terkadang menemukan abstraksi yang tepat sangat sulit. Dalam kasus seperti itu, sangat menggoda untuk melakukan abstraksi untuk mengurangi duplikasi. Tetapi kemudian Anda mungkin menemukan bahwa abstraksi Anda tidak berlaku untuk semua kasus. Namun, itu mahal untuk mengubah segalanya lagi dan untuk pergi ke rute yang berbeda (untuk penjelasan yang jauh lebih baik tonton dia bicara!).
Jadi ya, bagi saya, ada kasus luar biasa, di mana menerima duplikasi adalah keputusan yang tepat, terutama ketika Anda tidak yakin apa yang akan terjadi dan persyaratan cenderung berubah. Dari posting Anda, saya menganggap ada banyak duplikasi sekarang, tetapi kolega Anda menyarankan bahwa ini mungkin berubah dan untuk tidak memasangkan kedua aplikasi satu sama lain. Menurut pendapat saya ini adalah argumen yang valid dan tidak dapat diabaikan secara umum.
sumber
Jika orang mulai beralasan tentang desain dengan kata-kata "jika besok" , ini sering merupakan tanda peringatan besar bagi saya, terutama ketika argumen digunakan untuk membenarkan keputusan yang mencakup kerja dan usaha ekstra, yang tidak seorang pun benar-benar tahu apakah ini akan pernah membayar, dan mana yang lebih sulit untuk diubah atau dikembalikan daripada keputusan yang berlawanan.
Duplikasi kode mengurangi upaya hanya untuk jangka pendek, tetapi akan meningkatkan upaya pemeliharaan segera, sebanding dengan jumlah baris kode yang digandakan. Perhatikan juga bahwa setelah kode digandakan, akan menjadi sulit untuk menghapus duplikasi ketika ternyata ini adalah keputusan yang salah, sementara jika seseorang tidak menduplikasi kode sekarang, masih mudah untuk memperkenalkan duplikasi nanti jika ternyata tetap menempel pada KERING adalah keputusan yang salah.
Mengatakan bahwa, dalam organisasi yang lebih besar, kadang-kadang bermanfaat untuk mendukung independensi tim yang berbeda atas prinsip KERING. Jika menghapus duplikasi dengan mengekstraksi 95% bagian umum dari API dua komponen baru mengarah ke penggandengan dua tim independen, ini mungkin bukan keputusan paling bijaksana. Di sisi lain, jika Anda memiliki sumber daya terbatas dan hanya akan ada satu tim yang menjaga kedua API, saya yakin itu akan menjadi kepentingan mereka sendiri untuk tidak membuat upaya ganda dan menghindari duplikasi kode yang tidak perlu.
Perhatikan lebih lanjut itu membuat perbedaan jika "Rumah" dan "Agensi" API digunakan oleh aplikasi yang sepenuhnya berbeda secara eksklusif, atau jika seseorang mungkin mencoba untuk menulis membangun komponen di atas API yang dapat digunakan dalam konteks "Rumah" juga seperti dalam konteks "Agensi". Untuk situasi ini, memiliki bagian-bagian umum dari API persis sama (yang Anda hanya bisa menjamin jika bagian-bagian umum tidak digandakan), akan membuat pengembangan komponen seperti itu mungkin jauh lebih mudah.
Jadi jika ternyata akan ada sub tim yang benar-benar berbeda, masing-masing bertanggung jawab untuk masing-masing API, masing-masing dengan jadwal dan sumber daya yang berbeda, maka sekarang saatnya untuk menduplikasi kode, tetapi bukan "berjaga-jaga".
sumber
Duplikasi untuk mencegah kopling . Katakanlah Anda memiliki dua sistem besar dan Anda memaksa mereka untuk menggunakan perpustakaan yang sama. Anda mungkin menggabungkan siklus rilis kedua sistem. Ini mungkin tidak terlalu buruk tetapi katakanlah bahwa satu sistem perlu memperkenalkan perubahan. Yang lain perlu menganalisis perubahan dan mungkin terpengaruh. Terkadang hal itu dapat merusak banyak hal. Bahkan jika kedua belah pihak mampu mengoordinasikan perubahan itu bisa banyak pertemuan, melalui manajer, pengujian, dependensi dan akhir dari tim otonom kecil.
Jadi, Anda membayar harga kode duplikat untuk mendapatkan otonomi dan kemandirian.
sumber