情境介紹
不管是練習寫Kata或者是工作中,迴圈都是最常使用的語法之一。而在迴圈中很常出現一種Aggregation Pattern,例如:合計集合中的所有數字。
這種Pattern會大量的存在產品代碼中,雖然這些代碼行數通常不會太多,但是每次閱讀到都需要重新理解的話,就會顯得有點浪費時間。花些時間讓這些代碼更簡潔,更具可讀性是十分值得。
簡單的情境
例如下面這段代碼:合計集合中的所有數字,最容易想到的作法就是利用一個變數暫存合計數值,等到迴圈跑完就能得到所有數字的合計值。
c#
int sum = 0;
for (int i = 0; i < numbers.Length; i++)
{
sum += numbers[i];
} 若是對語言或框架比較熟悉的人,可能就會用一些語言或框架提供的Aggregation方法來簡化代碼。例如:C#有Linq的Sum()能用,或者是Dart也有reduce()可以用。
c#
numbers.Sum(); // C#
numbers.reduce((acc, number) => acc + number); //Dart 稍微複雜一點
假設今天使用情境不是數字集合,而是物件集合,C#能透過Linq的Aggregate()、Dart也能使用fold()來簡化。例如要把一個產品訂單集合合併成一個購物車物件,把所有Order的屬性總和到ShoppingCart的屬性中。
c#
orders.Aggregate(new ShoppingCart(), (shoppingCart, order) {
shoppingCart.TotalPrice += order.Price;
shoppingCart.OrderIds.Add(order.Id);
...
}); // C#
dart
orders.fold(ShoppingCart(), (shoppingCart, order) {
shoppingCart.totalPrice += order.price;
shoppingCart.orderIds.add(order.id);
...
}); // Dart 利用語言提供的Aggregation方法來簡化代碼能滿有效的增加可讀性,一看到Aggregation方法就會知道這段代碼是要累計某些東西。上面這兩個例子中都是比較容易利用語言的Aggregation方法來簡化寫法。
更多變的情境
在實際產品代碼中,有一些情境讓人比較難想到可以使用Aggregation方法,還有另外一些情境則是不容易用Aggregation方法處理,下禮拜我會在整理這些情境並分享給大家,感謝大家耐心閱讀到這邊🤤。