Może trochę z przymrużeniem oka, ale ponieważ nie mogę znaleźć tej odpowiedzi w Google, więc aby upewnić się, że Inżynieria oprogramowania zna odpowiedź:
Co to jest pomocnik?
Widziałem, że nazwa jest używana wszędzie (nazwy modułów, nazwy klas, nazwy metod), jakby semantyka była głęboka i znacząca, ale w kontekście informatyki (chociaż nie mam w niej dyplomu), nigdzie nie widziałem opisu ani definicji !
Czy to wzorzec projektowy? Czy to algorytm? Pracowałem kiedyś nad programem, w którym zarówno moduł, jak i klasa były nazywane coś … coś pomocnego (gdzie coś coś był dość ogólny) i natychmiast zmieniłem jego nazwę na coś, co miało dla mnie sens, ale czuję, że „czegoś mi brakuje!
Komentarze
- Pomocnik to coś, co nazywasz, gdy nie ' nie wiesz, jak to nazwać, ale tak Znasz jednego z jego przyjaciół. Coś jak dzwonienie do ciebie ' przyjaciel Zacka ' zamiast Aarona. Podwójnie plus niedobrze.
- Pomocnik to każdy członek prywatny, aż do izomorfizmu.
- @ThomasEding Przepraszam, że wróciłem 3 lata później – ale ' widzieliśmy już wielu ” publicznych ” członków zwanych ” pomocnikiem „, w tym interfejsy. ' Chciałbym źródła Twojej definicji (im wyższa jakość, tym lepiej), ponieważ z pewnością dałoby mi to poczucie większej ilości zapachów kodu.
Odpowiedź
Klasa pomocnicza to mniej znany zapach kodu, w którym programista zidentyfikował różne, często używane operacje i próbował uczynić je wielokrotnymi operacjami, wrzucając je razem w nienaturalnym zgrupowaniu. Kolejni programiści przychodzili wtedy do projektu i nie zdawali sobie sprawy, że klasa pomocnicza istnieje, i konsekwentnie przepisywali te same typowe operacje, a nawet tworzyli więcej klas pomocniczych.
Ale poważnie, głównym problemem z klasami pomocniczymi jest że są to zazwyczaj operacje, które działają na określonej klasie, co oczywiście oznacza w kategoriach OO, że cierpią na ostry przypadek Feature Envy . To niepowodzenie w spakowaniu zachowania z danymi, na które działa, jest powodem, dla którego programiści tak często (z mojego doświadczenia) nie mogą go znaleźć.
Oprócz tego, ponieważ już zidentyfikowałeś coś SomethingSomethingHelper to w rzeczywistości okropna nazwa . Jest nieopisowy i nie daje ci prawdziwego pojęcia, jakiego rodzaju operacje wykonuje klasa (to pomaga?), Co oznacza również, że podczas dodawania nowych zachowań nie jest oczywiste, czy należą one do klasy pomocnika, czy nie. utwórz takie klasy zgodnie z powiązanymi zachowaniami, które logicznie się grupują, a następnie zmień nazwy nowych klas, aby odzwierciedlić to, co robią.
Komentarze
Odpowiedź
Pomocnik to nieszkodliwa dodatkowa klasa lub metoda, o ile uzupełnia komponent zewnętrzny. Kiedy robi coś przeciwnego, oznacza to zły projekt, ponieważ kod został wykluczony z jego uprawnień, jeśli w ogóle istnieją.
Oto przykład nieszkodliwego pomocnika, używam metody o nazwie FindRep
zliczający wiodące zera.
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 framework 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; } } }
Komentarze
- Więc pokaż mi, jak należy zrobić DutchZipcodeHelper?
- @ powder366 Weryfikacja jest prywatna metoda na DutchZipcode
Answer
Pomocnik to często używany dodatek do nazwy.
Jednak , bardzo mało przekazuje o tym, co robi. Za każdym razem, gdy go widziałem, stwierdzałem, że jest to nazwa nieoptymalna.
W rzeczywistości uważam, że jest to zapach kodu, który wskazuje na więcej problemów pod spodem.
Przykład
Załóżmy, że widzimy nazwę ” WidgetHelper ” (tutaj ” widżet ” to nazwa zastępcza dowolnego rodzaju programowalnych funkcji, niekoniecznie widgetu interfejsu użytkownika):
class WidgetHelper: ...
Czego uczymy się z nazwy? Wiemy, że obiekt lub funkcja wykonuje jakąś dodatkową pracę w stosunku do widżetu. Z mojego doświadczenia wynika, że może to nawet nie być prawdą i można usunąć ” pomocnika ” z nazwy i poprawić komunikację.
Z innej możliwości ” WidgetHelper ” może zawijać widżet w taki sposób, że sam kod widżetu może znać nic o pomocniku. Wniosek jest taki, że WidgetHelper
w tym przykładzie pseudokodu jest częścią publicznego API:
class WidgetHelper: def __init__(self): self.widget = Widget() ...
W tym przypadku lepsza byłaby nazwa typu ” WidgetAPI „, ponieważ to przynajmniej informuje użytkownika o jego relacji z klasą Widget. A może usuwamy ” Pomocnik ” z nazwy i dodatkowo zmieniamy nazwę Widget
na coś w rodzaju WidgetImplementation
.
Alternatywnie można go opakować i wywołać przez widżet, co sugeruje, że nie jest częścią publicznego interfejsu API, ale raczej część szczegółów implementacji.
class Widget: def __init__(self): self.widget_helper = WidgetHelper() ...
Nawet w tym przypadku niewielka ilość informacji, którą ulepszyliśmy w ” pomocniku. ” Bardziej opisowe byłoby nazwanie tego jakąś ogólną nazwą, taką jak ” Implementacja widżetów. ”
” Implementacja ” może być poprawne, ponieważ implementacja może zrobić zbyt wiele, aby nadać jej dokładniejszą nazwę. Lub może być zbyt niejasne – zależy to od nazwy.
Ale jak widzieliśmy, nazwa, pomocnik „, ” nie „pomaga w zrozumieniu tego, co dzieje się w kodzie, poza tym, że jest pomocniczy w stosunku do głównego obiektu zainteresowania. ” Pomocnik, ” może oznaczać wiele rodzajów relacji. W związku z tym jest zbyt niejasny i niejasny oraz nie nadaje się dobrze do celów informowania użytkownika o tym, co robi obiekt.
Podsumowanie
Nazywanie rzeczy jest jednym z trudnych problemów w informatyce.
Co jest pożądane w nazwie, to to, że informuje użytkownika, co ma robić nazwana rzecz.
Jednak w każdym przypadku, jaki można sobie wyobrazić, bardziej opisowe byłoby użycie nazwy innej niż ” helper ” lub po prostu całkowicie go usunąć.
Podsumowując moje doświadczenie i tę dyskusję, wybór ” pomocnika ” w nazwie również sygnalizuje niewielki wysiłek lub wyrafinowanie ze strony nazwiska (poprawnie lub nie). To rzeczywiście zapach kodu.
Nie nazywaj niczego pomocnikiem „. ”
Odpowiedź
W rzeczywistości nie jest.
” Pomocnik ” to rzeczownik zbiorczy dla grupy funkcji.
Pomocnik to coś, co działa w całym projekcie i robi małą rzecz. Ci faceci często nie są nawet zorganizowani w klasę, po prostu rozszerzają funkcjonalność lub możliwości samego języka. Oto, co uważam za bardzo dobry przykład pomocnika:
function linesOf($mls) { return preg_split("/\s*\n\s*/",trim($mls)); }
Ta niewielka funkcja może mieć duży wpływ na sposób, w jaki organizujesz swój kod (z przyjemnością umieścisz swoje dosłowne listy w łańcuchach wielowierszowych), ale sama w sobie nie oznacza nic. Jest to „uwielbiony wzorzec wyrażenia regularnego. Mimo to sprawia, że kod jest o wiele bardziej czytelny, gdy powiesz
$a = linesOf(" apples bananas cherries ");
zamiast czystego odpowiednika wyrażenia regularnego.
Więc tym właśnie są pomocnicy. Małe narzędzia do ogólnych zadań, nienależące do określonej klasy. Możesz zmusić je do jednego (linesOf mogą być metodą klasy łańcuchowej), ale tak naprawdę należą do globalnej przestrzeni nazw lub jednej statycznej kolekcji takich narzędzi.
Zasada kciuka: jeśli jest pomocna, ale nigdzie nie pasuje, prawdopodobnie jest pomocnikiem.
Odpowiedź
Oczywiście ” to jest szara strefa, ” ale z mojego pragmatycznego doświadczenia wynika, że ludzie wymyślają ” pomocników „, kiedy zidentyfikują przydatny dla siebie zestaw wspólnego kodu, którego nie dodają Nie chcę ponownie wdrażać. (W niektórych językach są one określane jako ” mixins. „)
Problem polega na tym, że wspólny kod stycznie powiązane z każdą z pozostałych klas, które mogą ” help. ” Zamiast być częścią ścisła hierarchia klas, jedynie ” pomaga ” [wszystkim …] im. Ta strategia pozwala uniknąć powielania kodu źródłowego, ale nie jest pozbawiona zagrożeń.
Odpowiedź
Moja firma używała bazy class / Helper class metodologia, w której każdy obiekt miałby dwie klasy. Będziesz mieć klasę Person, która zawierałaby wszystkie właściwości i definicje klasy, oraz klasę PersonHelper, która zawierała wszystkie metody, instrukcje SQL i Logic, które manipulowały klasą Person. To działało 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 do przodu i teraz umieściliśmy wszystko w klasie Person / Base. Przestaliśmy używać konwencji nazewnictwa pomocnika, ponieważ chcieliśmy mieć mniej plików w naszych projektach. Ponadto 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 używanie konwencji nazewnictwa pomocniczego jest idealne rozwiązanie, ale działało u nas przez kilka lat.
Komentarze
- Nie ' t wyjaśnij dlaczego.
- Tak, ' też polubiłbym to wyjaśnienie.
- @AaronHall Uważaj za dobrą rzecz, której nie rozumiesz ich wybór.
- Typowym powodem jest ” Ktoś pomyślał, że to dobry pomysł „.
SomethingSomethingHelper
nie jest rzeczywistą nazwą klasy. To, czy ' zapach kodu, czy nie, zależy od tego, jak specyficzny klasa pomocnicza jest, ponieważ klasy pomocnicze, takie jakMath
, nie są w ogóle zapachem kodu.SomethingSomethingHelper
. Do diabła, ja ' m patrzę na klasę o nazwieHelperMethods
w przestrzeni nazw<company>.Helpers
. Dla mnie znajduje się w tym samym zasobniku co*Manager
.Helper
i myślę, że ' s, aby oddzielić ją od klasy w .NET Framework o tej samej nazwie. ' bym uważał*Helper
za akceptowalny, jeśli*
było coś znaczącego.HelperMethods
to po prostu porażka wyobraźni; powinny istnieć przynajmniej konkretne koncepcyjne segmenty.do..while
w Pythonie, której język nie obsługuje ' t (patrz drugi przykład tutaj ). Inną byłaby struktura if / elif /…/ else, ale należy powtórzyć przypadek na górze i na dole. Jeśli to możliwe, powinny być jednak ustawione lokalnie dla tej funkcji i generalnie nie nazywane tak naprawdę ” helper „.