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?
project
personal-projects
code-organization
pengguna65721
sumber
sumber
Jawaban:
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.
sumber
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.
sumber
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:
sumber
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.
sumber