Tekrarlayan kod nasıl düzenlenir?


11

Ekibim çok sayıda tek seferlik web formu oluşturuyor. Bu formların çoğu sadece bir e-posta gönderir ve birkaçı basit bir veritabanı yazımı yapar.

Şu anda, her form Visual Studio Team Foundation Server'da kendi ayrı çözümünde yaşıyor. Bu, tutarlılığı korumayı zorlaştıran 100'e yakın farklı form projemiz olduğu anlamına gelir. Her form, alanların farklı olması bakımından benzersizdir, ancak hepsi hemen hemen aynı şeyi yapar.

Bunları bir şekilde yoğunlaştırmak istiyorum ve gerçekten biraz rehberlik yapabilirim.

  • Tüm form projelerimizle birlikte bir çözüm dosyası oluşturmaya çalışmalı mıyım? E-posta biçimlendirme ve benzeri yardımcı olmak için birkaç yardımcı sınıflar oluşturabilirsiniz rağmen sıhhi tesisat kodu bir sürü yok. Projeler arasında CSS, JavaScript, kontroller ve görüntüleri paylaşmak çok yararlı olacaktır.
  • Bir Microsoft mağazası olduğumuz göz önüne alındığında, bu özel senaryo için Web Formları üzerinden MVC gibi bir şeyle devam etmenin somut faydaları var mı? Bir bütün olarak MVC kavramı üzerinde satıldım, ancak tüm bu form bir e-posta göndermek ise 15 alanlı veri toplama formunu daha verimli bir şekilde bir araya getirmeme yardımcı olur mu? Bunu düşünmeme neden olan form, kullanıcının yanıtlarına dayalı alanları göstermek ve gizlemek için iyi bir mantığa sahipti ve MVC ve jQuery'yi kullanmak daha az verimli olurdu.

2
Burada metadan ne taşındı? SO olmalıdır.
Josh K

1
@Josh Stack Overflow doğrudan koddaki belirli sorunlarla ilgili sorular içindir. Program ve iş akışı tasarımı burada konu ile ilgilidir .

@ Mark: Bu çok öznel görünmüyor, çünkü kolayca verilen n ideal "en iyi uygulama" çözümü olacak. Ben bir MS adam değilim, bu yüzden komplikasyonun ne olduğu hakkında hiçbir fikrim yok, ancak bunun en iyi öznel olmayan bir şekilde cevaplanacağını tahmin ediyorum.
Josh K

Kabul. Bu SO üzerinde kapanacaktı.
Walter

1
Zaten burada
ChrisF

Yanıtlar:


3

Testler olmadan güvenli bir şekilde yeniden faktoring yapmak zordur ve tehlikeyle doludur.

Ben şöyle başlayacağım:

  • Bu formlara çeşitli girdi türlerini ve beklenen çıktıları kapsayan test senaryoları yazma. Bu formların çoğunun işlevsellikte aynı olduğunu veya ona yakın olduğunu düşündüğünüzde bunun çok uzun sürmeyeceği anlaşılıyor.

  • Bu test senaryo (larını) 100 kadar forma karşı çalıştırın (kod yollarını izlemenize yardımcı olmak için kod kapsamını açın).

Bundan sonra, neyi güvenli bir şekilde yeniden hesaba katabileceğinizi görebileceksiniz, o zaman şunları yapabilirsiniz (bir örnek):

  • Kod çoğaltma algılama aracınızı çalıştırın (.NET'te ne denildiğinden emin değil, Java'da CPD var). Hemen 13 özdeş formu kaldırın. Şimdi testleri tekrar çalıştırın - Yay! Form 11 dışında hepsi geçiyor, tamam, bu yüzden henüz silemiyoruz.

  • Tüm yerel e-posta biçimlendirme kodunu kaldırın ve tüm formları ortak bir e-posta işleme modülüne çağırın. Testleri çalıştırın, biri hariç hepsi geçiyor, hhmmm Tamam .... UTF-8 karakterleri, genel modülde, testleri tekrar çalıştırın, yay hepimiz iyiyiz!

durulayın ve tekrarlayın.


2
+1 Yeniden düzenlemeye nasıl yaklaşılacağına dair ipuçları için Michael Feathers'ın Eski Kod ile Etkili Çalışması konusuna bakın amazon.com/dp/0131177052 .
Michael Brown

Ohhhh iyi referans - bu kitabı seviyorum.
Martijn Verburg

0

Gönderme bölümünü soyutlamayı öneririm. Model / Görünüm / Denetleyici'yi kullanarak formları Görünüm'e koyun ve aynı denetleyiciyi kullanmalarını sağlayın. Bu denetleyici, varsayılan bir adrese e-posta göndermek gibi genel bir eylem gerçekleştirebilir veya form verilerini gönderebilen bir denetleyiciye aktarabilir. Bu şekilde yeni bir form oluşturmak için tek yapmanız gereken formu oluşturmak ve çıktıyı o denetleyiciye yönlendirmektir. Bu mimarlık, CSS ve javascript'i belirttiğiniz gibi paylaşmanıza izin verecek tek bir projede bulunabilir.

E-postaları biçimlendirmek için, genel bir biçimlendirici oluşturarak başlayacağım, sadece form öğesi adlarını ve değerlerini listeleyen bir tane, ayrıca gönderilen zaman gibi diğer metdata türü stuf vb. . Ardından, bundan daha fazla özel işleme ihtiyacınız varsa, bir fabrika ekleyin. Fabrika bir biçimlendirici arabirimi döndürür. Ardından, fabrika içinde, belirli bir form için bir biçimlendirici araması yapabilir veya belirli bir form yoksa genel olanı döndürebilirsiniz. Bu tasarım aynı zamanda cntroller'ın birim testini kolaylaştırır, çünkü test amacıyla kolayca sahte bir formatlayıcı sağlayabilirsiniz.

Bu arada, e-posta adresini formdan bir argüman olarak koymam. Birden fazla adrese göndermeniz gerekiyorsa, tüm formları ve gönderilecek e-postayı içeren bir arama tablosuna sahip olmanızı öneririm. Bu XML veya kodda uygulanabilir (her ikisini de gördüm, ancak daha iyi olup olmadığından emin değilim). Bu, spam gönderenlerin e-posta adreslerinizi form sayfasından almasını önlemeye yardımcı olur.


Yanıtınız için teşekkürler. Bu mimaride, gönderilen e-postaları nerede biçimlendirirsiniz? Bunu soyutlamak istiyorum, ancak bir dize oluşturucu oluşturmadan ve alanları statik metin blokları arasında bırakmadan biçimlendirme yapmanın bir yolunu düşünemiyorum. Bu her forma özgü görünüyor.
Josh Earl

Ayrıca, başka bir açılır menüdeki seçime dayalı bir açılır liste doldurmak gibi form mantığını işlemek için herhangi bir öneriniz var mı? MVC yolu ile gittik eğer jQuery tek seçenek mi?
Josh Earl

@JoshEarl: Biçimlendirici için bir fikirde düzenledim, ancak jQuery vb. İle ilgili herhangi bir öneri yapamıyorum. Web sayfası tarafı, öneride bulunmaktan tamamen rahatsız olduğum bir alan değil. İşler çok karmaşıksa, sayfa başına bir denetleyici olan tam bir MVC tasarımına gitmeniz gerekebilir. @Martijn'ın dediği gibi, birim testi, gereksinimlerinizin tam olarak ne olduğunu görmenize yardımcı olacaktır. Tasarımım, formlar arasında oldukça fazla benzerlik olduğunu varsayar.
Michael K
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.