Co to jest pomocnik? Czy to wzór? Czy to jest algorytm?

40

Może trochę zuchwale, ale ponieważ nigdzie nie mogę znaleźć tej odpowiedzi za pośrednictwem Google, więc aby upewnić się, że Inżynieria oprogramowania ma odpowiedź:

Co to jest pomocnik?

Widziałem tę nazwę wszędzie używaną (nazwy modułów, nazwy klas, nazwy metod), jak gdyby semantyka była głęboka i znacząca, ale w kontekście informatyki (chociaż nie mam dyplomu), „ nigdzie nie widziałem opisu ani definicji!

Czy to wzór? Czy to jest algorytm? Kiedyś pracowałem nad programem, w którym moduł i klasa były nazywane czymś coś pomocnikiem (gdzie coś też było dość ogólne) i natychmiast zmieniłem nazwę na coś, co miało dla mnie sens, ale mam wrażenie, że czegoś mi brakuje!

Aaron Hall
źródło
9
Pomocnik to coś, co nazywasz, gdy nie wiesz, jak to nazwać, ale znasz jednego z jego przyjaciół. Coś jak nazywanie cię „przyjacielem Zacka” zamiast Aarona. Double plus ungood.
david.pfx
Pomocnikiem jest każdy członek prywatny, aż do izomorfizmu.
Thomas Eding,
@ThomasEding przepraszam, że wróciłem 3 lata później - ale widziałem wielu „publicznych” członków zwanych „pomocnikami”, w tym interfejsy. Chciałbym mieć źródło w twojej definicji (im wyższa jakość, tym lepiej), ponieważ to zdecydowanie dałoby mi poczucie, że więcej zapachów kodu.
Aaron Hall

Odpowiedzi:

63

Klasa Helper jest mniej znanym zapachem kodu, w którym programista zidentyfikował różne, często używane operacje i próbował umożliwić ich ponowne użycie, łącząc je w nienaturalne grupowanie. Kolejni programiści przystąpili do projektu i nie zdawali sobie sprawy z istnienia klasy pomocniczej, w związku z czym przepisali te same wspólne operacje, a nawet stworzyli więcej klas pomocniczych.

Ale poważnie, głównym problemem z klasami Pomocników jest to, że zwykle są to operacje, które działają na konkretnej klasie, co oczywiście oznacza w kategoriach OO, że cierpią na ostry przypadek Zazdrości o cechy . Brak pakietu zachowania z danymi, na których działa, powoduje, że programiści tak często (z mojego doświadczenia) nie potrafią go znaleźć.

Ponadto, jak już zidentyfikowałeś SomethingSomethingHelper, to tak naprawdę okropne imię. Jest nieopisowy i nie daje rzeczywistego pojęcia, jakie operacje wykonuje klasa (pomaga?), Co oznacza również, że nie jest oczywiste, gdy dodaje się nowe zachowania, niezależnie od tego, czy należą one do klasy Helper, czy nie. Rozbijałem takie klasy zgodnie z pokrewnymi zachowaniami, które logicznie grupują się, a następnie zmieniałem nazwy nowych klas, aby odzwierciedlić to, co robi.

Pan Cochese
źródło
9
Jestem pewien, że SomethingSomethingHelperto nie jest prawdziwa nazwa klasy. To, czy jest to zapach kodu, czy nie, zależy od tego, jak specyficzna jest klasa pomocnicza, ponieważ klasy pomocnicze Mathw ogóle nie są zapachem kodu.
Robert Harvey
10
@RobertHarvey - Enh, większość z tych, które widziałem , zostały nazwane SomethingSomethingHelper. Do diabła, patrzę teraz na klasę nazwaną HelperMethodsw <company>.Helpersprzestrzeni nazw. Dla mnie Helperklasa jest w tym samym segmencie co *Manager.
Telastyn
8
@Telastyn: Być może więc jest to doświadczenie. Przejrzałem klasy pomocników w moim obecnym projekcie (jest ich kilka) i wszystkie mają sensowne nazwy. Jest tylko jeden z przyrostkiem Helperi myślę, że ma to na celu ujednoznacznienie go z klasą .NET Framework o tej samej nazwie. Uznałbym za *Helperakceptowalne, gdyby *było coś znaczącego. HelperMethodsjest po prostu porażką wyobraźni; powinny istnieć przynajmniej określone wiadra pojęciowe.
Robert Harvey
4
@RobertHarvey - Prawdopodobnie masz rację. Przez całą moją karierę w posługiwaniu się nowoczesnymi językami sprzątałem wraki pociągów.
Telastyn
1
Istnieje ich podzbiór, zwany „funkcjami pomocniczymi”, które są faktycznie przydatne i stanowią dobry wzorzec. Na przykład, wspólny zestaw wierszy, które w innym przypadku musiałyby zostać powtórzone w ramach funkcji - jednym z przykładów, w których pojawiają się, jest potrzeba do..whilepętli w Pythonie, której język nie obsługuje (zobacz drugi przykład tutaj ). Inną byłaby struktura if / elif /.../ else, ale trzeba powtórzyć przypadek na górze i na dole. Jeśli to możliwe, powinny one być lokalne dla tej funkcji i ogólnie nie powinny być nazywane „pomocnikami”.
Izkata
5

Pomocnik jest nieszkodliwą dodatkową klasą lub metodą, o ile uzupełnia komponent zewnętrzny. Jeśli robi coś przeciwnego, oznacza to zły projekt, ponieważ kod został wykluczony z jego uprawnień, jeśli w ogóle istnieją jakiekolwiek uprawnienia.

Oto przykład nieszkodliwego pomocnika, używam metody o nazwie FindRepliczącej zera wiodące.

digits = digits.Remove(0, TextHelper.FindRep('0', digits, 0, digits.Length - 2));

Metoda pomocnicza jest bardzo prosta, ale bardzo niewygodna w kopiowaniu i wklejaniu, a środowisko nie zapewnia żadnego rozwiązania.

public static int FindRep(char chr, string str, int beginPos, int endPos)
{
    int pos;

    for (pos = beginPos; pos <= endPos; pos++)
    {
        if (str[pos] != chr)
        {
            break;
        }
    }

    return pos - beginPos;
}

A oto przykład złego pomocnika:

public static class DutchZipcodeHelper
{
    public static bool Validate(string s)
    {
        return Regex.IsMatch(s, @"^[1-9][0-9]{3}[A-Z]{2}$", RegexOptions.IgnoreCase);
    }
}

public class DutchZipcode
{
    private string value;

    public DutchZipcode(string value)
    {
        if (!DutchZipcodeHelper.Validate(value))
        {
            throw new ArgumentException();
        }

        this.value = value;
    }

    public string Value
    {
        get { return value; }
    }
}
Leopold Asperger
źródło
-1

Moja firma używała metodologii klasy Base / Helper, w której każdy obiekt miałby dwie klasy. Miałbyś klasę Person, która zawierała wszystkie właściwości i definicje klasy, oraz klasę PersonHelper, która zawierała wszystkie metody, instrukcje SQL i logikę, które manipulowały klasą Person. Działa to dla nas dobrze, ponieważ wszystkie nasze aplikacje używają instrukcji SQL do manipulowania danymi i bardzo łatwo było nam znaleźć i zmodyfikować instrukcje SQL w razie potrzeby.

Od tego czasu przeszliśmy i teraz umieściliśmy wszystko w klasie Person / Base. Przestaliśmy używać konwencji nazewnictwa Helper, ponieważ chcieliśmy mieć mniej plików w naszych projektach. Poza tym długość niektórych nazw klas wymykała się spod kontroli. lol.

Nie jest to świetny przykład, ale masz pomysł.

s = CompanyName.PersonHelper.GetPerson()
s = CompanyName.Person.GetPerson()

Nie twierdzę, że stosowanie konwencji nazewnictwa pomocników jest idealnym rozwiązaniem, ale działało dla nas przez kilka lat.

Brian
źródło
2
Nie wyjaśniłeś dlaczego.
Robert Harvey
2
Tak, też chciałbym to wyjaśnienie.
Aaron Hall
@AaronHall Uważaj za dobrą rzecz, że nie rozumiesz ich wyboru.
Leopold Asperger,