在我作为计算机科学专业的第二学期,几乎整个学期我们都专注于编写不同变体的链表(堆栈,队列......)。这些列表的设计总是归结为这个
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 :(得分:1)
如上所述,他们“以第一种方式实施”的原因包括
效果。
在编写算法或实现支持搜索和排序等操作的数据结构时,时间和空间复杂性是两个最重要的问题。正如您所提到的,创建递归方式的列表不可变!创建列表的目的是实现更快的操作。因此设计师更喜欢“第一时尚”。
面向对象
在解决实际问题的同时,最初的面向对象分析和设计(OOAD)非常重要。通过对象建模尽可能地与现实世界的对象/事物非常相似,设计师可以实现更好的解决方案。递归方法似乎错过了这个方面
<强>可扩展性强>
API /库的设计人员在起草设计时会考虑可扩展性。以“第一时尚”编写的代码更具可扩展性,易于理解。
其他设计问题
这不是任何方式的原因的详尽清单。编程民俗中存在许多其他因素和基于经验的学习,这导致了第一种时尚的选择。