Co jest lepsze i dlaczego? (Z punktu widzenia projektowania interfejsu):
a) Mieć dwa Show()
i Hide()
funkcje
b) Aby mieć jedną SetVisible(bool visible)
funkcję
EDYCJA: Na przykład niektóre obiekty mają stan widoczności i ta funkcja służy do jego zmiany.
c) wszystkie trzy Show()
, Hide()
, SetVisible(bool visible)
funkcje
java
c++
interfaces
użytkownik3123061
źródło
źródło
Odpowiedzi:
Wolę
SetVisible(bool visible)
, ponieważ pozwala mi pisać kod klienta w następujący sposób:zamiast pisać
SetVisible
Podejście może również umożliwić łatwiejsze wdrożenie. Na przykład, jeśli konkretna konkretna klasa po prostu deleguje metodę do swoich klas złożonych,SetVisible
oznacza to, że należy wdrożyć jedną metodę mniej.źródło
MyObject.Visible = false;
wydaje mi się jeszcze bardziej intuicyjny niżMyObject.SetVisible(false);
SetVisible()
nie sugeruje (dla mnie), że faktycznie coś wyświetlasz. Odczytuje to bardziej, jakbyś ustawiał właściwość widoczności obiektu, prawdopodobnie pozostawiając jej właściwośćRefresh()
lubRedisplay()
metodę sprawdzania wartości tej właściwości w celu ustalenia, czy obiekt powinien zostać wyświetlony czy ukryty.setVisible(true)
proces, w którym obiekt zostanie narysowany, gdy system będzie dalej bezczynny, jeśli nie wcześniej. Spodziewałbym się, żerefresh
może to być przydatne, aby przyspieszyć wyświetlanie obiektu, ale że obiekt ostatecznie zostanie narysowany niezależnie (chyba że np. Ustawiono jego widocznośćfalse
przed tym).Nie zgadzam się ze wszystkimi plakatami sugerującymi, że wiele funkcji do robienia tego samego jest dobrą rzeczą. Podczas gdy trzy funkcje zamiast jednego nie może wydawać się dużo wzdęć, pamiętaj, że twoja klasa jest prawdopodobne, aby skończyć z wielu takich funkcji (np
setEnabled
,enable
,disable
), a zatem tego podejścia będzie skończyć z dużo większej interfejsu klasy. Co więcej, jest prawdopodobne, że skończysz z wieloma podobnymi brzmiącymi funkcjami / właściwościami / czymkolwiek w twojej klasie, a mnożenie funkcji dodatkowo zaciemni, która z nich idzie z czym.W językach, które obsługują właściwości, powinny być preferowane, ale skoro ani Java, ani C ++ nie robią tego, myślę, że to kwestia sporna.
Myślę, że
setVisible()
należy preferować z następujących powodów:setVisible(false)
, zadzwoń,setVisible(true)
podczas gdy przeciwieństwohide()
może być z łatwościąreveal()
.setVisible(wantToSee)
zamiast używaćif
instrukcji.setX()
format uogólnia, dzięki czemu możesz mieć zestaw spójnych funkcji, podczas gdy podejście sprawdzane tworzy wiele funkcji, które mogą być trudne do zlokalizowania, jeśli nie wiesz, czego szukasz. Spójność interfejsów API znacznie ułatwia ich naukę i zapamiętywanie.źródło
To zależy od tego, co Wyświetlanie i ukrywanie oznacza w kontekście. Najpierw chcesz dowiedzieć się, który z nich jest Twoją „główną drogą” i skupić się na rozwijaniu tego:
setVisible(bool)
show()
ihide()
OK, więc teraz, gdy już zakodowałeś jej „złoty standard”, musisz dowiedzieć się, czy warto dodać cienkie metody wygody w innym stylu, aby ułatwić życie każdemu, kto będzie używał twojego obiektu.
setVisible(bool)
setVisible(a==b)
)show()
ihide()
onSuccess(widget.show)
)TLDR: Dowiedz się, który jest najważniejszy, zaimplementuj go, a następnie zadaj sobie pytanie, czy warto dodać drugi styl jako metody cienkiej wygody.
źródło
Powiedziałbym „wszystkie trzy”.
Show()
iHide()
wydają się być łatwiejsze do odczytania niżSetVisible(true)
iSetVisible(false)
. Jednak, jeśli chcesz ustawić logiczność widoczności, lepiej jest mieć metodę przyjmującąbool
zamiast budowaćif
wokół niejbool
.Możesz obsłużyć wszystkie trzy bez powielania logiki i minimalnej płyty kotłowej:
Alternatywnie, jeśli rzeczy, które
SetVisible
pakujesz, mają bardziej zaawansowany interfejs API:źródło
System.Windows.Forms.Timer
. Osobiście uważam, że jest to mylące. Kiedy widzę obaShow
iSetVisible
, moją pierwszą skłonnością jest zastanawianie się, czy istnieje jakaś istotna różnica między tymi dwoma funkcjami.Wolę show () i hide (), w rzeczywistości każda metoda, która odbiera jedną wartość logiczną, może zostać zmieniona dla dwóch metod, aby lepiej wyrażać intencję API. Na przykład Robert Martin w czystym kodzie poleca metody wolniejsze od zerowych argumentów od metod z jednym argumentem.
Innym ważnym argumentem jest dla mnie czytelność, moim zdaniem dobry kod można odczytać jak prozę, jego naprawdę dziwna proza coś takiego jak „main_window setVisible false” zamiast „main_window hide”, piszesz lub mówisz w ten sposób normalnie ?, po co używać tego dziwnego konstruowanie języka w programach, gdy jest to całkowicie możliwe, użyj bardziej naturalnego języka ?.
źródło
it.setVisible(false); it.setVisible(true);
nie powinna wpływać na widoczność rodzica kontrolnego, ani nie powinna wpływać na kolejność Z ani lokalizację kontrolki. Dla kontrastuhide(); show()
; może całkiem prawdopodobne zmusić rodzica kontrolnego do bycia widocznym, przesunąć go ponad inne kontrolki i ograniczyć jego pozycję do miejsca, które można zobaczyć. W niektórych przypadkach dobrze jest mieć pewność, że coś jest rzeczywiście widoczne (jak w przypadku wyżej wspomnianychshow()
, ale w innych przypadkach warto zmienić flagę widoczności bez zmiany czegokolwiekWierzę, że im bardziej metoda jest ekspresyjna, tym bardziej czytelny, a tym samym łatwiejszy do utrzymania kod będzie. Rozważ następujące dwa przypadki:
Przypadek 1:
Przypadek 2:
W pierwszym przypadku jasne jest, co robi funkcja „setVisible”, ale jeśli chcesz ją przeczytać, powiedziałbyś:
Chociaż jest bardziej opisowy, aby powiedzieć:
co spowoduje zmianę funkcji „Przypadek 1” na:
produkuje więcej kodu, ale jest bardziej czytelny.
Drugi przypadek ma oczywistą wadę, tzn. Już wiesz, że chcesz pokazać panel, więc dlaczego nie skorzystać z funkcji „Pokaż”?
Nie twierdzę, że użycie „setVisible” jest całkowicie błędne, ale staje się mylące, gdy próbujesz odczytać kod, który nie został napisany przez Ciebie z czasem, i nie jest zgodny z regułą „A funkcja powinna wykonać tylko jedną operację”.
źródło
show customer panel iff the user/customer is enabled
. Zgadzam się, że może być wiele bardziej skomplikowanych warunków, które nie są tak łatwe do odczytania jak twój przykład, jednak w takich przypadkach podzieliłbym te warunki na różne linie.Uważam, że alternatywa
Hide()
/Show()
jest atrakcyjna, ponieważ łatwiej jest zrozumieć, co się dzieje, niż przySetVisible(true)
jednoczesnym korzystaniu z jednej funkcji, ponieważ pozwala uniknąć wielu warunków warunkowych.Jeśli o to chodzi to proponuję stosując wyliczenie jako wkładu
SetVisible
, więc masz alboSetVisible(Visibility.Visible)
alboSetVisible(Visibility.Hidden)
. Masz jedną funkcję, dzięki której możesz natychmiast odczytać, jakie działania są podejmowane.Używając konwencji nazewnictwa Java, możesz mieć
setVisible(Visibility.VISIBLE)
lubsetVisible(Visibility.HIDDEN)
.źródło
Zgadzam się z odpowiedzią Dariena, ale chciałem dodać punkt widzenia z perspektywy programistów C #.
Kiedy widzę kod z napisem „setXXX”, czytam to, aby ustawić wartość dla rzeczy, nie oczekuję, że będzie to miało skutki uboczne w tej rzeczy innej niż ustawienie tej wartości, i spodziewam się, że będzie to idempotentne (tzn. mogę nadal ustawiać tę samą wartość i jest w porządku). To raczej jak dostęp do pola. Generalnie spodziewałbym się również zobaczyć metodę „getXXX” wraz z „setXXX”.
Nie wiem, czy tego się spodziewasz w Javie i C ++, ale tego oczekiwałbym w C #, choć w C # jest krótka ręka dla tego o nazwie Właściwości. A oto kilka dobrych wskazówek na temat korzystania z właściwości ( http://msdn.microsoft.com/en-us/library/ms182181.aspx ).
Biorąc pod uwagę ten widok, wybór interfejsu zależy wyłącznie od tego, czy występują jakieś skutki uboczne (inne niż zmiana tej wartości pola):
Jeśli wykonanie akcji ma skutki uboczne, na przykład pokazuje okno dialogowe, wybrałbym „Show ()” i „Hide ()”.
Jeśli nie ma efektów ubocznych, powiedzmy, że ustawiam widoczność „widżetu”, a coś innego renderuje ten widżet w zależności od jego stanu, wtedy użyłbym setVisibility lub setIsVisible. (Nie nazwałbym tego SetVisible).
W języku C # (nie jestem pewien co do Javy) dość często przyjmuje się wzorzec obserwatora, w którym struktura interfejsu użytkownika będzie nasłuchiwać zmian w obiektach i automatycznie ponownie renderuje interfejs użytkownika, gdy zmieni się właściwość, taka jak Widoczność. Oznacza to, że ustawienie wartości przez wywołanie setIsVisible wygląda tak, jakby miało skutki uboczne, ale w mojej definicji tak nie jest. Kontrakt widżetu jest wypełniany poprzez ustawienie jego wartości pola reprezentującej „IsVisible”.
Innymi słowy, w porządku jest dla mnie przełączanie widoczności etykiety na formularzu przed wyświetleniem formularza. Tj. Label.getIsVisible == true, ale formularz nie jest wyświetlany.
Wywoływanie Hide () nie jest w porządku, gdy formularz nie jest wyświetlany.
źródło
getXXX()
isetXXX()
metody dostępu do pola bez skutków ubocznych brzmią jak Java, a nie C #. To jest sposób, w jaki należy to zrobić w Javie, ponieważ nie mają właściwości. Gdybym widział taki kod w C #, domyślam się, że został napisany przez programistę Java, który jeszcze nie dowiedział się o właściwościach w C #.SetVisibility
.getXX
wywołanie ma odpowiedniąsetXX
metodę, tosetYY
nie powinno na nią wpływać, ale może wpływać nagetZZ
wywołanie, które nie masetZZ
metody.Sugeruję nieco zmodyfikowany interfejs:
Lepsze imiona
Te nazwy metod pomagają programistom zdecydować, której metody użyć, w zależności od tego, co należy zrobić. Natomiast
SetVisible(bool visible)
mogą mylić dewelopera, ponieważ przekazuje tę samą semantyczne znaczenie, jakShow()
iHide()
,Toggle()
zakłada istnienie warunku, który określa działania. W ten sposób staje się intuicyjne dla programisty, kiedy należy użyć każdej metody.Zredukowana redundancja kodu
Zaletą posiadania wielu metod w interfejsie jest to, że upraszcza kod wywołujący. Możesz po prostu ujawnić
Show()
iHide()
, ale:SetVisible()
prywatnej metody, aby wykonać prawdziwą pracę za kulisami (lub napisać zbędny kod dlaShow()
iHide()
).SetVisible()
(lubToggle()
) już robi, aby uniknąć rozdęcia kodu (nienawidzę zbędnego kodu). W ten sposób powiela się metodę, która prawdopodobnie już istnieje jako metoda prywatna w implementacji.źródło
Sugerowałbym użycie,
SetVisible(bool)
jeśli w ogóle, tylko jeśli dwukrotne przełączenie widoczności (pokaż i ponownie ukryj lub ukryj i ponownie pokaż) pozostawiłoby rzeczy w zasadniczo takim samym stanie, jak przed wykonaniem operacji (w porządku, jeśli pokazywanie i ukrywanie coś lub vice versa pozostawia obiekty wymagające przerysowania, pod warunkiem, że można oczekiwać, że nastąpi to „automatycznie”). Jeśli ukrywanie i pokazywanie obiektu nie przyniesie żadnego innego efektu niż zmiana jednego bitu stanu, wówczas sensownym byłoby, aby kod zewnętrzny miał pewne metody, które akceptują parametr widoczności, a pisanie takiego kodu będzie ułatwioneSetVisible
.Jeśli ukrywanie i ponowne pokazywanie obiektu może mieć skutki uboczne, takie jak zmiana kolejności Z, takie działania powinny być częściej wykonywane osobnymi metodami. W takich przypadkach przydatność metod zewnętrznych, które akceptują parametr „widoczności”, będzie ograniczona, a zatem ułatwienie ich będzie niewielkie. Co więcej,
SetVisible
metoda (błędnie) zasugeruje, że zmiany widoczności obiektów można osiągnąć bez skutków ubocznych.źródło