Ja osobiście jak wyłącznego lub , ^
, operatora, gdy ma to sens w kontekście logicznych kontroli ze względu na jego zwięzłość. Wolę pisać
if (boolean1 ^ boolean2)
{
//do it
}
niż
if((boolean1 && !boolean2) || (boolean2 && !boolean1))
{
//do it
}
ale często mam zdezorientowane spojrzenia od innych doświadczonych programistów Java (nie tylko początkujących), a czasami komentarze o tym, jak powinno być używane tylko do operacji bitowych.
Ciekawi mnie najlepsze praktyki dotyczące korzystania z ^
operatora.
bool1 ^ bool2 ^ bool3
bool1 != bool2 != bool3
!=
zwraca poprawne wyniki dlaboolean
s (ale nie dlaBoolean
s, więc bądź ostrożny). Jednak nie zawsze jest ładny, na przykład(some != null) != (other != null)
nie jest zbyt czytelny. Musisz albo wyodrębnić części w jawnych wartościach logicznych, albo!=
w oddzielnej metodzie.a ^ b
=> "a lub b, ale nie oba",a != b
=> "a nie jest równe b". (Co powiedział @RobertGrant). Większość ludzi zrozumiałaby pierwszy z nich łatwiej, gdyby wiedzieli, czym jest xor (co jest bardzo przydatne, jeśli jesteś w branży komputerowej ...)a != b
=> "a nie jest IDENTYCZNE dla b"Myślę, że odpowiedziałeś na swoje własne pytanie - jeśli ludzie dziwią ci się, bezpieczniej jest wybrać bardziej wyraźną opcję.
Jeśli chcesz to skomentować, prawdopodobnie lepiej zastąp go bardziej szczegółową wersją i nie zmuszaj ludzi do zadawania pytań w pierwszej kolejności.
źródło
(boolean1 && !boolean2) || (boolean2 && !boolean1)
w prawdziwym kodzie aplikacji…Uważam, że często prowadzę podobne rozmowy. Z jednej strony masz kompaktową, skuteczną metodę osiągnięcia celu. Z drugiej strony masz coś, czego reszta twojego zespołu może nie zrozumieć, co utrudnia utrzymanie tego w przyszłości.
Moją ogólną zasadą jest pytanie, czy używana technika jest czymś, czego można oczekiwać od programistów w ogóle. W tym przypadku myślę, że rozsądne jest oczekiwanie, że programiści będą wiedzieli, jak używać operatorów boolowskich, więc użycie xor w instrukcji if jest w porządku.
Jako przykład czegoś, co nie byłoby w porządku, weź sztuczkę polegającą na użyciu xor do zamiany dwóch zmiennych bez użycia zmiennej tymczasowej. To sztuczka, której nie spodziewałbym się, że wszyscy się znają, więc nie przejdzie weryfikacji kodu.
źródło
Myślę, że byłoby dobrze, gdybyś to skomentował, np
// ^ == XOR
.źródło
Zawsze możesz po prostu zawinąć go w funkcję, aby nadać jej pełną nazwę:
Ale wydaje mi się, że nie byłoby to trudne dla każdego, kto nie wiedział, do czego służy operator ^, aby Google to naprawdę szybko. Nie będzie trudno to przypomnieć sobie po raz pierwszy. Ponieważ poprosiłeś o inne zastosowania, często używa się XOR do maskowania bitów.
Możesz także użyć XOR, aby zamienić wartości w dwóch zmiennych bez używania trzeciej zmiennej tymczasowej .
Oto pytanie Stackoverflow związane z zamianą XOR .
źródło
Niedawno użyłem xora w projekcie JavaScript w pracy i ostatecznie dodałem 7 wierszy komentarzy, aby wyjaśnić, co się dzieje. Uzasadnienie zastosowania XOR w tym kontekście to, że jedno z określeń (
term1
w poniższym przykładzie) może przyjmować nie tylko dwa z trzech wartości:undefined
,true
lubfalse
gdy inne (term2
) może byćtrue
lubfalse
. Musiałbym dodać dodatkowe sprawdzenie dlaundefined
przypadków, ale z xor wystarczyło, ponieważ xor wymusza na pierwszym członie, aby był oceniany jako wartość logiczna, pozwalając naundefined
traktowanie go jakofalse
:Ostatecznie było to trochę przesada, ale i tak chciałem to tam zatrzymać, jako rodzaj pisanki.
źródło
bool? a
wartość można jawnie przetestować pod kątem prawdziwego użyciaa == true
- czy istnieje podobna technika w Javie? W C #, biorąc pod uwagę dwiebool?
wartości, „traktuj null jako fałsz” prowadzi do(a == true) ^ (b == true)
. Równoważna formuła to(a == true) != (b == true)
. Czy możesz zrobić coś podobnego w Javie?IMHO ten kod można uprościć:
źródło
Mając na uwadze przejrzystość kodu, uważam, że używanie XOR w sprawdzeniach boolowskich nie jest typowym zastosowaniem operatora bitowego XOR. Z mojego doświadczenia wynika, że bitowe XOR w Javie jest zwykle używane do implementacji
flag toggle
zachowania maski :Ten artykuł autorstwa Vipan Singla wyjaśnia bardziej szczegółowo przypadek użycia.
Jeśli chcesz użyć bitowego XOR, jak w swoim przykładzie, skomentuj, dlaczego go używasz, ponieważ prawdopodobnie nawet bitowa literatura będzie wymagać zatrzymania się na ścieżce, aby zrozumieć, dlaczego go używasz.
źródło
Osobiście wolę wyrażenie „boolean1 ^ boolean2” ze względu na jego zwięzłość.
Gdybym był w Twojej sytuacji (pracując w zespole), poszedłbym na kompromis, umieszczając logikę „boolean1 ^ boolean2” w funkcji o nazwie opisowej, takiej jak „isDifferent (boolean1, boolean2)”.
Na przykład zamiast używać „boolean1 ^ boolean2”, możesz wywołać „isDifferent (boolean1, boolean2)” w ten sposób:
Twoja funkcja „isDifferent (boolean1, boolean2)” wyglądałaby następująco:
Oczywiście to rozwiązanie pociąga za sobą użycie pozornie obcego wywołania funkcji, które samo w sobie podlega kontroli Najlepszych praktyk, ale pozwala uniknąć rozwlekłego (i brzydkiego) wyrażenia „(boolean1 &&! Boolean2) || (boolean2 &&! Boolean1) „!
źródło
Jeśli wzorzec użycia to uzasadnia, dlaczego nie? Podczas gdy Twój zespół nie rozpoznaje operatora od razu, z czasem mogliby to zrobić. Ludzie cały czas uczą się nowych słów. Dlaczego nie w programowaniu?
Jedyne ostrzeżenie, jakie mogę powiedzieć, to to, że "^" nie ma semantyki zwarcia z twojego drugiego testu boolowskiego. Jeśli naprawdę potrzebujesz semantyki zwarć, to działa również statyczna metoda util.
źródło
xor
, która robi dokładnie to, co robi operator xor, ale w okrężny sposób, wywołałby w moim umyśle więcej pytań (szczególnie dotyczących kompetencji) niż programista, który właśnie użył^
.! = jest OK, aby porównać dwie zmienne. Nie działa to jednak w przypadku wielokrotnych porównań.
źródło
Jako operator bitowy, xor jest znacznie szybszy niż jakikolwiek inny sposób, aby go zastąpić. Dlatego w przypadku obliczeń krytycznych dla wydajności i skalowalnych obliczeń xor jest niezbędny.
Moja subiektywna osobista opinia: absolutnie zabronione jest, w jakimkolwiek celu, używanie równości (== lub! =) Dla wartości logicznych. Używanie go wskazuje na brak podstawowej etyki i podstaw programowania. Każdy, kto patrzy na Ciebie ze zdezorientowaniem ^, powinien zostać odesłany z powrotem do podstaw algebry Boole'a (kusiło mnie, aby napisać tutaj „do rzek wiary” :)).
źródło
wygląda dla mnie lepiej niż
źródło