我是Ruby的新手。我正在学习ruby中的抽象原理。我理解过程抽象是隐藏用户的实现细节,或者只是专注于基本要素而忽略细节。
我关心的是如何实现它
1)这是一个简单的函数,就像这样调用
# function to sort array
# @params array[Array] to be sort
def my_sort(array)
return array if array.size <= 1
swapped = false
while !swapped
swapped = false
0.upto(array.size-2) do |i|
if array[i] > array[i+1]
array[i], array[i+1] = array[i+1], array[i]
swapped = true
end
end
end
array
end
并像这样打电话
sorted_array = my_sort([12,34,123,43,90,1])
2)数据抽象与Encapsulation的区别
据我所知,Data Abstraction只是隐藏了其他类的一些成员数据。
答案 0 :(得分:3)
您正在从该方法返回一个数组。数据结构是实现细节。如果更改方法中使用的数据结构,则将中断客户端代码。因此,您的示例不会隐藏实现细节。它没有封装设计决策,因此客户端与内部实现细节无关。
答案 1 :(得分:2)
“抽象”的定义:处理想法而不是事件的质量。
参考此回答difference between abstraction and encapsulation?以及我的理解,我发现在您的代码中,方法my_sort
完全证明了Encapsulation
,因为它封装了与任何排序相关的behavior
single dimension
数组。但是它缺少abstraction
,因为方法my_sort
知道它要处理的数据类型。
如果它不知道/关心通过参数传入的数据类型,那么它就有理由Abstraction
。换句话说,无论是Fixnum
还是String
还是其他sortable datatypes
列表,它都应该对任何对象进行排序。
封装:
我们通常使用访问修饰符(public
,private
,..)来区分要向clients
公开的数据/行为以及要使用的数据/行为{{ 1}}。公共界面(暴露给客户)不会尽可能地改变。但是,internally
是可以更改的行为,在任何情况下都不应影响private
依赖的代码的预期行为。
我们还将敏感数据/行为分离为私有/受保护,以防止意外修改/滥用。这使得客户端不会依赖可能经常更改的代码部分。
clients
与core logic
范围隔离开来。<强>抽象强>:
实施例:
如果是教堂,private
和abstraction
之间有confessor
。忏悔者不应该对father / priest
的名称或任何细节有所了解,反之亦然。无论他/她犯下多大的错误/罪行,任何人都可以承认并隐藏他/她的身份。