Jak zorganizować powtarzalny kod?


11

Mój zespół tworzy wiele jednorazowych formularzy internetowych. Większość z tych formularzy po prostu wysyła wiadomość e-mail, a kilka z nich wykonuje prosty zapis do bazy danych.

W tej chwili każda forma ma osobne rozwiązanie w Visual Studio Team Foundation Server. Oznacza to, że mamy blisko 100 różnych projektów, co utrudnia utrzymanie spójności. Każda forma jest wyjątkowa, ponieważ pola są różne, ale wszystkie robią prawie to samo.

Chcę je jakoś skondensować i naprawdę mogę skorzystać z pewnych wskazówek.

  • Czy powinienem spróbować utworzyć jeden plik rozwiązania zawierający wszystkie nasze projekty formularzy? Nie ma dużo kodu hydraulicznego, chociaż mógłbym stworzyć kilka klas pomocników, aby pomóc w formatowaniu wiadomości e-mail i tym podobnych. Bardzo pomocne byłoby współdzielenie CSS, JavaScript, elementów sterujących i obrazów między projektami.
  • Biorąc pod uwagę, że jesteśmy sklepem Microsoft, czy istnieją jakieś wymierne korzyści z korzystania z czegoś takiego jak MVC zamiast formularzy internetowych w tym konkretnym scenariuszu? Sprzedano mi koncepcję MVC jako całości, ale czy pomogłoby mi to zebrać 15-polowy formularz do gromadzenia danych bardziej efektywnie, gdyby wystarczyło wysłać wiadomość e-mail? Formularz, który zmusił mnie do myślenia o tym, zawiera sporo logiki do wyświetlania i ukrywania pól w oparciu o odpowiedzi użytkownika i wydaje się, że byłoby mniej wydajne korzystanie z MVC i jQuery.

2
Co zostało tu zmigrowane z meta? Powinny być na SO.
Josh K

1
Przepełnienie stosu @Josh dotyczy pytań bezpośrednio związanych z określonymi problemami w kodzie. Projektowanie programu i przepływu pracy jest tutaj na temat .

@Mark: Nie brzmi to zbyt subiektywnie, ponieważ łatwo byłoby podać idealne rozwiązanie „najlepszych praktyk”. Nie jestem facetem ze stwardnienia rozsianego, więc nie mam pojęcia, co to za komplikacja, ale zaryzykowałbym przypuszczenie, że najlepiej byłoby odpowiedzieć w sposób nie subiektywny.
Josh K

Zgoda. Zostanie to zamknięte na SO.
Walter

1

Odpowiedzi:


3

Bezpieczne przefakturowanie bez testów jest trudne i obarczone niebezpieczeństwem.

Zacznę od:

  • Pisanie przypadków testowych, które obejmują różne typy danych wejściowych do tych formularzy i oczekiwany wynik. Wygląda na to, że tak naprawdę nie potrwa to zbyt długo, ponieważ wydaje ci się, że większość z tych form ma identyczną funkcjonalność lub jest blisko niej.

  • Uruchom te przypadki testowe dla około 100 formularzy (włącz pokrycie kodu, aby pomóc w śledzeniu ścieżek kodu).

Następnie możesz sprawdzić, co możesz bezpiecznie zmienić na czynniki, a następnie możesz (przykład):

  • Uruchom narzędzie do wykrywania duplikacji kodu (nie wiesz, jak się nazywa w .NET, w Javie mamy CPD). Natychmiast usuń 13 identycznych formularzy. Teraz ponownie uruchom testy - Tak! Wszystkie zdają oprócz formularza 11, OK, więc nie możemy tego jeszcze usunąć.

  • Usuń cały lokalny kod formatowania wiadomości e-mail i uzyskaj wszystkie formularze, aby wywołać wspólny moduł przetwarzania wiadomości e-mail. Uruchom testy, wszystkie zdają oprócz jednego, hhmmm OK .... Znaki UTF-8, napraw to w module ogólnym, uruchom ponownie testy, tak, wszyscy jesteśmy dobrzy!

wypłukać i powtórzyć.


2
+1 Zobacz Michael Feathers Skutecznie współpracujący ze starszym kodem amazon.com/dp/0131177052, aby uzyskać wskazówki, jak podejść do refaktoryzacji.
Michael Brown

Ohhhh dobra referencja - podoba mi się ta książka.
Martijn Verburg,

0

Proponuję wyodrębnić część przesłania. Używając Modelu / Widoku / Kontrolera, umieść formularze w Widoku i niech używają tego samego kontrolera. Ten kontroler może albo wykonać ogólną akcję, na przykład wysłać wiadomość e-mail na domyślny adres, albo przekierować dane formularza do kontrolera, który może. W ten sposób wszystko, co musisz zrobić, aby utworzyć nowy formularz, to utworzyć formularz i skierować dane wyjściowe do tego kontrolera. Ta archetektura może być zawarta w jednym projekcie, który pozwoliłby ci udostępniać CSS i javascript, jak wspomniałeś.

Aby poradzić sobie z formatowaniem wiadomości e-mail, zacznę od utworzenia ogólnego formatyzatora, na przykład takiego, który po prostu wyświetla nazwy i wartości elementów formularza, a także inne typy metdanych, takie jak czas przesłany itp. Możesz to zrobić tak fantazyjnie, jak chcesz . Następnie, jeśli naprawdę potrzebujesz więcej niestandardowej obsługi, dodaj fabrykę. Fabryka zwróci interfejs formatyzatora. Następnie w fabryce możesz wyszukać formatyzator dla tej konkretnej formy lub zwrócić tę ogólną, jeśli nie istnieje. Ten projekt ułatwiłby również testowanie jednostkowe kontrolera, ponieważ można łatwo dostarczyć próbny formatator do celów testowych.

Nawiasem mówiąc, nie podałbym adresu e-mail jako argumentu z formularza. Jeśli chcesz wysłać na wiele adresów, sugeruję utworzenie tabeli przeglądowej, która zawiera wszystkie formularze i e-mail, na który chcesz je wysłać. Można to zaimplementować w XML lub w kodzie (widziałem oba, choć nie jestem pewien, czy jedno z nich jest lepsze). Pomoże to uniknąć spamerom uzyskiwania adresów e-mail ze strony formularza.


Dziękuję za odpowiedź. Gdzie w tej architekturze poradziłbyś sobie z formatowaniem wysyłanych wiadomości e-mail? Chciałbym to streścić, ale nie mogę wymyślić sposobu na sformatowanie bez stworzenia programu budującego łańcuchy i upuszczenia pól pomiędzy blokami tekstu statycznego. Wydaje się to specyficzne dla każdej formy.
Josh Earl

Czy są też jakieś zalecenia dotyczące obsługi logiki formularzy, takie jak wypełnianie listy rozwijanej na podstawie wyboru w innym menu rozwijanym? Czy jQuery jest jedyną opcją, jeśli wybraliśmy trasę MVC?
Josh Earl

@JoshEarl: Zredagowałem pomysł na formatyzator, ale nie mogę nic sugerować na temat jQuery itp. Strona internetowa nie jest obszarem, w którym jestem całkowicie niezadowolony, udzielając rekomendacji. Być może będziesz musiał przejść z pełnym projektem MVC, po jednym kontrolerze na stronę, jeśli sprawy są zbyt skomplikowane. Jak powiedział @Martijn, testy jednostkowe pomogą ci dokładnie sprawdzić, jakie są twoje wymagania. Mój projekt zakłada sporo podobieństwa między formami.
Michael K
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.