Berbagi kelas atau antarmuka antara berbagai proyek


17

Saya mencari beberapa jawaban di SO atau di sini, tetapi tanpa hasil, itu sebabnya saya akan bertanya kepada Anda.

Mari kita asumsikan saya memiliki dua proyek yang berbeda - misalnya bagian server dan bagian klien dari suatu aplikasi. Saya mengembangkan bagian saya sendiri, sementara teman saya membuat bagian kedua. Tetapi kami berdua harus menggunakan beberapa antarmuka umum seperti Useratau AccountInfoatau ChangableAccount... apa pun untuk memastikan kompatibilitas. Misalnya jika klien mengirim data Pengguna ke server, maka server harus beroperasi pada kelas yang sama. Sama dengan antarmuka dll. Selain itu, jika ada perubahan dalam antarmuka umum, kedua proyek harus menyesuaikan kodenya dengan situasi baru.

Satu-satunya solusi yang dapat saya lihat sekarang adalah, untuk membuat satu proyek ekstra di mana semua hal umum didefinisikan. Kami, saya dan teman saya, harus menambahkan proyek ini sebagai ketergantungan pada proyek utama (klien atau server). Proyek bersama dapat dikelola oleh beberapa sistem kontrol versi, jadi kami selalu memiliki kondisi terkini.

Solusi apa lagi yang akan Anda sarankan? Bagaimana masalah seperti itu diselesaikan di aplikasi profesional?


1
Anda harus mengontrol versi apakah Anda berbagi sesuatu atau tidak. Apakah Anda mengatakan Anda tidak menggunakan kontrol versi untuk proyek klien dan server? Jika demikian, segera perbaiki.
Sebastian Redl

Jawaban:


15

buat satu proyek ekstra di mana semua hal umum didefinisikan

Ini adalah langkah tepat pertama untuk berbagi bagian yang dapat digunakan kembali - dan ini bagian yang mudah. Bagian yang lebih menantang adalah untuk memutuskan apakah dua proyek yang menggunakan perpustakaan bersama harus memiliki siklus rilis independen (atau tidak), dan apakah mungkin "proyek A" menggunakan versi 1.0 lib Anda bersama, sementara proyek B menggunakan versi 2.0 pada saat yang sama .

Jika Anda ingin yang terakhir dimungkinkan, Anda harus memiliki skema versi ketat dan manajemen rilis untuk perpustakaan Anda (dan nomor versi sebagai bagian dari nama file perpustakaan, seperti yang disarankan oleh @RoryHunter). Anda juga harus berhati-hati tentang kompatibilitas mundur di lib Anda dalam situasi ini. Pustaka Anda harus dikelola sebagai produk terpisah, menambahkan tes unit untuk memastikan versi berbeda dalam produksi akan menjadi ide yang baik, dan alat seperti Maven juga masuk akal.

Namun, jika Anda ingin mencegah situasi itu, Anda harus mengelola "proyek A", "proyek B" dan lib Anda sebagai proyek bersama, dengan pengembangan gabungan, proses pembangunan dan pelepasan. Ini akan memungkinkan untuk mengubah antarmuka umum dari pustaka bersama jauh lebih sering daripada dalam skenario pertama. Dan Anda tidak perlu sesuatu seperti Maven atau nomor versi di nama file perpustakaan. Tetapi tradeoffnya adalah bahwa A dan B tidak dapat dikembangkan secara independen lagi.


13

Solusi Anda adalah yang tepat. Masukkan kode bersama ke proyek lain yang membuat file JAR sendiri, dan gunakan di kedua proyek. Saat membuat file JAR, Anda mungkin ingin memasukkan versi dalam nama, misalnya dalam gaya Debian;

libmyproject-shared-1.0.jar

Itu tidak mencegah masalah versi, tetapi seharusnya membantu. Saya tidak pernah menggunakan Maven, tetapi saya mengerti ini bisa membantu dalam situasi ini.


2

buat satu proyek ekstra di mana semua hal umum didefinisikan

Persis seperti itulah. Net mengharapkan Anda melakukannya.

Abstrak benda-benda ini menjadi Majelis ketiga, dan referensi ini dari kedua proyek. Saya sarankan melakukannya sebagai Antarmuka, yang lebih bersih, tapi ...

Hati-hati dengan Serialisasi:

  • Satu-satunya cara saya bisa langsung membuat objek serial / deserialise antara dua program (memang ini beberapa waktu yang lalu menggunakan Framework 2.0) adalah menginstal perakitan "bersama" ke dalam Cache Perakitan Global pada mesin klien dan server. Jika perakitan itu "lokal" untuk masing-masing proyek, maka Kerangka Kerja melihat mereka sebagai Jenis diskrit dan menolak [de] membuat serial yang satu ke yang lain.
  • Dan [de] objek serialisasi yang diketik sebagai Antarmuka adalah sedikit "tantangan". Tipe asli, yang bukan Antarmuka tampaknya tidak "membuatnya" melalui Serialization "pipe" sehingga penerima tidak tahu Tipe konkrit apa yang harus "dibangun" dari aliran yang masuk.

1

Seperti yang disarankan orang lain, proses berpikir Anda akurat. Secara profesional, sebagian besar akan menggunakan sesuatu seperti Maven atau Gradle untuk mengelola dependensi ini secara efisien.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.