← 開發日常

改善迴圈的可讀性(一)

情境介紹

不管是練習寫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方法處理,下禮拜我會在整理這些情境並分享給大家,感謝大家耐心閱讀到這邊🤤。

相關連結