Wenn Sie sich gezwungen fühlten, einen Einzeiler wie zu erweitern
a = F(G1(H1(b1), H2(b2)), G2(c1));
Ich würde dir keine Vorwürfe machen. Das ist nicht nur schwer zu lesen, sondern auch schwer zu debuggen.
Warum?
- Es ist dicht
- Einige Debugger markieren nur das Ganze auf einmal
- Es ist frei von beschreibenden Namen
Wenn Sie es mit Zwischenergebnissen erweitern, erhalten Sie
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);
und es ist immer noch schwer zu lesen. Warum? Es löst zwei der Probleme und führt ein viertes ein:
Es ist dicht
Einige Debugger markieren nur das Ganze auf einmal
- Es ist frei von beschreibenden Namen
- Es ist voll mit nicht beschreibenden Namen
Wenn Sie es mit Namen erweitern, die eine neue, gute, semantische Bedeutung hinzufügen, sogar noch besser! Ein guter Name hilft mir zu verstehen.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
Zumindest erzählt dies eine Geschichte. Es behebt die Probleme und ist eindeutig besser als alles andere, was hier angeboten wird, aber es erfordert, dass Sie sich die Namen einfallen lassen.
Wenn du es mit bedeutungslosen Namen machst wie result_this
und result_that
weil dir einfach keine guten Namen einfallen, würde ich es wirklich vorziehen, wenn du uns die bedeutungslose Namensunordnung ersparst und sie mit ein paar guten alten Leerzeichen erweiterst:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
Es ist genauso gut lesbar, wenn nicht besser, als das mit den bedeutungslosen Ergebnisnamen (nicht, dass diese Funktionsnamen so gut sind).
Es ist dicht
Einige Debugger markieren nur das Ganze auf einmal
- Es ist frei von beschreibenden Namen
Es ist voll mit nicht beschreibenden Namen
Wenn dir keine guten Namen einfallen, ist das so gut wie es nur geht.
Aus irgendeinem Grund lieben Debugger neue Zeilen, daher sollten Sie feststellen, dass das Debuggen nicht schwierig ist:
Wenn das nicht genug ist, stellen Sie G2()
sich vor, Sie wurden an mehreren Stellen angerufen, und dann geschah Folgendes:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
Ich finde es schön, dass jeder G2()
Anruf auf einer eigenen Leitung geführt wird und Sie so direkt zum beleidigenden Hauptanruf weitergeleitet werden.
Verwenden Sie daher bitte nicht die Probleme 1 und 2 als Entschuldigung, um uns mit Problem 4 zu beschäftigen. Verwenden Sie gute Namen, wenn Sie an sie denken können. Vermeiden Sie sinnlose Namen, wenn Sie nicht können.
Lightness Races in Orbits Kommentar weist zu Recht darauf hin, dass diese Funktionen künstlich sind und selbst tote, arme Namen haben. Hier ist ein Beispiel für die Anwendung dieses Stils auf Code aus der freien Wildbahn:
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();
Ich hasse es, diesen Strom von Lärm zu betrachten, auch wenn kein Zeilenumbruch erforderlich ist. So sieht es in diesem Stil aus:
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()
;
Wie Sie sehen, funktioniert dieser Stil gut mit dem Funktionscode, der sich in den objektorientierten Raum bewegt. Wenn Sie sich gute Namen einfallen lassen, um das im Zwischenstil zu tun, dann haben Sie mehr Kraft. Bis dahin benutze ich das. Aber bitte finden Sie auf jeden Fall einen Weg, um bedeutungslose Ergebnisnamen zu vermeiden. Sie machen meine Augen weh.