Erlang編程風格的對比

以一道編程題爲例:
要求:編寫一個列表反轉程序,但不使用lists:reverse.
[1,2,3,...,5] ->[5,...,3,2,1] 


示例1:
通過模式匹配,一個函數名實現。
注意:這裏其實是兩個函數(參數個數不同的兩個同名函數)。
優點:代碼簡潔
缺點:可讀性不高。明明是兩個函數,卻取了同一個名字,感覺怪怪的。
-module(test).
-export([my_reverse/1]).

my_reverse(L) -> my_reverse(L, []).
my_reverse([H|T], Result) -> my_reverse(T, [H|Result]);
my_reverse([], Result) -> Result.	


示例2:
分層設計,將入口調用函數(my_reverse/1)和處理過程函數(middle_reverse/2)分開.
處理過程使用一個函數調用過程,內部通過if來進行判斷進入不同的分支。
優點:代碼分層,可讀性強。
缺點:處理過程函數使用if,沒有充分利用好erlang模式匹配的天性,而且那個true讓人感覺怪怪的。
-module(test).
-export([my_reverse/1]).

my_reverse([]) -> [];
my_reverse(L) -> middle_reverse(L, []).

middle_reverse([H|T], ResultList) ->
	if
		T =:= [] -> [H|ResultList];
		true -> middle_reverse(T, [H|ResultList])
	end.	


示例3:
分層設計,將入口調用函數(my_reverse/1)和處理過程函數(middle_reverse/2)分開.
處理過程通過兩個函數入口模式匹配(而不是if)來實現。
優點:代碼分層,可讀性強。

缺點:無, Erlang風格,這不算缺點了,如果說有,就是這種風格沒有if那麼符合其他類C語言的閱讀習慣。

-module(test).
-export([my_reverse/1]).

my_reverse([]) -> [];
my_reverse(L) -> middle_reverse(L, []).

middle_reverse([H|T], ResultList) when T =:= [] -> [H|ResultList];
middle_reverse([H|T], ResultList)-> middle_reverse(T, [H|ResultList]).



其實這三個編程示例,都是我先後不同時間對同一道題給出的答案。發現其中的變化,於是就整理了一下。

個人更爲喜歡示例3這種風格的代碼編寫習慣,清晰簡潔,而又符合Erlang本身的特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章