Jeśli czujesz się zmuszony do rozszerzenia jednego liniowca
a = F(G1(H1(b1), H2(b2)), G2(c1));
Nie obwiniłbym cię. To nie tylko trudne do odczytania, ale także trudne do debugowania.
Dlaczego?
- Jest gęsta
- Niektóre debuggery podświetlą wszystko od razu
- Jest wolny od opisowych nazw
Jeśli rozszerzysz go o wyniki pośrednie, otrzymasz
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
i nadal jest trudny do odczytania. Dlaczego? Rozwiązuje dwa problemy i wprowadza czwarty:
Jest gęsta
Niektóre debuggery podświetlą wszystko od razu
- Jest wolny od opisowych nazw
- Jest zaśmiecona nieopisowymi nazwami
Jeśli rozszerzysz go o nazwy, które dodają nowe, dobre, semantyczne znaczenie, jeszcze lepiej! Dobre imię pomaga mi zrozumieć.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
Teraz przynajmniej opowiada historię. Rozwiązuje problemy i jest wyraźnie lepszy niż cokolwiek innego oferowanego tutaj, ale wymaga wymyślenia nazw.
Jeśli robisz to z bezsensownymi nazwami, takimi jak result_this
i result_that
ponieważ po prostu nie potrafisz wymyślić dobrych imion, naprawdę wolałbym, abyś oszczędził nam bezsensownego bałaganu nazw i rozwinął go za pomocą starej dobrej białej spacji:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
Jest tak samo czytelny, jeśli nie bardziej, niż ten z bezsensownymi nazwami wyników (nie dlatego, że te nazwy funkcji są tak świetne).
Jest gęsta
Niektóre debuggery podświetlą wszystko od razu
- Jest wolny od opisowych nazw
Jest zaśmiecona nieopisowymi nazwami
Kiedy nie możesz wymyślić dobrych imion, to jest tak dobre, jak to tylko możliwe.
Z jakiegoś powodu debugery uwielbiają nowe linie, dlatego powinieneś przekonać się, że debugowanie nie jest trudne:
Jeśli to nie wystarczy, wyobraź sobie, że G2()
został powołany w więcej niż jednym miejscu, a potem tak się stało:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
Myślę, że to miłe, że ponieważ każde G2()
połączenie odbywa się na jego własnej linii, ten styl przenosi Cię bezpośrednio do obrażającego połączenia głównego.
Dlatego nie używaj problemów 1 i 2 jako pretekstu, aby poradzić sobie z problemem 4. Używaj dobrych nazwisk, kiedy możesz o nich myśleć. Unikaj bezsensownych nazw, kiedy nie możesz.
Lekkość Wyścigi w komentarzu Orbity poprawnie wskazują, że te funkcje są sztuczne i same mają martwe, złe nazwy. Oto przykład zastosowania tego stylu do dzikiego kodu:
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
Nienawidzę patrzeć na ten strumień hałasu, nawet gdy zawijanie słów nie jest potrzebne. Oto jak to wygląda w tym stylu:
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
Jak widać, zauważyłem, że ten styl działa dobrze z kodem funkcjonalnym, który porusza się w przestrzeni zorientowanej obiektowo. Jeśli potrafisz wymyślić dobre nazwiska, aby zrobić to w stylu pośrednim, to więcej mocy dla ciebie. Do tego czasu używam tego. Ale w każdym razie, znajdź jakiś sposób na uniknięcie bezsensownych nazw wyników. Bolą mnie oczy.