Если вы были вынуждены расширить один лайнер, как
a = F(G1(H1(b1), H2(b2)), G2(c1));
Я не буду винить тебя. Это не только трудно читать, но и трудно отлаживать.
Почему?
- Это плотно
- Некоторые отладчики только выдвигают на первый план все сразу
- Это свободно от описательных имен
Если вы расширите его с промежуточными результатами, вы получите
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);
и это все еще трудно читать. Почему? Это решает две проблемы и вводит четвертую:
Это плотно
Некоторые отладчики только выдвигают на первый план все сразу
- Это свободно от описательных имен
- Это загромождено неописательными именами
Если вы расширите его именами, которые добавляют новое, хорошее, семантическое значение, даже лучше! Хорошее имя помогает мне понять.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
Теперь, по крайней мере, это рассказывает историю. Это решает проблемы и явно лучше, чем все остальное, что предлагается здесь, но требует от вас придумать имена.
Если вы делаете это с бессмысленными именами, такими как, result_this
и result_that
потому что вы просто не можете думать о хороших именах, то я бы действительно предпочел, чтобы вы избавили нас от бесполезного загромождения имен и расширили его, используя старые добрые пробелы:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
Он так же удобен для чтения, если не больше, чем тот, который имеет бессмысленные имена результатов (не то, чтобы эти имена функций были такими хорошими).
Это плотно
Некоторые отладчики только выдвигают на первый план все сразу
- Это свободно от описательных имен
Это загромождено неописательными именами
Когда вы не можете думать о хороших именах, это так же хорошо, как и получается.
По некоторым причинам отладчики любят новые строки, поэтому вы должны обнаружить, что отладка это не сложно:
Если этого недостаточно, представьте, что вам G2()
позвонили более чем в одном месте, и тогда это произошло:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
Я думаю, это хорошо, что, поскольку каждый G2()
вызов будет на отдельной линии, этот стиль приведет вас непосредственно к вызову-нарушителю в main.
Поэтому, пожалуйста, не используйте проблемы 1 и 2 в качестве предлога, чтобы увязать нас с проблемой 4. Используйте добрые имена, когда вы можете думать о них. Избегайте бессмысленных имен, когда вы не можете.
Гонки Легкости в комментарии Orbit правильно указывают на то, что эти функции являются искусственными и имеют мертвые плохие имена. Итак, вот пример применения этого стиля к некоторому дикому коду:
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();
Я ненавижу смотреть на этот поток шума, даже когда перенос слов не нужен. Вот как это выглядит в этом стиле:
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()
;
Как вы можете видеть, я обнаружил, что этот стиль хорошо работает с функциональным кодом, который перемещается в объектно-ориентированное пространство. Если вы можете придумать добрые имена, чтобы сделать это в промежуточном стиле, тогда вам больше под силу. До этого я использую это. Но в любом случае, пожалуйста, найдите способ избежать бессмысленных имен результатов. Они делают мои глаза болят.