2013-12-23 126 views
3

作爲計算機科學專業的學生,​​我的第二個任期幾乎是整個學期,我們專注於以不同的變化(棧,隊列......)編寫鏈表。這些列表的設計總是來到了這個鏈接列表單一班級vs多個班級

class List<T> { 
    class ListElement { 
     T value; 
     ListElement next; 
    } 
    ListElement root; 
} 

與變化,向其中實現的方法和他們如何工作(我在這裏爲了簡化,不構造和性能)。有一天,我開始學習scala並專注於函數式編程。這也到了一個鏈接列表被寫入的地方,但是在風格的實現中。

class List[T](head: T, tail: List[T]) 

儘管語法和不變性不同,但在我看來,這是另一回事。 我想我自己:「那麼你可以在C#或Java中用相同的方式實現列表,其中一個class比你學到的知識要少。」

我可以看到你爲什麼會在功能性語言,其中遞歸還不如危險在C#或Java實現鏈表一樣,因爲至少我在思考一個遞歸執行的所有常用方法的方法這個設計的鏈表非常直觀。

我不明白的是,爲什麼C#或Java中的鏈表通常以第一種方式實現,而您可以用較少的代碼實現它們,但具有相同的冗長度?(我不是在談論語言庫中的列表實現,而是關於你通常寫作程序員的列表)

我可以看到第一種方法的唯一好處是你可以隱藏從用戶的實施更好一點,但這是這個原因,也是這個值得追加 class 我甚至不會需要我的實現暴露給用戶,作爲我仍然可以實現我的名單內不同,也許只選擇了有一個這樣的構造函數,並提供功能中檢索列表中的第一個元素作爲head也其餘爲tail

+0

假設沒有通用的可空性,在後一種情況下仍然需要多個類。 Scala解決它像[this](https://gist.github.com/rightfold/ef1faf5415655d3900c2)。 – rightfold

+0

@rightfold這當然是真的,但理論上你可以將'tail'設置爲'null'或者在scala的情況下你可以使用'Option [List [T]]'。我知道使用'null'是不好的,但在C#世界中它似乎被廣泛接受(至少在我必須使用的代碼或聽說過的講座中)。同樣在第一種情況下,如果列表爲空,您還需要一個值來將root設置爲。 – mgttlinger

+0

'Option'是一個類,所以你仍然有兩個類。 :) – rightfold

回答

1

對它們進行「第一方式實現」正如你所提到的原因包括

性能。

的時間和空間複雜度都在寫算法或實現支持像搜索和排序操作數據結構的兩個最重要的關注。正如你所提到的,列表創建的遞歸方式是不可變的!創建列表的目的是爲了達到更快的操作。所以設計師更喜歡'第一時尚'。

面向對象

在解決現實世界的問題,最初的面向對象的分析和設計(OOAD)問題很多。通過儘可能與真實世界對象/事物極其相似的對象建模,設計人員可以實現更好的解決方案。遞歸方法似乎錯過了這方面

可擴展性的API

設計師/庫保持的可擴展性考慮,當他們起草的設計。以'第一時尚'編寫的代碼更具可擴展性,易於理解。

其它設計問題

這不以任何方式對其原因進行詳盡的清單。在編程民間傳說中存在許多其他因素和基於經驗的學習,這導致​​了第一種時尚的選擇。

+0

我不明白爲什麼其中一個實現應該從性能角度來看更好。只要我的成員變量是可變的,我就可以很好地實現第二種方式的可變列表。 從一個面向對象的角度來看,我也不認爲一個人比另一個更接近現實世界,因爲兩個設計都有一個根/頭的對象和一個包含所有其他元素的下一個/尾。 你也可以請詳細說明爲什麼第一個aproach更具擴展性? – mgttlinger