Cara mempertahankan fragmen kode yang sama pada beberapa proyek [ditutup]

9

Saya adalah pengembang indie yang bekerja pada banyak proyek Android. Saya mengalami masalah dengan mempertahankan fungsionalitas yang sama pada proyek yang berbeda. Sebagai contoh, tiga aplikasi saya menggunakan 2 kelas yang sama; karena mereka adalah proyek yang berbeda, ketika saya perlu membuat perubahan di kelas-kelas itu, saya harus membuatnya tiga kali. Apakah ada solusi sederhana untuk masalah umum seperti ini?

pengguna65721
sumber
Bagaimana itu bukan pertanyaan nyata ??
Andre Figueiredo

Jawaban:

15

Pisahkan kode bersama menjadi sebuah perpustakaan, dan sertakan perpustakaan dalam proyek.

Sebagai pengembang Android, Anda mungkin menggunakan Java. Pertimbangkan untuk menggunakan alat manajemen ketergantungan seperti Maven atau Ivy .

Efek sampingnya adalah ini akan membantu menjaga pemisahan kekhawatiran dengan menegakkan modularitas. Biayanya adalah bahwa mungkin perlu beberapa pekerjaan untuk memisahkan; manfaatnya adalah pemeliharaan yang lebih baik di masa depan. Juga, jika Anda memutuskan untuk melakukannya, Anda dapat merilis perpustakaan secara terpisah (baik secara komersial atau sebagai sumber terbuka) dari aplikasi Anda.

Siput mekanik
sumber
2
+1 untuk manajemen ketergantungan. Seharusnya ada opsi yang layak untuk semua bahasa populer.
Adrian Schneider
11

Kontrol versi. Git. Git Submodules.

Letakkan proyek Anda di bawah kontrol versi, menggunakan dvcs seperti git atau mercurial dll. Letakkan kode bersama dalam submodule di git. Gunakan submodule dalam proyek yang membutuhkannya. Saat Anda memperbarui submodule, dapat menarik perubahan ke proyek lain dengan satu perintah.

Hakan Deryal
sumber
1
-1: Ini benar-benar sebuah "promosi evangelikal" dari produk tertentu dengan menyamarkan jawaban atas pertanyaan. Saya awalnya memilih jawaban ini, tetapi pada membaca kembali pertanyaan, memutuskan jawabannya sebenarnya jawaban yang tepat untuk pertanyaan yang berbeda.
mattnz
1
-1 juga. Saya bingung bagaimana ini lebih baik daripada perpustakaan bersama. Ini sepertinya hanya penyalahgunaan git karena Anda benar-benar menolak untuk membuat perpustakaan
TheLQ
5
Yah, git hanyalah alat untuk digunakan. Saya menggunakannya, saya senang dengan itu. Anda dapat menggunakannya, atau menolak untuk menggunakannya. Faktanya adalah, itu memecahkan masalah. Saya tidak mengklaim ini adalah solusi HANYA untuk masalah ini.
Hakan Deryal
1
Ini menggambarkan pendekatan kerja: mengekstraksi perpustakaan meminta beberapa pekerjaan yang mungkin atau tidak mungkin di bawah batasan waktu OP sehingga pendekatan ini memiliki kelebihan.
Francesco
2
+1 Terima kasih atas Tautannya! Jika komponen bersama sedang dalam pengembangan aktif, solusi ini memiliki (IMHO) manfaat yang jelas dibandingkan dengan solusi perpustakaan bersama.
JanDotNet
5

Tidak ada orang lain yang menyebutkan pedang bermata dua, jadi saya akan menambahkan 2 sen saya. Jika Anda memiliki banyak proyek dan semuanya berbagi beberapa kode yang dapat digunakan kembali, sesuai dengan praktik / prinsip pemrograman yang baik (misalnya KERING), Anda harus menempatkan kode di satu tempat global dan menyusunnya sedemikian rupa sehingga dapat dibagikan oleh semua proyek Anda tanpa modifikasi apa pun. Dengan kata lain, tetapkan antarmuka menjadi generik dan cukup umum untuk semua orang.

Ada beberapa opsi untuk melakukan ini: 1) Buat proyek dasar yang bergantung pada orang lain. Proyek ini dapat membuat distribusi biner yang dikonsumsi oleh proyek lain. 2) Tarik model sumber terbuka di dalam organisasi Anda. Memiliki kode umum menjadi cabang kode sendiri dan memiliki proyek lain menarik kode dengan cara yang sama Anda akan mengambil kode sumber dari OSS online.

Sekarang di sinilah pedang datang ...

Menempatkan kode ke tempat umum yang bergantung pada proyek / orang lain bisa menjadi agak mahal. Katakanlah Anda memiliki sepotong kode dan 4 proyek lainnya bergantung padanya. Salah satu pelanggan Anda yang menggunakan proyek A menemukan bug dan Anda harus memperbaikinya. Anda buru-buru memperbaiki dan pelanggan itu senang. Tapi Anda baru saja memodifikasi beberapa kode yang bergantung pada 3 proyek lainnya. Apakah Anda menguji ulang semua itu untuk memastikan tidak ada kondisi tepi yang diperkenalkan?

Kode umum juga harus dibuat lebih hati-hati dan antarmuka modul harus dirancang jauh lebih baik karena kode itu harus mengakomodasi tidak hanya satu tetapi 4 klien dan masing-masing dari mereka mungkin hanya menggunakan kode ini dengan sedikit perbedaan.

Jika proyek Anda berada pada siklus rilis yang berbeda, Anda harus lebih berhati-hati dalam mengelola kode umum. Anda tidak bisa begitu saja membuat perubahan dalam kode umum karena proyek B membutuhkan fungsionalitas baru, jika Anda 3 hari lagi memotong gambar akhir untuk proyek C.

Saya tidak mengatakan perpustakaan umum bukanlah solusi yang tepat. Saya adalah pendukung kuat KERING dan saya telah membuat dan mendukung kode umum sebelumnya dan terus melakukannya. Hanya ingin menaruhnya di luar sana yang hanya membuat kode umum akan memiliki biaya sendiri.

Jika Anda adalah satu-satunya yang menggunakan kembali kode ini, ini tidak seburuk itu. Jika Anda memiliki tim insinyur dan mereka mulai menggunakan kode umum, pengeluaran semakin meningkat. Jika orang lain terlibat, perkirakan menempatkan kode ke perpustakaan umum untuk mengambil 3 kali lebih banyak waktu yang dibutuhkan untuk sampai ke titik di mana Anda berpikir itu "lengkap". Anda perlu a) membuat perpustakaan lebih kuat untuk melindungi terhadap semua jenis kondisi tepi dan penggunaan yang tidak valid, b) memberikan dokumentasi sehingga orang lain dapat menggunakan perpustakaan dan c) membantu orang lain men-debug ketika mereka menggunakan perpustakaan dengan cara yang Anda belum diantisipasi dan dokumentasi Anda tidak mencakup kasus penggunaan khusus mereka.

Beberapa saran yang bisa saya tawarkan:

  1. Memiliki kode umum yang tercakup oleh pengujian unit otomatis dapat membantu dan memberi Anda sedikit pemikiran bahwa ketika Anda melakukan perubahan, Anda tidak hanya merusak beberapa proyek lain.
  2. Saya hanya akan menempatkan fungsionalitas yang sangat stabil ke dalam kode umum. Jika Anda menulis kelas tahun lalu untuk melakukan manajemen timer dan Anda belum mengubahnya dalam 9 bulan dan sekarang Anda memiliki 3 proyek lain yang membutuhkan penghitung waktu, maka pastikan itu adalah kandidat yang baik. Tetapi jika Anda baru saja menulis sesuatu minggu lalu, well ... Anda tidak memiliki banyak pilihan (dan saya benci menyalin / menempel kode mungkin lebih dari orang berikutnya) tetapi saya akan berpikir dua kali untuk membuatnya menjadi umum.
  3. Jika sepotong kode sepele tetapi Anda telah menggunakannya di beberapa tempat, mungkin lebih baik menggigit peluru, biarkan KERING sendirian dan biarkan beberapa salinan hidup.
  4. Kadang-kadang membayar untuk tidak hanya meletakkan kode umum ke lokasi umum dan meminta semua orang untuk merujuknya. Melainkan memperlakukan kode umum sebagai versi yang dapat dirilis sendiri dengan versi, tanggal rilis dan semuanya. Dengan cara ini proyek C dapat mengatakan, "Saya menggunakan perpustakaan umum v1.3" dan jika proyek D membutuhkan fungsionalitas baru, Anda meninggalkan v1.3 sendirian, lepaskan v1.4 dan proyek C tidak terpengaruh. Perlu diingat, ini JAUH, JAUH lebih mahal untuk memperlakukan kode umum sebagai produknya sendiri daripada sekadar memeriksanya ke lokasi umum.
DXM
sumber
1

Ini adalah solusi ideal, dan mungkin perlu upaya untuk bekerja.

Prinsip KERING menyatakan bahwa harus ada sumber kebenaran otoritatif tunggal. Ini menentukan penggunaan repositori sumber tunggal untuk semua logika program, tanpa duplikasi; file yang diorganisasikan untuk mempromosikan berbagi dan menggunakan kembali dokumen.

Persyaratan komunikasi pragmatis dalam lingkungan multi-tim yang terdistribusi menunjukkan bahwa harus ada beberapa repositori independen, satu untuk setiap proyek atau kolaborasi.

Saya akan mendekati masalah ini dengan mengirimkan kepada yang tak terhindarkan: Anda harus mengambil kedua pendekatan secara bersamaan, dan kami akan menggunakan skrip & otomatisasi untuk memuluskan fakta bahwa pendekatannya saling bertentangan.

:-)

Satu repositori terpadu akan menjadi satu-satunya sumber otoritatif Anda. Proses pembangunan untuk setiap proyek akan menyalin semua file yang digunakan oleh proyek itu (dan hanya file-file itu) ke lokasi perantara, kemudian membangun dari lokasi perantara tersebut. (Serentak atau beberapa alat serupa dapat digunakan untuk memindahkan delta, bukan seluruh file).

Lokasi perantara ini dapat digunakan sebagai copy pekerjaan lokal untuk set repositori sekunder, turunan, atau hilir. Skrip kait pascakomitmen pada repositori otoritatif akan memperbarui semua lokasi perantara, dan, untuk masing-masing, periksa apakah telah berubah, dan buat komit yang sama ke repositori sekunder yang sesuai jika perubahan terdeteksi.

Dengan cara ini, beberapa repositori sekunder disimpan dalam sinkronisasi dengan repositori sumber otoritatif tunggal, dan proses pembuatan memastikan bahwa repositori sekunder berisi semua (mungkin dibagi) dokumen dan file lain yang diperlukan agar build berhasil. Akhirnya, dan yang paling penting, proses pengembangan dan pembuatan memastikan bahwa file diedit di satu tempat dan satu tempat saja, dan bahwa semua salinan tetap konsisten dan terbaru.

William Payne
sumber