Membandingkan semua penyair, mari kita asumsikan kebutuhan bisnis nyata.
(misalnya, pengiriman adalah kode sumber, pelanggan berasal dari lini bisnis yang sama dan karenanya saling bersaing, dan model bisnis Anda berjanji untuk merahasiakan rahasia mereka)
Lebih jauh, mari kita asumsikan bahwa perusahaan Anda memiliki alat untuk mempertahankan semua cabang, baik tenaga kerja (katakanlah 100 pengembang yang didedikasikan untuk penggabungan, dengan asumsi keterlambatan rilis 5 hari; atau 10 dev dengan asumsi keterlambatan rilis 50 hari adalah OK), atau pengujian otomatis yang begitu mengagumkan sehingga penggabungan otomatis benar-benar diuji baik untuk spesifikasi inti dan spesifikasi ekstensi di setiap cabang, dan dengan demikian hanya perubahan yang tidak menggabungkan "bersih" yang memerlukan campur tangan manusia. Jika pelanggan Anda membayar tidak hanya untuk penyesuaian tetapi untuk pemeliharaannya, ini mungkin model bisnis yang valid.
Pertanyaan saya (dan nay-sayers), adalah, apakah Anda memiliki orang yang berdedikasi yang bertanggung jawab untuk pengiriman ke setiap pelanggan? Jika Anda, katakanlah, perusahaan 10.000 orang, mungkin itu masalahnya.
Ini dapat ditangani oleh arsitektur plugin dalam beberapa kasus, katakanlah inti Anda adalah trunk, plugin dapat disimpan di dalam trunk atau cabang, dan konfigurasi untuk setiap pelanggan adalah file dengan nama unik atau disimpan di cabang pelanggan.
Plugin dapat dimuat pada saat dijalankan, atau dibangun pada waktu kompilasi.
Benar-benar banyak proyek dilakukan seperti ini, masalah yang sama secara fundamental masih berlaku - perubahan inti sederhana sepele untuk diintegrasikan, perubahan konflik harus dibatalkan, atau perubahan diperlukan untuk banyak plugin.
Ada kasus ketika plugin tidak cukup baik, saat itulah begitu banyak internal inti harus di-tweak sehingga jumlah antarmuka plugin menjadi terlalu besar untuk ditangani.
Idealnya ini akan ditangani oleh pemrograman berorientasi aspek , di mana trunk adalah kode inti, dan cabang adalah aspek (yaitu kode tambahan dan instruksi bagaimana menghubungkan ekstra ke inti)
Contoh sederhana, Anda dapat menentukan bahwa kebiasaan foo
dijalankan sebelum atau setelah inti klass.foo
atau menggantikannya, atau membungkusnya dan dapat mengubah input atau output.
Ada banyak perpustakaan untuk itu, namun masalah konflik penggabungan tidak hilang - penggabungan yang bersih ditangani oleh AOP dan konflik masih membutuhkan intervensi manusia.
Akhirnya bisnis seperti itu benar-benar harus memusatkan perhatian pada pemeliharaan cabang , yaitu, apakah fitur khusus pelanggan X begitu umum sehingga lebih murah untuk memindahkannya ke inti, meskipun tidak semua pelanggan membayar untuk itu?