Якщо ви змушені розширити один лайнер, як
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()
дзвінок проходив би по власній лінії, цей стиль в основному переносить вас на виклик, який ображає вас.
Тому, будь ласка, не використовуйте проблеми 1 і 2 як привід для вирішення проблеми 4. Використовуйте хороші імена, коли ви можете їх думати. Уникайте безглуздих імен, коли не можете.
Гонки легкості в коментарі Орбіти правильно вказують, що ці функції штучні і самі по собі мають мертві бідні імена. Ось ось приклад застосування цього стилю до деякого коду з дикої природи:
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()
;
Як бачите, я знайшов, що цей стиль добре працює з функціональним кодом, що рухається в об'єктно-орієнтований простір. Якщо ви можете придумати хороші імена, щоб зробити це в проміжному стилі, тоді вам більше сили. До цього часу я цим користуюся. Але в будь-якому випадку, будь ласка, знайдіть якийсь спосіб уникнути безглуздих імен результатів. Вони змушують мене боліти очі.