メソッドのアクセス制御
メソッドのアクセス制御を行う理由は、公開するオブジェクトを限定しカプセル化を堅牢にするため。アクセス制御することで以下の効果がある。
- 公開するメソッドを複数のメソッドから構成した時、呼び出し側が知らなくても呼び出し手順やオブジェクトの事前準備を行える
- 実装の細かい変化が呼び出し側に波及しないようにする
- 外部に公開する意図がないメソッドをprivateメソッド以降に記述する
外部からの呼び出しを受ける少数のpublicアクセスメソッド、その下請け処理をするprivateアクセスメソッドから成り立つ。protectedアクセスメソッドは例外的な利用方法しか使わない。
Rubyではアクセス可能性をインスタンス単位で考えます。C#やJavaと言った他のプログラミング言語が採用するクラス単位のアクセス可能性とは異なる。
論理回路メモ
- or回路
全ての入力が0なら0、それ以外は1
- And回路
全ての入力が1なら1、それ以外は0
- Xor回路
入力の1の数が奇数なら1、それ以外0
基底クラスを指定しない場合Objectクラスを指定する
継承する時は、"class 派生クラス < 基底クラス"と書いてきた。
が、基底クラスを指定しない場合でも継承が行なわれている。指定しなかった場合はObjectクラスが指定されている。イメージは
class Book (< Object) def initialize(author, title, genre) @author = author @title = title @genre = genre end def to_s() "著者:#{@author}, 題名:#{@title}, 分野:#{@genre}" end end
オブジェクトの見直し。
クラスを書くことが、とっっっても難しいです。
自分の場合、何故書けないのか分析してみた。
オブジェクトがどんなものかにこだわり過ぎて、オブジェクトの使い方がわかりませんでした。言いかえると、コードで書いた時に、オブジェクトとメソッドの書き方を解ってなかった。
find_student(students, name)
↑は今まで書いていた手続き型の書き方。複数のstudentの集合であるstudentsの中からnameと同じ名前を持ったstudentを見つけてくる。
students.find(name)
↑オブジェクト指向の書き方。動きは上記のfind_studentと同じ。違う点はデータがどういう処理をしたらいいか知っていること。ここではレシーバであるstudentsというデータが、findを指定するだけで処理を実行してくれる。
RubyのtrueとTRUE
a = TRUE
意識せずに大文字でTRUEと書いてました。人に言われて気づいたのですが、これは非推奨だから使わないほうがいい。リファレンス調べると「この定数(Kernel::TRUE)は過去との互換性のために提供されています。」とあるので、動くことは動くので要注意。
umaskについて
umaskを教えていただいたので、メモ
| user | group | othre | | rwx | rwx | rwx | | 111 | 111 | 111 | | 7 | 7 | 7 |(dirのデフォルト) | 6 | 6 | 6 |(fileのデフォルト)
umaskを設定するとデフォルトから、指定した権限を抜くことになる。
umask 002 | user | group | othre | | rwx | rwx | rwx | | 111 | 111 | 101 |(dir) | 7 | 7 | 5 | | 111 | 111 | 100 |(file) | 6 | 6 | 4 |
ポリモーフィズム
1 # encoding:cp932$ 2 $ 3 ["文字列", 1234567, Dir.open("."), :symbol, [1, 2, 3, 4, 5], {"1" => 1, "2" => 2}].each() do |e|$ 4 puts("#{e}")$ 5 puts(e.to_s())$ 6 end$
4行目の#{}と5行目のto_s()を比較する。
to_s()はObjectクラスで定義されていて、オブジェクトを文字列にして返す。
#{}は与えられたオブジェクトのto_s()メソッドを呼び出して、戻り値を文字列の中に展開している。
つまり、to_s()と#{}のやっている処理は同じ。
同じメソッドで呼び出したとき、オブジェクトに応じた処理が実行される。これをポリモーフィズムという。