我见过代码,其中只有两个相当静态的元素要映射,例如带有开始和结束日期的时间间隔,但是正在使用map()
而不是用于映射的显式代码,例如。
{ map { ... } qw(start end) } # vs.
{ start => ..., end => ... }
哪种方式更受欢迎,为什么?
map
形式可能不那么简洁,但看起来更具功能性(如在函数式编程中),所以我猜这就是为什么它可能比显式代码更受欢迎而且可能更干。
然而,它对我来说看起来不太清晰,因为后面有更多的逻辑,并且映射也应该效率低,因为它调用a并且包含更多的原子操作。
修改
编程中存在一个相互矛盾的目标:KISS(保留它{pick 2 from:small,simple,stupid})。使用map
会使代码稍微复杂化。
答案 0 :(得分:5)
假设您不只是将两个项目设置为相同的常量或类似的微不足道的东西,我希望@javax.annotation.Resource(name="componentName")
版本更多简洁。
IMO,支持map
版本的主要观点是,您知道将使用相同的过程来生成这两个值。不仅是为了DRY,还因为它消除了任何人可能会发生微妙变化的担忧,而另一方则没有。
至于性能问题......如果您的用例对任何可能存在的重大差异具有足够的性能敏感性,那么您不应该首先使用Perl。切换到编写良好的C(不是C#,而不是C ++,而不是目标C - 只是简单的C)将比微优化具有更大的性能影响,无论是单独分配两个值还是使用循环来设置它们。但无论如何,你的用例敏感的几率几乎为零。
答案 1 :(得分:3)
编码原则称为DRY。不要重复自己。
它断言:
每一段知识都必须在系统中具有单一,明确,权威的表示。
这可以解释为使用map
/ for
之类的东西来缩减重复输入。
当我尝试扩展某些文字时,我会使用你引用过的成语 - 例如:
my @defs = map { "DEF:$_=$source_file:$_:MAX" } qw ( read write );
这会为rrdtool
生成一些DEF行。
我这样做,因为对于一些案例,我已经有了相当长的“我想要定义的事情列表”。并希望保持一致。 (有时我会说,10条相似的行只有一个单词而不同)。
但也因为:
my @defs = ( "DEF:read=$source_file:read:MAX",
"DEF:write=$source_file:write:MAX" );
对于两个元素而言,它并不多,我建议它与任何事物一样具有风格。但是,如果您获得的不仅仅是这些,那么很快就会变得非常有益,因为您可以更改单个行 - 比如说您有不同的文件位置?想将MAX换成AVERAGE吗?
“标点符号盲人”也非常容易上手。在查看一系列类似的陈述时,某人会被错误添加并添加,
,其中应该是.
或类似的。map
。
并且......在可读性方面你可能不会失去很多东西。但是会承认这是一种风格点,因为虽然public ActionResult Complete(int? id)
{
if(int != null && int != 0){ //Makes sure int isn't empty or 0
var allModelData = dataContext(); //Get all the data in your dataContext
var myModel = allModelData.FirstOrDefault(x => x.id == id); //This gets the
//model that matches the ID
CheckOutViewModel viewModel = myModel; //Populate it into your viewmodel
return View(viewModel); //Return your viewmodel
}
return View();
}
非常惊人,但如果你不小心的话,可以制作一些相当难读的代码
另外要具体说明:
映射也应该效率较低,因为它调用a调用并包含更多原子操作。
wise man曾说过:
过早优化是万恶之源
不要考虑声明的效率 - 看看易读性/可读性。编译器非常聪明。大多数"显而易见"优化,他们已经为你做了。处理器也非常快。 大多数代码中的限制因素不是您需要的CPU周期量,它的IO吞吐量和内存占用量。所以不用担心 - 编写清晰的代码。
如果您的代码存在性能要求,那么您应该使用代码分析器来查看您在重构方面获得最高效率的位置。这样做(有时)可能会得到不太清晰的代码,但这是一个更明确的权衡。