如果您不得不像
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 评论中的 Lightness Races 正确地指出,这些功能是虚假的,并且本身具有不良的恶名。因此,下面是将这种样式应用于野外代码的示例:
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()
;
如您所见,我发现这种样式与移入面向对象空间的功能代码很好地结合在一起。如果您能拿出好名声以中间风格做到这一点,那么您将获得更多的力量。在那之前,我一直在使用它。但无论如何,请找到某种方法来避免无意义的结果名称。他们使我的眼睛受伤。