gpt4 book ai didi

dry - 是否有重用 for 循环的 DRY 方法?

转载 作者:行者123 更新时间:2023-12-04 20:01:54 27 4
gpt4 key购买 nike

假设我有一个稍微复杂的 for 循环,用于不同的情况。有没有一种方法可以提取该 forloop 并仍然保持代码可读性?

例如:

private function bar(){
for(i=0;i<arrayA.length;i++){
if(arrayA[i].someVar == foobar){
doSomethingA();
}
}
}
private function foo(){
for(i=0;i<arrayA.length;i++){
if(arrayA[i].someVar == foobar){
doSomethingB();
}
}
}

我会这样做/回答问题的方式是写这样的东西:

private function loopFunction(callback:Function){
for(i=0;i<arrayA.length;i++){
if(arrayA[i].someVar == foobar){
callback();
}
}
}
private function bar(){
loopFunction(doSomethingA);
}
private function foo(){
loopFunction(doSomethingB);
}

但是我发现这种方法有时会使代码难以阅读,因为您不太确定谁在什么时候做了什么。特别是如果传入的函数来自另一个类。有更好的方法吗?

此解决方案可能不起作用的另一个原因是,如果您需要将不同的参数传递给回调函数。例如。

private function bar(){
for(i=0;i<arrayA.length;i++){
if(arrayA[i].someVar == foobar){
doSomethingA(arrayA);
}
}
}
private function foo(){
for(i=0;i<arrayA.length;i++){
if(arrayA[i].someVar == foobar){
doSomethingB(i);
}
}
}

最佳答案

正如其他人所指出的,higher-order functions mapfoldfilter 等都提供了这种功能。当然,具体的实现会因语言而异。

这是一个 C# 示例:

var foobarList = arrayA.Where(x => x.someVar == foobar).ToList();
foobarList.ForEach(x => doSomethingA());
foobarList.ForEach(x => doSomethingB());

和 VB.NET:

Dim foobarList = arrayA.Where(Function(x) x.someVar = foobar).ToList()
foobarList.ForEach(Function(x) doSomethingA())
foobarList.ForEach(Function(x) doSomethingB())

和 Javascript:

var foobarList = arrayA.filter(function(x) { return x.someVar == foobar });
foobarList.forEach(function(x) { doSomethingA(); });
foobarList.forEach(function(x) { doSomethingB(); });

关于dry - 是否有重用 for 循环的 DRY 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15388270/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com