Bagaimana cara mengatur kode berulang?


11

Tim saya membuat banyak sekali formulir web. Sebagian besar formulir ini hanya mengirim email, dan beberapa menulis database sederhana.

Saat ini, setiap formulir hidup dalam solusi terpisah di Server Visual Studio Team Foundation. Itu berarti kami memiliki hampir 100 proyek formulir yang berbeda, yang membuatnya sulit untuk mempertahankan konsistensi. Setiap bentuk unik karena bidangnya berbeda, tetapi semuanya melakukan hal yang sama.

Saya mencari cara untuk menyingkat ini, dan saya benar-benar dapat menggunakan beberapa panduan.

  • Haruskah saya mencoba membuat satu file solusi dengan semua proyek formulir kami di dalamnya? Tidak ada banyak kode pipa ledeng, walaupun saya bisa membuat beberapa kelas pembantu untuk membantu dengan pemformatan email dan semacamnya. Akan sangat membantu untuk dapat berbagi CSS, JavaScript, kontrol dan gambar di seluruh proyek.
  • Mengingat bahwa kami adalah toko Microsoft, apakah ada manfaat nyata untuk menggunakan sesuatu seperti MVC di atas formulir Web untuk skenario khusus ini? Saya dijual dengan konsep MVC secara keseluruhan, tetapi akankah ini membantu saya mengumpulkan formulir pengumpulan data 15-bidang secara lebih efisien jika semua formulir itu mengirim email? Bentuk yang membuat saya berpikir tentang hal ini memiliki sedikit logika yang dibangun untuk menunjukkan dan menyembunyikan bidang berdasarkan tanggapan pengguna dan sepertinya akan kurang efisien untuk menggunakan MVC dan jQuery.

2
Apa ini bermigrasi dari meta di sini? Harus di SO.
Josh K

1
@Josh Stack Overflow adalah untuk pertanyaan yang terkait langsung dengan masalah spesifik dalam kode. Desain program dan alur kerja sesuai topik di sini.

@ Mark: Ini kedengarannya tidak terlalu subyektif, karena di sana akan ada solusi ideal "praktik terbaik" yang mudah diberikan. Saya bukan orang MS jadi saya tidak tahu apa kerumitannya, namun saya akan menebak bahwa ini akan dijawab dengan cara yang tidak subyektif.
Josh K

Sepakat. Ini akan ditutup pada SO.
Walter

1
Sudah ditanyakan pada SO di sini
ChrisF

Jawaban:


3

Re-factoring dengan aman tanpa tes sulit dan penuh dengan bahaya.

Saya akan mulai dengan:

  • Menulis test case yang mencakup berbagai jenis input ke dalam formulir tersebut dan output yang diharapkan. Kedengarannya seperti ini tidak akan memakan waktu terlalu lama karena Anda merasa sebagian besar bentuk ini identik dalam fungsinya, atau dekat dengannya.

  • Jalankan kotak uji tersebut terhadap 100 atau lebih formulir (aktifkan cakupan kode untuk membantu Anda melacak jalur kode).

Setelah itu Anda berada dalam posisi untuk melihat apa yang dapat Anda faktor ulang dengan aman, lalu Anda dapat (contoh):

  • Jalankan alat deteksi duplikasi kode Anda (tidak yakin apa namanya .NET, di Jawa kami memiliki CPD). Segera Hapus 13 bentuk identik. Sekarang jalankan kembali tes - Yay! Mereka semua lulus kecuali untuk form 11, OK, jadi kami belum bisa menghapusnya.

  • Hapus semua kode pemformatan email lokal dan minta semua formulir untuk memanggil modul pemrosesan email yang umum. Jalankan tes, mereka semua lulus kecuali satu, hhmmm OK .... karakter UTF-8, perbaiki dalam modul generik, jalankan tes lagi, ya kita semua baik-baik saja!

bilas dan ulangi.


2
+1 Lihat Michael Feathers Bekerja Efektif dengan Legacy Code amazon.com/dp/0131177052 untuk petunjuk tentang cara mendekati refactoring.
Michael Brown

Referensi bagus - saya suka buku itu.
Martijn Verburg

0

Saya sarankan abstrak bagian kiriman. Menggunakan Model / View / Controller, masukkan formulir dalam View, dan minta mereka menggunakan controller yang sama. Pengontrol ini bisa melakukan tindakan umum, seperti mengirim email ke alamat default, atau mengalihkan data formulir ke pengontrol yang bisa. Dengan begitu yang harus Anda lakukan untuk membuat formulir baru adalah membuat formulir dan mengarahkan output ke controller itu. Archetecture ini dapat dimuat dalam satu proyek, yang akan memungkinkan Anda untuk berbagi CSS dan javascript seperti yang Anda sebutkan.

Untuk menangani pemformatan email, saya akan mulai dengan membuat formatter generik, katakanlah yang hanya mencantumkan nama elemen nilai dan nilai-nilai, serta stuf tipe metdata lainnya seperti waktu yang dikirimkan, dll. Anda bisa menjadikan ini seindah yang Anda inginkan . Lalu, jika Anda benar-benar membutuhkan penanganan khusus lebih dari itu, tambahkan pabrik. Pabrik akan mengembalikan antarmuka formatter. Kemudian, di dalam pabrik, Anda bisa melakukan pencarian untuk formatter untuk formulir tertentu atau mengembalikan yang generik jika tidak ada yang spesifik. Desain ini juga akan memudahkan pengujian unit cntroller, karena Anda dapat dengan mudah menyediakan formatter mock untuk keperluan pengujian.

Kebetulan, saya tidak akan memasukkan alamat email sebagai argumen dari formulir. Jika Anda perlu mengirim ke beberapa alamat, saya sarankan memiliki tabel pencarian yang berisi semua formulir dan email untuk mengirimnya. Ini dapat diimplementasikan dalam XML atau dalam kode (saya telah melihat keduanya, meskipun saya tidak yakin apakah keduanya lebih baik) Ini akan membantu menghindari spammer mendapatkan alamat email Anda dari halaman formulir.


Terima kasih balasannya. Dalam arsitektur ini, di mana Anda akan menangani memformat email yang dikirim? Saya ingin abstrak ini, tapi saya tidak bisa memikirkan cara untuk melakukan format tanpa membuat stringbuilder dan menjatuhkan bidang di antara blok teks statis. Ini tampaknya spesifik untuk setiap formulir.
Josh Earl

Juga, apakah ada rekomendasi tentang penanganan logika formulir seperti mengisi dropdown berdasarkan pilihan pada dropdown lain? Apakah jQuery satu-satunya pilihan jika kita menggunakan rute MVC?
Josh Earl

@JoshEarl: Saya telah mengedit ide untuk formatter, tapi saya tidak bisa memberikan saran mengenai jQuery, dll. Sisi halaman web bukan area yang saya cormfortable untuk membuat rekomendasi tentang. Anda mungkin harus menggunakan desain MVC penuh, satu controller per halaman, jika semuanya terlalu rumit. Seperti yang dikatakan @Martijn, pengujian unit akan membantu Anda melihat dengan tepat apa kebutuhan Anda. Desain saya berasumsi cukup banyak kesamaan antara bentuk.
Michael K
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.