Nowa metoda czy nowy if

0

Powiedzmy, że mam metodę, która zajmuję się utworzeniem encji X. Utworzenie tej encji wymaga zaangażowania (pobrania z bazy) kilkunastu innych encji. Metoda ma jakieś 100 linii, oczywiście wszystko co się da jest powydzielane do osobnych metod. W skrócie jedna wielka transakcja. Ta metoda, w zależności od przekazanego DTO, zachowuje się inaczej. W sumie są 4 ścieżki obsługiwane przez tę metodę, pewnie będą kolejne. Te ścieżki są bardzo podobne do siebie: gdyby każda ścieżka dostała własną metodę, to 80% kodu tych metod by się powtarzało, tylko że tego 80% kodu nie da się tak po prostu wydzielić. System to legacy, klasy na tysiące linii, model anemiczny. Co byście zrobili? Jakiś wzorzec projektowy na takie sytuacje?

Method(model)
{
    if (x)
    {
        A();
    }
    if (y)
    {
        B();
    }
    C();
    D();
    // itd.   
}
2

Jesteś pewien ze nie da się tego opakować jakimś ładnym Builderem?

1

Próbowałbym oddzielić w kodzie to CO chcesz zrobić (czyli pośrednie decyzje i koncowy efekt) od tego JAK (pośrednie efekty) ma to być wykonane.

Jeśli wszystkie decyzje są możliwe do rozpoznania na początku na podstawie samego typu DTO to wyodrębnij metodę, która zbuduje obiekt opisujący plan wykonania, a pozostała część kodu jaka miałeś wcześniej w tej metodzie Method niech po prostu niech wykonaje ten plan. By uzyskać prostszy kod to typ planu warto uzależnić od typu DTO.

Jeśli jednak decyzje jakie masz podjąć w metodzie są możliwe dopiero w trakcie wykonywania kodu, to ja bym do obiektu który opisuje plan wykonania dałbym metody aktualizujące ten obiekt planu, plan zbierałby informacje i wystawiałaby funkcje informujące co dalej należy zrobić.

W ten sposób wytarczy Ci jedna metoda Method, która pokryje wszystkie przypadki i tyle klas opisujących plan ile DTO chcesz docelowo obsłużyć.

PS, nie wiem czy to co napisałem to wzorzec, ale w tą drogę ja bym poszedł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1