《重构》:以管道取代循环(Replace Loop with Pipeline),区分与链式调用

what is "Replace Loop with PipeLine"?

以管道取代循环(Replace Loop with Pipeline)是一种重构技巧,用于将数据在管道中依次传递处理,而不是通过循环逐个操作。这项技术可以提高代码的可读性和可维护性,并且能够充分利用现代 CPU 和多核架构,从而提高应用程序的性能。

以 C# 和 LINQ 为例,我们可以使用集合的 Select()Where()OrderBy() 等方法,链式调用它们来获取所需的结果集。例如,假设我们有一个整数列表,需要计算其中所有偶数的平均值,可以使用以下代码实现:

var numbers = new List { 1, 2, 3, 4, 5, 6, 7, 8 };
var filteredNumbers = new List();
foreach (var number in numbers)
{
    if (number % 2 == 0)
    {
        filteredNumbers.Add(number);
    }
}
double average = 0.0;
foreach (var number in filteredNumbers)
{
    average += number;
}
average /= filteredNumbers.Count;

上述代码使用了循环来迭代整数列表并筛选出所有偶数,并最终计算它们的平均值。但是,我们也可以将其转换为基于管道的代码:

var numbers = new List { 1, 2, 3, 4, 5, 6, 7, 8 };
double average = numbers
    .Where(n => n % 2 == 0)
    .Average();

在这个示例中,我们使用了 Where() 方法来筛选所有偶数,然后使用 Average() 方法计算它们的平均值。通过这种方式,我们减少了代码行数,并且可以更轻松地阅读和理解整个处理过程。重要的是,仍需要确保代码执行正确的结果。

管道代替循环 与 链式调用 之间的联系和区别?

管道取代循环和链式调用是两个不同的概念。

管道取代循环(Pipe operator)是一种编程模式,适用于函数式编程语言。它通过将一个函数的输出直接传递给另一个函数,从而避免了使用循环来处理集合中的数据。在这种模式下,一个操作可以应用于整个集合,而不需要使用循环来迭代每个元素。

链式调用(Chaining)则是一种面向对象编程的概念,在调用对象的方法时可以连续地调用多个方法,也就是把多个方法调用串起来。这可以使代码变得更加简洁。

例如,在JavaScript中,我们可以使用点号 . 连接多个函数调用:

const result = " hello world! "
    .trim()
    .toUpperCase()
    .replace("WORLD", "Genie");

以上代码会将字符串 " hello world! " 做以下三个操作:

  • 去除前后空格。
  • 转换为全大写。
  • 将 "WORLD" 替换为 "Genie"。

因此,虽然两者可以在某种程度上实现相似的效果,但它们本质上是不同的编程概念。

2023/4/20 

注: 此重构方法 结合 状态机 模式 非常好用,能很清楚的看明白业务逻辑

你可能感兴趣的:(设计模式,重构,linq,c#)