よ?し、今日は朝から日記書くぞぉ!(in会社)
昨日は仕事終わってから会社の人とミーティング・・・と称して焼肉屋へ。
今の現場の期限が3月いっぱいなのでこの先どうするのかちょっと話し合う。
僕個人的にはもう今の現場でやってくつもりは無いから
来月からは多分別のところで働くことになると思うね。
「やりたいことは何?」とか聞かれたけど、別にそういうのは無いんだよなぁ。
それよりも重要なのは「環境」。
ただ、仕事内容っていうのは入る前から大体のことはわかるんだけど
こればっかりは入ってみないとわかんない・・・
というか、人手が足りなくて困ってるところが「うちの環境は最悪です」
みたいなこと言うはず無いもんね。
やっぱ面接のときに自分で見抜いていくしかないのかも。
4月からは新入シーズンだっていうのに、
派遣なんか取ってる会社はロクなとこが無いんじゃないだろうか?
な?んていう不安も少しあったりして。
それにしても、会社で使ってるツールは遅くて腹が立つ(前にも言ってたな、こんなこと)。
全てAccessで作ってるからかも知れないけど
今日なんか編集しようとしてキーボード叩いた瞬間、約30秒処理が止まった(マジ)。
一体その30秒間にAccessは何をしてたのか知りたいね。
ほんともう、勘弁してくれ。
ではここで気を取り直して。Rubyよもやま話?(←またか)
Rubyは完全なるオブジェクト指向型言語だ。
「オブジェクト指向」ってよく聞く言葉だけど、じゃあ「オブジェクト指向って一体何だ?」
という質問をすれば実に様々な答えが返ってくるだろう。
世にオブジェクト指向を広めたのは紛れも無くC++だ(SmallTalkという説もあるが)。
が、「高級アセンブラ」とも言われるCをベースにしている以上
C++は純粋なオブジェクト指向言語ではない。
オブジェクト指向言語C++では、「抽象化」「隠蔽」といった技術がキーワードだと言った。
しかし、これらは単に大規模な作業をする上で便利にするために作られた副産物であり
オブジェクト指向という言葉とは直接関係のない事柄のように思う。
オブジェクト指向・・・実にわかりやすい言葉じゃないか。
オブジェクト、日本語で言えば「物」が中心の言語。ただそれだけだ。
過去の言語は、明らかに「物」が中心では無かった。
中心になっていたのは「処理」、つまりCでいうところの関数だ。
例えば、あるプログラムの中で「ボールを動かす」という処理をするとしよう。
Cで記述すれば、こんな感じになるだろう。
move(ball_1);
ここで「ball_1」とは一つのボールを表し、moveとはボールを動かす関数を表す。
では次に。同じプログラム内で「車を動かす」という処理を追加するとしよう。
move(car_1);
一見正しいように思える。しかし、これでは不完全なのだ。
よく見てみよう。ボールを動かすときも車を動かすときも同じ「move」という関数を使っている。
しかし実際には、ボールと車の動かし方は全く違う。
ボールならば手で押した程度で動くだろうが、車ではそうはいかない。
キーを差し込んでエンジンを動かし・・・といった一連の動作が必要になる。
つまり、先程の例はこう書かないといけなかったのだ。
move_ball(ball_1);
move_car(car_1);
このように、動かす物に応じた関数(move_ballとmove_car)を別々に用意する。
しかし、やや面倒だ。
他にも色々な物を動かしたい場合、それぞれに関数を用意しなければならないからだ。
一方オブジェクト指向言語、例えばRubyならこうなる。
ball_1.move
car_1.move
Cの例と似ている。しかし、両者には明らかな違いがある。
1行目のmoveと、2行目のmove。
これらは一見同じもののように見えるが、全く別のものを指している。
なぜか?それは、それぞれのmoveが別々のオブジェクト(ball_1とcar_1)に結び付けられているからだ。
つまりCでは「動かす→何を?→ボールを」という手順だったのに対し
Rubyでは「ボールを→どうする?→動かす」という手順を踏んでいるのだ。
両者の1番初めの手順を見比べてみよう。
Cでは「動かす」、Rubyでは「ボール」。
そう。前者は「処理」、後者は「物(オブジェクト)」だ。
オブジェクト指向とはつまり、こういうことである。
確かに、CではなくC++を使えばこの程度の記述は可能だ。
しかし、こんなのはまだ初歩。
「完全なるオブジェクト指向言語」Rubyが目指すものは、こんなものじゃない。
もう一つ例を挙げてみよう。
「100人の中から車を運転できる人を探し出し、その全ての人に車を与える」
・・・かなり強引な例ではあるが(笑)。まぁ例ということで許してくれ。
まずC++で記述してみよう。
ここで、100人のオブジェクトはboys[]という配列(HUMAN型)に格納されているものとする。
for (int i=0 ; i<sizeof(boys)/sizeof(HUMAN) ; i++) {
if (boys[i].isDriving()) {
boys[i].giveCar();
}
}こんな感じだ。
100人それぞれについて車が運転できるかどうかチェックし(isDriving関数)、
チェックが成功したらその人に車を与える(giveCar関数)。
では、これをRubyで書いてみよう。
boys.getDrivingArray.each {|boy| boy.giveCar }嘘みたいだが、たったこれだけだ。
boysに関連付けられたgetDrivingArrayメソッド(Cの関数と区別するために敢えてこう呼ぶことにする)
により、運転できる人の集合(これもオブジェクト)が与えられる。
この集合の各要素毎にgiveCarメソッドを適用する。
eachは集合を個々の要素に分割するメソッドだ(ここでは分割された各要素をboyとして扱っている)。
なぜこんな事が可能なのか?それはもちろん、Rubyが純粋なオブジェクト指向言語だからである。
C++では、配列boys[]に対して関数を定義することは出来ない。
配列個々の要素boys[i]はオブジェクトだが、配列boys[]はもはやオブジェクトでは無いからだ。
Rubyでは、boysという「配列そのもの」が「配列オブジェクト」として扱われる。
メソッドの戻り値も全て何らかのオブジェクトだ。
C++よりオブジェクト指向性が高く、今やC++からその地位を奪おうとしているJavaでさえ
数値などの極めて基本的なものは「プリミティブ型」といってオブジェクトではない。
つまり、100という「数」に対して「動け」などという(無茶ではあるが)命令は出すことが出来ない。
Rubyではそれすらも可能だ。
数値も、文字列も、そしてnil(CでいうNULL)ですら!全てオブジェクトである。
これこそが、Rubyが「真のオブジェクト指向言語」と呼ばれる所以なのだ。
う?む。相当熱く語ってしまったぜ(笑)。
これで俺もそのうち「Rubyist」の称号がもらえるかも・・・
そんなわけで。
今週も残りあと2日だ。頑張ろうっと。