对非描述性问题表示道歉; 如果你能想到一个更好的,我会全神贯注.
我正在编写一些Perl来实现一个算法,而我的代码却有些腥味.由于我没有CS背景,所以我的后袋里没有很多关于标准算法的知识,但这似乎是它可能的东西.
让我用隐喻来描述我在做什么:
因此,我们有一个处理列表中项目的算法,如果它们符合某些标准,则应将它们添加到一个结构中,当它满足某些其他标准时,应该"关闭".此外,一旦处理完列表,如果存在"开放"结构,它也应该"关闭".
天真地,我假设算法由一个循环作用于列表,一个条件用于查看列表元素是否属于结构,还有一个条件用于查看结构是否需要"关闭".在循环之外,还有一个条件来关闭任何未完成的结构.
所以,这是我的问题:
我将此标记为"Perl",因为Perlish方法很有意思,但我很想知道任何其他语言都有这方面的解决方案.
它与功能方法非常契合 - 您可以迭代Oranges流,测试,分组和操作它们.在Scala中,它会是这样的:
val oranges:Stream[Oranges] = ... // generate a stream of Oranges
oranges.filter(_.isNotRotten).grouped(10).foreach{ o => {(new Box).fillBox(o)}}
Run Code Online (Sandbox Code Playgroud)
(grouped最后用部分方框做对了)
可能有Perl等价物.
是否有一种有效的方法可以将"关闭盒子"活动合并到一个地方,而不是一次在循环内部和一次在循环之外?
是.只需在"结构需要关闭"功能中添加"......或没有更多的橙子".执行此操作的最简单方法是do/while构造(从技术上讲,它不是Perl中的循环,尽管它看起来像一个):
my $current_container;
my $more_objects;
do {
my $object = get_next_object(); # Easiest implementation returns undef if no more
$more_objects = more_objects($object) # Easiest to implement as "defined $object"
if (!$more_objects || can_not_pack_more($current_container) {
close_container($current_container);
$current_container = open_container() if $more_objects;
}
pack($object, $current_container) if $more_objects;
} while ($more_objects);
Run Code Online (Sandbox Code Playgroud)
恕我直言,如果close_container()被封装到一个方法中,这并没有真正赢得任何东西- 在循环内外调用它没有重大的技术或代码质量成本.实际上,我强烈认为像上面提到的一个复杂的解决方法是WORSE代码质量明智而不是直截了当:
my $current_container;
while (my $more_objects = more_objects(my $object = get_next_object())) {
if (can_not_pack_more($current_container)) { # false on undef
close_container($current_container);
}
$current_container = open_container_if_closed($current_container); # if defined
pack($object, $current_container);
}
close_container($current_container);
Run Code Online (Sandbox Code Playgroud)