Saya selalu mencoba untuk mengikuti DRY prinsip ketat di tempat kerja; setiap kali saya've ulang kode dari kemalasan menggigit kembali bila nanti aku harus menjaga kode itu di dua tempat.
Tapi sering saya menulis kecil metode (mungkin 10 - 15 baris kode) yang harus digunakan kembali untuk dua proyek yang dapat't referensi satu sama lain. Metode ini mungkin menjadi sesuatu yang harus dilakukan dengan jaringan / string / MVVM dll. dan umumnya berguna metode tidak spesifik untuk proyek ini awalnya duduk di.
Cara standar untuk menggunakan kembali kode ini akan membuat sebuah proyek independen untuk dapat digunakan kembali kode dan referensi proyek itu ketika anda membutuhkannya. Masalah dengan hal ini adalah kita berakhir di salah satu dari dua yang kurang ideal skenario:
.DLL
hanya untuk sedikit kode?dasar.umum
yang telah folder untuk hal-hal seperti yang saya sebutkan di atas: jaringan, manipulasi string, MVVM dll. Itu sangat berguna, tapi referensi itu sia-sia diseret dengan itu semua tidak relevan code anda didn't perlu.Jadi pertanyaan saya adalah:
Bagaimana sebuah tim software terbaik untuk pergi tentang menggunakan kembali potongan-potongan kecil dari kode di antara proyek-proyek?
I'm tertarik terutama jika ada orang yang telah bekerja di perusahaan yang memiliki kebijakan di daerah ini, atau yang telah menemukan dilema ini secara pribadi seperti yang saya miliki.
catatan: Saya menggunakan kata-kata "Proyek", "Solusi" dan "Referensi" datang dari latar belakang di .Pengembangan NET di Visual Studio. Tapi aku'm yakin masalah ini adalah bahasa dan platform independen.
Jika mereka benar-benar dapat digunakan kembali metode / kelas, anda bisa menulis mereka ke dalam sejumlah kecil 'Swiss Army Knife' perpustakaan. Kita lakukan ini cukup sering di perusahaan saya; kita menyebutnya kerangka kerja perpustakaan:
Framework.Data
- Utilitas untuk bekerja dengan query database.Framework.ESB
- metode Standar untuk berinteraksi dengan kami enterprise service busFramework.Logging
- Bersatu loging sistemFramework.Layanan
- Utilitas untuk berinteraksi dengan layanan webFramework.String
- Utilitas untuk maju manipulasi string / fuzzy string mencari dll.Dalam semua, ada sekitar selusin atau lebih perpustakaan. Anda dapat benar-benar mendistribusikan kode namun yang anda lihat cocok, sehingga anda don't harus berakhir dengan ratusan atau membuang semuanya ke dalam satu raksasa perakitan. Saya menemukan pendekatan ini cocok karena hanya beberapa proyek kami akan perlu Framework.Data
dan hanya beberapa akan membutuhkan Framework.String`, sehingga konsumen dapat memilih hanya bagian-bagian dari kerangka kerja yang relevan dengan proyek tertentu.
Jika mereka're-benar hanya cuplikan, dan tidak aktual metode / kelas yang dapat dengan mudah digunakan kembali, anda bisa mencoba hanya mendistribusikan mereka sebagai potongan kode ke dalam IDE (misalnya Visual Studio Potongan Kode). Tim I've bekerja dengan di masa lalu memiliki kesamaan cuplikan perpustakaan yang membuatnya lebih mudah bagi semua orang untuk mengikuti standar praktek coding dengan kode internal juga.
Saya tidak setuju dengan jawaban yang diterima untuk banyak alasan.
Dalam pengalaman saya, ketika saya melihat "lain-lain" perpustakaan seperti jawaban yang diterima, mereka're alasan untuk reinvent the wheel (atau tidak ditemukan di sini(NIH)) - yang jauh lebih besar dari dosa melanggar Dont Repeat Yourself (KERING).
Kadang-kadang melanggar KERING bisa menjadi kompromi yang masuk akal, itu lebih baik daripada memperkenalkan kopling ketat. Reuse adalah perhatian sekunder dibandingkan dengan yang baik berorientasi objek desain. Sedikit (maksud saya jumlah kecil, menerapkan Aturan Tiga) duplikasi adalah lebih mudah untuk memahami dari spaghetti code dasar.
Pendekatan berbagai tujuan umum perpustakaan menetapkan contoh buruk. Hal ini menyebabkan denda granularity perakitan dan terlalu banyak majelis yang buruk. Saya baru-baru ini mengurangi in-house dari 24 perpustakaan untuk 6 perpustakaan. Ini meningkatkan waktu kompilasi dari beberapa menit sampai ~20 detik. Visual studio juga lebih lambat untuk memuat dan kurang responsif dengan lebih rakitan. Memiliki terlalu banyak perpustakaan juga menyebabkan kebingungan ke mana kode harus hidup; lebih sedikit, lebih sederhana aturan.
Mengapa barang-barang di .Net Framework tidak cukup baik? Kerangka ini cukup besar; berkali-kali aku've melihat kode yang kembali menerapkan hal-hal yang sudah ada di sana. Benar-benar memastikan bahwa kerangka yang mengisi celah-celah dalam .Net framework dan tidak hanya ada untuk alasan estetika (misalnya "aku't seperti .Net framework di sini" atau mungkin beberapa prematur optimasi)
Memperkenalkan lapisan lain ke dalam arsitektur memiliki signifikan kompleksitas biaya. Mengapa lapisan ada? I've terlihat palsu reuse, maksud saya itu, kode ini dibangun di atas sebuah kerangka. Itu akan jauh lebih efisien untuk menerapkannya langsung di atas standar perpustakaan.
Menggunakan standar teknologi (seperti .Net framework dan populer 3rd party/open source perpustakaan) memiliki manfaat yang sering lebih besar daripada perbandingan teknologi keuntungan dari bangunan itu sendiri. Hal ini lebih mudah untuk menemukan bakat yang tahu teknologi ini dan sudah ada pengusaha yang akan berinvestasi lebih banyak dalam belajar itu.
Rekomendasi saya:
Untuk potongan-potongan kecil dari kode -- mengatakan satu kelas dengan dependensi tidak -- kita cenderung hanya copy dan paste kode ke dalam proyek. Ini kedengarannya seperti sebuah pelanggaran KERING, dan I'll mengakui hal ini dapat di kali. Tetapi dalam jangka panjang itu telah jauh lebih baik daripada memiliki semacam besar, multi-headed commons proyek untuk beberapa alasan.
Pertama, itu hanya lebih mudah untuk memiliki kode yang berguna, terutama ketika membangun dan debugging barang-barang.
Kedua, selalu anda'll ingin membuat beberapa tweak kecil untuk kode umum untuk proyek itu. Jika anda've mendapat salinan lokal dari sumber daripada anda hanya dapat membuat tweak dan menyebutnya hari. Jika ada shared library maka anda bisa mengambil tweaking perpustakaan itu dan kemudian memastikan anda don't mematahkan semua aplikasi lain atau membuat versi mimpi buruk.
Jadi jika isn't gemuk cukup untuk itu's sendiri namespace kita cenderung hanya mendorong itu ke dalam sesuai bit pada proyek dan menyebutnya hari.
Kedua solusi yang anda jelaskan adalah tidak seburuk itu. Di .NET anda juga referensi perakitan dari GAC bahkan jika anda hanya menggunakan satu kelas itu. 'Menyeret relevan kode' tidak ada masalah seperti yang anda mungkin berpikir. Dalam hal ini sangat penting untuk setidaknya menjaga berkaitan dengan metode dan kelas bersih yang diselenggarakan di ruang nama yang berbeda. Selain itu praktek yang baik untuk desain API harus diterapkan untuk mencegah solusi ini menjadi berantakan.
Jika datang ke sangat kecil bit kode, saya pikir pendekatan berikut adalah suplemen yang baik untuk sebuah proyek umum: Memungkinkan mereka untuk dapat digandakan dalam solusi yang berbeda. Berurusan dengan mereka seperti praktek-praktek terbaik: dokumen dan berkomunikasi mereka untuk tim.
I've hanya pernah bekerja di "perusahaan" lingkungan di mana hal semacam ini telah menjadi masalah dan setiap kali itu's menjadi pilihan kedua yang's telah diadopsi. Untuk sebagian besar itu's bekerja baik-baik saja karena ada belum't pernah ada kendala pada aplikasi footprint.
Namun, setelah menghabiskan pekan lalu dengan start-up yang sedang berjalan sendiri Nuget server I'm cenderung untuk menyarankan ini sebagai alternatif. Tentu saja masalah yang saya harapkan untuk muncul akan menemukan-kemampuan.
Jika proyek-proyek yang sesuai granular dan namespaces yang masuk akal maka aku bisa melihat ini menjadi pendekatan yang populer di tempat-tempat.
I've baru-baru ini berpikir tentang hal ini dan apa yang terjadi kepada saya adalah sebuah perpustakaan besar dari metode umum seperti yang telah disebutkan sejauh ini, tapi dengan twist. Proyek perpustakaan akan memungkinkan anda untuk mengkonfigurasi pada waktu kompilasi yang buah yang termasuk jenis seperti BusyBox project. Dengan pendekatan itu, anda dapat memiliki wastafel dapur gaya perpustakaan repo, tapi hanya ambil alat yang anda butuhkan saat kompilasi.
GitHub memiliki cukup alat yang berguna untuk menyimpan potongan kode https://gist.github.com/
Menyimpan potongan anda sebagai git repositori yang dapat anda tetap pribadi, atau gunakan untuk berbagi cuplikan dengan orang lain.
saya telah mengalami masalah banyak, dan saya prefered solusi untuk posting kode di github/kemaluan web-enabled repositori. ini memecahkan banyak masalah -
Satu hal yang saya akan merekomendasikan anda - tidak peduli di mana anda menyimpan potongan anda, selalu google hal-hal sebelum anda menggunakannya. hal-hal berubah sepanjang waktu. disimpan potongan menghemat waktu, tetapi juga berkembang biak puas.
Tergantung pada ukuran dari tim/proyek/perusahaan ini akan agak sulit untuk dilakukan efficintly, kecuali itu sudah dibangun ke lingkungan anda entah bagaimana, dan setiap solusi yang anda akan menemukan (jika anda menerapkannya) akan biaya uang. (Mungkin anda lebih aman, tetapi anda tidak akan dapat mengukur dengan mudah). Anda'll harus memeriksa apakah itu's senilai harga. Perlu diingat juga, bahwa reusable solusi cenderung menjadi abstrak dan sering akan cocok untuk banyak situasi, tetapi tanpa menjadi optimal.
Dalam kasus manapun, jika anda ingin melakukan hal ini untuk kode yang dihasilkan oleh lebih dari satu orang, pada awalnya anda'll perlu kesadaran dari semua orang dan kerjasama. Ini termasuk pengembang dan manajer.
Kemudian anda'akan perlu untuk memastikan anda mengetahui ruang lingkup di mana anda ingin melakukan hal ini. Tim? Proyek ini? Departemen? Perusahaan? Tergantung pada jawaban jenis kode anda'll dimasukkan ke dalam solusi tersebut akan berbeda-beda, seperti yang akan granularity yang anda menyesuaikan dll. Setelah anda memutuskan pada seseorang ini (sebaiknya dengan beberapa antusiasme untuk ide - anda?) harus duduk dan mulai untuk menempatkan beberapa struktur dalam hal ini.
Hanya menciptakan seperti dll tidak akan cukup untuk melakukan trik, meskipun. Dalam rangka untuk membuat mereka berguna anda'll perlu untuk mengiklankan mereka (untuk pengguna dan kontributor) dan menjaga mereka seperti setiap bagian lain dari perangkat lunak, yang biasanya berarti bahwa anda perlu untuk menempatkan seseorang yang bertanggung jawab untuk mereka untuk waktu yang lama. Anda'll membutuhkan dokumentasi yang dapat diandalkan, serta, yang kemudian akan membutuhkan perawatan juga. Dengan sedikit keberuntungan dan kerja sama anda mungkin berakhir dengan beberapa praktik terbaik, tetapi dapat juga dengan mudah berkembang menjadi sebuah proyek it's sendiri, tergantung pada ukuran dan jumlah tim yang terlibat. Dan untuk itu anda'll masih perlu dukungan manajemen.
Kami memiliki sebuah proyek terpisah "utilitas" di mana kita menyimpan semua ini kecil metode bersama-sama dengan tes.
Ketika sebuah proyek membutuhkan beberapa utilitas itu hanya menambahkan file sumber dengan yang diperlukan dengan metode "tambahkan sebagai link".
Ini berarti bahwa tidak ada jangka waktu dependensi ditambahkan (kecuali file yang disertakan membutuhkan satu).
Sistem telah bekerja dengan baik, tetapi seperti semua orang lain perlu diciplin pada apa yang adalah utilitas. Requiering tinggi cakupan uji telah bekerja dengan baik untuk kami dan juga pemeriksaan baik penggunaan dokumentasi. Penemuan ini masih belum terpecahkan masalah bagi kita.
Salah satu kompleksitas dengan utilitas proyek adalah untuk menentukan tingkat keterlihatan pada item. Aturan praktis adalah bahwa metode harus internal dan struktur data publik.
Perusahaan saya menggunakan intranet-lokal web services. Kami memiliki beberapa layanan web yang ditetapkan sebagai internal umum layanan web, dan ketika proyek lain yang membutuhkan akses ke salah satu layanan ini mengirimkan permintaan http dengan yang didefinisikan antarmuka. Sejak itu's pada intranet, bertempat di server yang sama pertanian, ini permintaan yang sangat cepat.
Jelas ini hanya bekerja dengan aplikasi internet (dan hanya bekerja dalam milidetik kali ketika pada jaringan lokal yang sama), tetapi ia memiliki beberapa benar-benar baik keuntungan.
Saya baru-baru ini datang dengan layanan ini: Snip2Code (http://www.snip2code.com).
It's cara yang menarik untuk berbagi hanya potongan anda (tidak sepenuhnya perpustakaan) dengan tim anda. Istirahat titik biasa untuk membuat perpustakaan umum yang harus dirujuk dalam proyek-proyek lain, dan menurut pendapat saya ini adalah visi yang berharga.
Selain itu, ada banyak skenario penggunaan umum perpustakaan hanya doesn't berlaku: let's mempertimbangkan untuk contoh beberapa Desain Pola seperti Singleton, Strategi atau Pengamat. Anda dapat membuat perpustakaan untuk mendukung pola tersebut tapi masih ada's tidak ada cakupan 100%.
Real butuhkan adalah untuk memiliki alat untuk berbagi praktek umum di antara tim. Saya mencoba untuk menggunakan Github's gists tapi aku'm terjebak dengan pencarian mereka (benar-benar miskin) dan dengan fakta bahwa saya tidak dapat berbagi mereka di antara tim saya dan tidak dengan yang lain...
(Disclaimer: saya'm salah satu pendiri Snip2Code, dan aku bersama - sama dengan co-founder - dalam pola pikir yang sama beberapa waktu yang lalu: ini adalah mengapa kita memutuskan untuk memulai proyek ini!!)