プログラミング入門(6)〜アクセス制御

下記のページを参考にプログラミングの勉強を行います。
アクセス制御とは - アクセス制御 - Ruby入門
アクセス制御をまとめて設定する - アクセス制御 - Ruby入門

アクセス制御とは


アクセス制御とは


クラス内に定義されたメソッドは、クラスから作成されたオブジェクトから実行することが可能となっている。しかし、場合によってはクラス内の他のメソッドから実行されるだけのメソッドを定義する場合もある。

クラス内からしか実行されないメソッドはオブジェクトから実行できるようになっていると予想外の結果となることがあるので、オブジェクトから実行できないようにアクセスを制限することが可能。

メソッドのアクセスを制御するにはメソッドのアクセス制御レベルをメソッド毎に設定する。オブジェクトからインスタンスメソッドとして実行可能なメソッドは「public」、クラス内の他のメソッドからのみ実行可能なメソッドは「private」を指定する。

アクセス制御の設定方法

class Car
  def accele
    print("アクセルを踏みました\n")
  end

  def brake
    print("ブレーキを踏みました\n")
  end
end

「Car」クラス内で定義された「accele」メソッドと「brake」メソッドはどちらも「Car」クラスのオブジェクトから実行可能としたいので「public」を指定する。
上記プログラムのように特に指定しない場合は「public」に設定されているが、明示的にしていしてみる。

class Car
  def accele
    print("アクセルを踏みました\n")
  end

  public :accele

  def brake
    print("ブレーキを踏みました\n")
  end

  public :brake
end

car = Car.new
car.accele

f:id:ayaketan:20111213135555j:image

メソッドを「public」に明示的に指定するには「public:メソッド名」と記載する。ここで指定したメソッドはアクセス制御が「public」に指定される。

次に「private」なメソッドを作成してみる。

class Car
  def accele(acceletime=1)
    print("アクセルを踏みました\n")
    print("スピードは", calcSpeed(acceletime),"Kmです\n")
  end

  public :accele

  def brake
    print("ブレーキを踏みました\n")
  end

  public :brake

  def calcSpeed(acceletime)
    return acceletime * 10
  end
  
  private :calcSpeed
end


car = Car.new
car.accele(10)

f:id:ayaketan:20111213135615j:image

「calcSpeed」はアクセルを踏んだ秒数に応じて速度を計算するメソッド。このメソッドはクラス内の「accele」メソッドからしか呼び出されない。このようなメソッドは「private」を指定する。

メソッドを「private」に指定するには「private:メソッド名」と記載する。ここで指定したメソッドはアクセス制御が「private」に指定される。

「private」に設定されたメソッドに対して、クラスのオブジェクトから直接実行を行うとエラーとなる。

class Car
  def accele(acceletime=1)
    print("アクセルを踏みました\n")
    print("スピードは", calcSpeed(acceletime),"Kmです\n")
  end

  public :accele

  def brake
    print("ブレーキを踏みました\n")
  end

  public :brake

  def calcSpeed(acceletime)
    return acceletime * 10
  end
  
  private :calcSpeed
end


car = Car.new
car.accele(10)
car.calcSpeed(10)

f:id:ayaketan:20111213135634j:image

上記のように「private」に指定されたメソッドに対して「car.calcSpeed(10)」のような処理は行えない。

initializeメソッドの扱い


通常のメソッドは特に指定しない場合は「public」となるが、「initialize」メソッドだけは常に「private」メソッドとして定義される。したがって「initialize」メソッドをクラスのオブジェクトから実行することはできない。

アクセス制御をまとめて設定する


アクセス制御をまとめて設定する


アクセス制御を設定するには「public:メソッド名」または「private:メソッド名」で個々のメソッド毎に設定していたが、多くのメソッドを定義する場合はまとめてアクセス制御を設定することが可能。

プログラム内に「public」とだけ記述すると、それ以降に定義されたメソッドはすべて「public」なメソッドとなり、同様に「private」とだけ記述すると、それ以降に定義されたメソッドはすべて「private」なメソッドとなる。

class Car
  public

  def accele(acceletime=1)
    print("アクセルを踏みました\n")
    print("スピードは", calcSpeed(acceletime),"Kmです\n")
  end

  def brake
    print("ブレーキを踏みました\n")
  end

  private

  def calcSpeed(acceletime)
    return acceletime * 10
  end
end


car = Car.new
car.accele(10)

f:id:ayaketan:20111213135657j:image

上記の例では「public」の後に「accele」メソッドと「brake」メソッドが定義されており、この2つのメソッドは「public」なメソッドとなる。また、その後で「private」が記述されておりその後に定義されている「calcSpeed」メソッドは「private」なメソッドとなる。