Co jest łatwiejsze do utrzymania - przypisanie boolowskie poprzez wyrażenie if / else lub wyrażenie boolowskie?

11

Które można by uznać za łatwiejsze w utrzymaniu?

if (a == b) c = true; else c = false;

lub

 c = (a == b);

Próbowałem szukać w Code Complete, ale nie mogę znaleźć odpowiedzi.

Myślę, że pierwszy jest bardziej czytelny (można dosłownie odczytać go na głos), co, jak sądzę, czyni go łatwiejszym do utrzymania. Drugi z pewnością ma większy sens i redukuje kod, ale nie jestem pewien, czy jest tak łatwy w utrzymaniu dla programistów C # (oczekiwałbym, że zobaczę ten idiom bardziej na przykład w Pythonie).

Bret Walker
źródło
3
Te dwa nie są równoważne. Potrzebujesz else c = falsepierwszego lub uczyń zadanie ||=drugim.
17
Myślę, że fakt, że musiałeś dokonać dwóch zmian w pierwszej formie, odpowiada na twoje pytanie!
James
7
Zgadzam się z @James. Druga forma, choć nie tak pełna, jest bardzo łatwa do zrozumienia i nie pozostawia dwuznaczności co do jej znaczenia. Nie bierze się żadnych sztuczek ani skrótów, jest po prostu krótki, ponieważ koncepcja jest prosta. Fakt, że zakodowałeś pierwszy z błędem i musiałeś go edytować, aby go naprawić, i nadal nie jest doskonały (niespójne użycie nawiasów klamrowych), jest dowodem na to, że nie jest tak prosty, jak myślisz.
Eric King
5
Wow, czy deweloperzy C # naprawdę uważają pierwszą formę za dopuszczalną? To ... poważnie zmniejsza moje zaufanie do nich. Z mojego doświadczenia wynika, że ​​użycie pierwszej formy mocno wskazuje na całkowite nieporozumienie wyrażeń boolowskich.
Andres F.,
2
Aby zachować ciekawość, oto kolejna opcja:c = a==b ? true : false;
FrustratedWithFormsDesigner

Odpowiedzi:

14

Druga opcja jest lepsza.

Istnieje wyraźny powód, aby zachować ostrożność wobec sprytnych skrótów programistycznych, które szkodzą łatwości konserwacji, zaciemniając przeznaczenie kodu. Więc nie winię cię za to, że zadałeś pytanie.

Nie uważam jednak za c = (a == b);przykład sprytnej sztuczki. Jest to proste przedstawienie prostej koncepcji. Tak proste, jak to tylko możliwe.

Właściwa „utrzymaniu” formatowanie z pierwszego przykładu (bez brakujących zaczepów i jednego wiersza konstruktem, który ja zrobienia rozważyć sprytny skrót) przyniesie ten kod:

if (a == b)
{
    c = true; 
}
else 
{
    c = false;
}

Z mojego doświadczenia wynika, że ​​pisanie prostej logiki boolowskiej w taki pełny, podatny na błędy sposób jest oznaką „niepewnego” kodu. Zastanawiałbym się, jak w tej bazie kodu obsługiwana jest bardziej złożona logika.

Eric King
źródło
15

Po pierwsze, zdaj sobie sprawę, że twoje dwie formy nie są równoważne.

if (a == b) c = true;

czostanie ustawiony na true, jeśli ajest równy b, a jeśli nie, jego wartość pozostanie czymkolwiek już jest.

c = (a == b);

czostanie ustawiona na true, jeśli ajest równa b, a jeśli nie, zostanie ustawiona na false.

Jeśli chcesz ekwiwalent drugiej formy, w stylu pierwszej formy, musisz napisać to w ten sposób:

if (a == b) {
  c = true;
} else c = false;

Teraz jest jasne, który z nich jest bardziej czytelny, łatwiejszy w utrzymaniu i rzadziej wprowadza błędy, jeśli coś zostanie zmienione. Trzymaj się drugiej formy.

Mason Wheeler
źródło
Absolutnie słuszne - zaktualizowałem swoje pytanie.
Bret Walker
Uważam, że druga forma jest zbyt długa i skomplikowana - jeśli chcesz ten efekt, użyj przypisania boolowskiego.
Przywróć Monikę - M. Schröder,
11

Nie zgadzam się z tym, że twoja pierwsza forma jest bardziej czytelna - z pewnością nie jest idiomatycznym C # mieć dwie instrukcje w jednym wierszu i nie zaleca się posiadania ifinstrukcji bez użycia nawiasów klamrowych.

Po drugie, nie rozumiem, w jaki sposób druga forma jest trudniejsza do utrzymania - nie ma nic do utrzymania. To proste stwierdzenie związku między aa bi to nie może być wyrażona dowolny prościej.

Innym powodem preferowania drugiej formy jest to, że możesz ją zadeklarować ci przypisać w pojedynczej instrukcji, tj

bool c = (a == b);

Modyfikowanie zmiennych może łatwo prowadzić do błędów, więc bym tego unikał. Użycie ifinstrukcji wymaga zadeklarowania zmiennej przed warunkowym, a następnie zmodyfikowania.

Zawietrzny
źródło
Dwie wypowiedzi w jednym wierszu czytam jako pseudo-kod
Jimmy Hoffa
1
+1 za „ Another reason to prefer the second form is that you can declare c and assign it in a single statement
Andres F.
0

„łatwiejsze w utrzymaniu” może być bardzo subiektywne.

Zwykle wolę czytelność i celowość niż redukcję kodu. Myślę, że zapisujesz 8 wpisanych znaków, używając zredukowanej formy.

Moim zdaniem obchodzenie języka i kultury wokół języka jest cechą „czytelności”.

Są chwile, w których wydajność może być przyczyną zmniejszenia kodu w celu optymalizacji wynikowego kodu bajtowego, ale należy to zrobić ostrożnie po pewnym profilowaniu.

Johnnie
źródło
Subiektywny: Duh. Redukcja kodu: Można również (jeśli nie przesadzić) poprawić przejrzystość i lepiej komunikować zamiary. Wydajność: W ogóle nie ma znaczenia (optymalizacja jest czasami niezbędna, ale nie jest to kwestia, która nie podlega optymalizacji, ponieważ praktycznie nigdy nie ma znaczenia - prawdopodobnie nawet jeśli piszesz jądra lub sterowniki).
4
Pierwsza forma zawierała co najmniej 1 błąd, który należało poprawić, ukryty w szczegółowości. Druga forma była prosta i na temat i nie zawierała błędów. Opieram swoją sprawę. W każdym razie głównym celem nie było wpisywanie mniejszej liczby znaków! To pytanie w ogóle nie dotyczyło wydajności, co w tym przypadku nie ma znaczenia.
Andres F.,
@ delnan dokładnie mój punkt, Duh. czyjaś redukcja kodu jest czyjąś przejrzystością. Nie wymieniłem optymalizacji jako głównego problemu ... Użyłem jej jako przykładu. Twój powód dodania sprytnych sztuczek lub wyjścia poza normę powinien być zrównoważony przez to, co ty / kultura / przedsiębiorstwo uzna za czytelne.
Johnnie
1
Napisanie czystego wyrażenia logicznego nie jest sprytną sztuczką!
Andres F.,
Myślę, że bardziej zasługiwałbym na twój komentarz, gdybyś rzeczywiście odniósł się do ducha pytania, a nie do bezsensownej analogii użytej do poparcia podstawowej koncepcji.
Johnnie
0

Drugi. Ma mniej powtórzeń (suchy) i jest łatwiejszy do zrozumienia tego, co się dzieje, że cposiada do wartości, czy nie ai być brówne.

IMHO, jeszcze lepiej byłoby

c = a == b

Tak jak bym napisał

  • 1 + 2 + 3 zamiast ((1 + 2) + 3)
  • 5 + 3 * 7 zamiast (5 + (3 * 7))

Oczywiście i trywialnie niepotrzebny kod nie jest zaletą. Jest zagracony.

Paul Draper
źródło
-4

Głosujący, proszę wyjaśnić, co jest nie tak z moją poprawioną odpowiedzią.

Tak, c = (a == b);może być trudny do odczytania (jeszcze gorzej, StyleCop narzeka na niepotrzebne nawiasy), ale nadal podoba mi się prostota a == b. Dlatego tutaj jest to, co lubię używać, gdy oba ai bsą takie same:

private static bool NoPeriod
{
    get
    {
        return this.MyWaveLength == this.HerWaveLength;
    }
}

A potem możesz zrobić: this.c = this.NoPeriodzamiast:

this.c = this.MyWavelength == this.HerWaveLength;
Praca
źródło
1
więc miałeś na myśli return this.MyWaveLength = this.HerWaveLength;czy return this.MyWaveLength == this.HerWaveLength;zamiast tego?
Jesse C. Slicer
5
Co!? c = (a == b);nie jest podatny na błędy. Pierwsza forma w pierwotnym pytaniu jest bardziej podatna na błędy , o czym świadczy sam OP, który musi edytować swoje pytanie, aby naprawić błędy!
Andres F.,
Wydaje mi się, że w Twoim sugerowanym rozwiązaniu występuje błąd = vs. ==
Ondra
@Ondra Morský, dzięki ... kompilator by mnie złapał.
Job
6
StyleCop nie jest mi znany, ale jeśli mówi ci, że niepotrzebne nawiasy są złe, powinieneś je wyłączyć. Niepotrzebne nawiasy nie są potrzebne kompilatorowi, ale mogą być bardzo, bardzo miłe dla ludzkich oczu. Jeśli napisałeś c = a == b; kompilator może sobie z tym poradzić, ale dla człowieka jest to trudniejsze.
Michael Shaw,