2015-09-11 4 views
6

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のように呼び出す簡単な関数カプセル化とは異なります

私が理解しているように、データ抽象化はただのhidi他のクラスのいくつかのメンバーデータ。

答えて

3

メソッドから配列を返します。データ構造は実装の詳細です。メソッドで使用されるデータ構造を変更すると、クライアントコードが破損します。したがって、あなたの例は実装の詳細を隠すわけではありません。クライアントが内部実装の詳細から絶縁されるように、設計上の決定をカプセル化しません。

3

データ抽象化は、データをカプセル化し、そのデータがどのように変更されるかを制御するメソッドを提供する、またはそのデータの意味を導出するためのヘルパメソッドを提供するオブジェクト指向言語の基本です。

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に存在する2つの項目を比較する方法を常に知っていないかもしれません。たとえば、以下のコードは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これを達成するための良いテクニックです。

+0

ありがとうございました。われわれは無意識のうちに抽象化を行っていますか? –

+0

私たちは意図的に抽象化を行い、良い設計には不可欠だと思います。 –

+0

申し訳ありませんが、懸念しています。私はfactorialを計算する関数を作成し、ユーザーはそれをfact(num)として呼び出します。それでは、それは抽象であると言うことができます。 –

0

「抽象化」の定義:イベントではなくアイデアを扱う品質。この回答difference between abstraction and encapsulation?を参照すると、私の理解では、私はそれがどのsingle dimension配列のソートに関連behaviorをカプセル化して、あなたのコード内でメソッドmy_sortが完全にEncapsulationを正当化することがわかった

。しかし、方法としてabstractionが欠けています。my_sortは処理するデータの種類を知っています。

paramsを介して入力されるデータの種類がわからない場合は、Abstractionとなります。つまり、FixnumまたはStringのリストであるかどうかにかかわらず、入ってくるオブジェクトはすべてソートされている必要があります。sortable datatypes

カプセル化

我々は通常clientsにさらされるべきであり、internallyを使用することをデータ/動作を区別するために、アクセス修飾子(publicprivate、..)を使用します。パブリックインターフェイス(クライアントに公開)は、可能な限り変更されることはありません。ただし、privateは変更可能な動作であり、いかなる場合でもclientsが依存するコードの予想される動作に影響を与えるべきではありません。
また、偶発的な変更/誤用を防ぐために、機密データ/動作をprivate/protectedに分離しています。これにより、クライアントは頻繁に変更される可能性のあるコード部分に依存しないようになります。

  • だから、1は常にcore logicprivateの範囲を分離する必要があります。

抽象

例:教会の場合 confessorfather/priestabstractionがあります。告白者は、priestの名前または詳細について何も考えてはいけません。逆もまた同様です。彼/彼女がコミットした大きなミスや犯罪があっても、誰でも告白することができます。

+1

素晴らしい! いいディスカバリーをしましたが、私の2番目の質問がありませんでした。 –