ruby中的过程和数据抽象

时间:2015-09-11 05:33:47

标签: ruby oop abstraction

我是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只是隐藏了其他类的一些成员数据。

2 个答案:

答案 0 :(得分:3)

您正在从该方法返回一个数组。数据结构是实现细节。如果更改方法中使用的数据结构,则将中断客户端代码。因此,您的示例不会隐藏实现细节。它没有封装设计决策,因此客户端与内部实现细节无关。

答案 1 :(得分:2)

  

“抽象”的定义:处理想法而不是事件的质量。

参考此回答difference between abstraction and encapsulation?以及我的理解,我发现在您的代码中,方法my_sort完全证明了Encapsulation,因为它封装了与任何排序相关的behavior single dimension数组。但是它缺少abstraction,因为方法my_sort知道它要处理的数据类型。

如果它不知道/关心通过参数传入的数据类型,那么它就有理由Abstraction。换句话说,无论是Fixnum还是String还是其他sortable datatypes列表,它都应该对任何对象进行排序。

封装

我们通常使用访问修饰符(publicprivate,..)来区分要向clients公开的数据/行为以及要使用的数据/行为{{ 1}}。公共界面(暴露给客户)不会尽可能地改变。但是,internally是可以更改的行为,在任何情况下都不应影响private依赖的代码的预期行为。
我们还将敏感数据/行为分离为私有/受保护,以防止意外修改/滥用。这使得客户端不会依赖可能经常更改的代码部分。

  • 因此,总是需要将clientscore logic范围隔离开来。

<强>抽象

实施例: 如果是教堂,privateabstraction之间有confessor。忏悔者不应该对father / priest的名称或任何细节有所了解,反之亦然。无论他/她犯下多大的错误/罪行,任何人都可以承认并隐藏他/她的身份。