Абстракция данных является основополагающим для большинства объектно-ориентированных языков - в которых классы предназначены для инкапсуляции данных и предоставления методов управления тем, как эти данные изменяются (если вообще), или вспомогательные методы для определения значений этих данных.
Класс Ruby Array является примером абстракции данных. Он обеспечивает механизм управления массивом объектов и предоставляет операции, которые могут выполняться в этом массиве, без необходимости заботиться о том, как он организован.
arr = [1,3,4,5,2,10]
p arr.class # Prints Array
p arr.sort # Prints [1,2,3,4,5,10]
Процедурные абстракции о скрытии деталей реализации процедуры от пользователя. В приведенном выше примере вам не нужно знать, какой метод сортировки использует метод sort
, вы просто используете его, полагая, что хорошие люди в команде Ruby Core выбрали для вас лучший вариант.
В то же время Ruby может и не знать, как сравнивать два элемента, присутствующих в Array
. Например, ниже код не будет работать, поскольку Ruby не знает, как сравнивать строки и числа.
[1,3,4,5,"a","c","b", 2,10].sort
#=> `sort': comparison of Fixnum with String failed (ArgumentError)
Это позволяет подключить к реализации и помощь сравнения, несмотря на то, лежащий в основе алгоритма сортировки остается таким же (как она абстрагируется от пользователя)
[1,3,4,5,"a","c","b", 2,10].sort { |i,j|
if i.class == String and j.class == String
i <=> j
elsif i.class == Fixnum and j.class == Fixnum
i <=> j
else
0
end
}
#=> [1, 3, 4, 5, 2, 10, "a", "b", "c"]
При написании кода для своих собственных проблем, процедурная абстракция может использоваться для обеспечения того, чтобы процедура часто нарушала ее проблему в подсубъекты и решает каждую проблему с использованием отдельной процедуры. Это позволяет, некоторые аспекты будут расширены позже (как в приведенном выше случае, сравнение может быть расширено - благодаря Ruby blocks
это было намного проще). Template method pattern - хорошая техника для достижения этой цели.
Спасибо Wand.So мы делаем абстракцию неосознанно –
Я думаю, что мы делаем абстракцию сознательно, и это важно для хорошего дизайна. –
Извините, но мое беспокойство в том, что. Предположим, что я сделал функцию для вычисления factorial.and пользователь вызывает его как факт (num). Тогда мы можем сказать, что это абстракция. –