ログイン
編集不可のページディスカッション情報添付ファイル
"alstamber/2013FreshManRubySeminar2"の差分

MMA
9と10のリビジョン間の差分
2013-04-24 17:58:23時点のリビジョン9
サイズ: 10760
編集者: alstamber
コメント:
2013-04-25 14:51:14時点のリビジョン10
サイズ: 12643
編集者: alstamber
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 221: 行 221:
すでに気づいている人も多いとは思いますが、オブジェクトには幾らかの種類があります。<<BR>>
整数であったり、文字列であったり、配列であったりです。<<BR>>

オブジェクトの種類の違いはオブジェクトに属しているメソッドの違いにも現れています。<<BR>>
たとえば整数のオブジェクトはreverseメソッドを持ちません。<<BR>>
文字列のオブジェクトはtimesメソッドを持ちません。

このように呼び出せるオブジェクトに違いがあるので、Rubyの仕様側で陽にオブジェクトの種類の違いを区別できるような仕組みが必要になります。

この仕組の一つとしてクラスというものが存在します。Rubyではオブジェクトの種類ごとにクラスと呼ばれるものを1つ用意しています。<<BR>>
クラスにはそのオブジェクトが持っているデータやメソッドが定義されています。

例えば
{{{#!highlight ruby
"Love Live!"
}}}
はStringクラスのオブジェクトである、といいます。Stringは文字列という意味です。

また
{{{#!highlight ruby
0
1
-99
934387
}}}
などはFixNumクラスのオブジェクトである、といいます。FixNumはFix Numberの略です。Fixの意味についてはコンピュータの詳しい仕組みを知っていないと理解できないので省略しますが、<<BR>>
要するに整数を表しているということです。

{{{#!highlight ruby
["hoge", "fuga"]
}}}
はArrayクラスのオブジェクトです。Arrayは配列という意味です。

つまり
{{{#!highlight ruby
["Love", "Live!"].reverse
}}}
というふうにかけるのは、Arrayクラスにreverseメソッドが定義されているからだといえます。

なにこれ

読みやすいプログラムを書こう

スペースを有効活用

演算子や代入のイコールの前後などにはスペースをあけるようにしましょう。

   1 str="Love Live!"
   2 str2="Tachibana Arisu"
   3 arr=["hoge","fuga","piyo"]

   1 str = "Love Live!"
   2 str2 = "Tachibana Arisu"
   3 arr = ["hoge", "fuga", "piyo"]

名前が8割

この講習会で書いているような小さなプログラムであれば変数の名前は適当でも別に困りませんが、大きなプログラムを書くようになると
変数がどのようなデータと紐付けられているのか、名前を見るだけでわかるようにしておくとはかどります。

   1 a = 1011203

   1 student_number = 1011203 #=>学籍番号だということが一発でわかる

単語の区切りをアンダーバーで表す方法をスネークケース、単語の区切りを単語の頭を大文字にすることで表す方法をキャメルケースと言います。

   1 student_number = 1011203
   2 studentNumber = 1011203

キャメルケースやスネークケースで長々と単語をつなげるとやはり読みにくくなるので、できるだけ短い文字数で的確に変数の性質を説明できるような名前をつけられるようにしたいものです。

インデント

行の頭をある一定の文字数分下げることをインデントと呼びます。

   1 if str == str2
   2     puts str #=>インデントされている
   3 end

インデントのないプログラムは一般に読みにくくなることが多いです。

   1 if str == str2
   2 puts str
   3 puts str2
   4 f(str)
   5 g(str)
   6 end

インデントは普通4文字分することが多いようです。メジャーなエディタならスペースを律儀に押さなくてもTabキーを押せば最適なインデントをしてくれます。

なんでもオブジェクト

オブジェクト指向

今回はRubyの考え方の根幹をなしている「オブジェクト」と呼ばれるものの話が中心となります。
Rubyはオブジェクト指向言語と呼ばれる言語の一種です。字の通り、オブジェクトというものを中心に考えたプログラミングの考え方を取り入れた言語です。
オブジェクト指向は現代のプログラミングの考え方の主流の一つとなっている考え方なので、この際その考え方に触れておくことにしましょう。

オブジェクト指向はRubyだけではなくJavaやC++といった現在主流となっている言語に採用されている考え方です。

オブジェクトって何

オブジェクトというのはデータとそれに関連する処理をひとまとめにした概念といえます。
と言われてもわかりにくいと思うので、実際の例で考えてみることにしましょう。

文字列を考えます。Rubyでは文字列は次のように書きますね。

   1 "Love Live!"

プログラムはデータに対して加工や処理を行なっていくことの繰り返しだということを第1回で述べました。
なのでデータに対してよく行われるであろう処理や加工をデータそのものに紐付けておくと何かと便利なのではないかという気がします。
データとそれに関連する手続きをバラバラにもっておくのではなく、一体のものとして扱う。これがオブジェクト指向の考え方の1つの基本です。

たとえば文字列に対して行う処理として文字列の長さを求めるというものが考えられます。オブジェクト指向ではない言語とRubyを比較してオブジェクト指向的な
考え方というのはどういうものなのかをみていきましょう。

オブジェクト指向ではない言語の例としてCを挙げることにします。Cで文字列の長さを求めるにはstrlenというものを使います。

   1 char[] a = "Love Live!";
   2 
   3 strlen(a); //strlenという処理はaという文字列に属しているわけではなく、独立して存在している
   4 

対してRubyの例です。Rubyで文字列の長さを求めるにはlengthメソッドを使います。

   1 a = "Love Live!"
   2 a.length #aという文字列に関連付けられているlengthメソッドを使っているという雰囲気

データと処理を一体として扱うメリット

文字列の長さのような例だとあまりこのような手法のメリットは感じられないかもしれません。
巨大なプログラムにおいてこの手法は威力を発揮します。

Cのような非オブジェクト指向言語ではデータと処理が別のものとして扱われるため、すべてのデータと処理が一緒くたになってプログラムに記述されることになります。
これはプログラムが読みにくくなり、開発しにくくなるという結果を招きやすくなります。

オブジェクト指向を取り入れると、あるデータとそれに紐付けられた処理を一つの塊として切り出すことができるので、プログラムをその塊の組み合わせとして記述しやすくなります。
つまり大きなプログラムでもひとつの大きな塊ではなく、もう少し小さな単位の集合として作ることができ、プログラムが書きやすくなるというわけです。

文字列はオブジェクト

もう一度先の例に戻ってみてみましょう。

   1 a = "Love Live!"
   2 a.length

この例でaは"Love Live!"という文字列であり、かつlengthという文字列の長さを求める手続きも持っている存在であるということができます。
つまりRubyでは文字列は文字列そのもののデータとそれに関連する手続きをもったオブジェクトです。

文字列オブジェクトは何もlengthメソッドしか持っていないわけではありません。例えばreverseというメソッドがあります。

   1 "Love Live!".reverse #=> "!eviL evoL"になる

どんなメソッドがあるのかはググれば色々出てくると思います。

配列もオブジェクト

Rubyではなにも文字列だけがオブジェクトとして扱われているわけではありません。配列も立派なオブジェクトです。例えば配列オブジェクトにはlengthというメソッドがあります。

   1 ["Kyoko", "Toshino"].length #=> 2になる

reverseメソッドもあります。

   1 ["Kyoko", "Toshino"].reverse #=> ["Toshino", "Kyoko"]になる

Rubyでは全てがオブジェクト

Rubyは文字列や配列にかぎらずすべてのデータあるいはデータ構造がオブジェクトとして扱われます。
(一方例えばJavaではオブジェクトととして扱われないデータが存在します)

例えば整数もオブジェクトです。timesメソッドを思い出してみましょう。

   1 5.times do ......

見て分かる通り、timesメソッドは整数オブジェクトに属するメソッドなわけです。

オブジェクトとメソッド

メソッドの呼び出し方

もうわかっている人も多いと思いますが、オブジェクトに属しているメソッドを呼び出すには次のように表記します。

   1 (オブジェクト).(メソッド名)

例えば

   1 "hoge".length

   1 a = ["love", "live"]
   2 a.sort

などです。

「.」は「+」や「-」よりも強い結びつきの力を持っています。なので例えば

   1 n-1.times

などと書くと、nから1.timesの結果を引いたもの、というふうに解釈されます。これを防いで、n-1という数値オブジェクトにtimesメソッドを適用するには

   1 (n - 1).times

と書きます。

引数と返り値

putsメソッドを思い出してみましょう。putsメソッドは与えられた文字列を画面に出力するというメソッドでした。

   1 puts "Love Live!"

メソッドに与えられるデータのことを引数(ひきすう)といいます。与えられる引数の種類(文字列か数値かなど)とその数はメソッドごとに決まっています。
たとえばlengthメソッドは引数の個数が0個です。

メソッドを呼び出したあとの実行結果のことを戻り値または返り値といいます。lengthメソッドの戻り値は文字列の長さになります。

引数が複数あるようなメソッドについて文字列オブジェクトに属しているinsertメソッドを例に見ていくことにしましょう。 insertメソッドは整数と文字列の値をとって、引数の文字列を引数の整数番目の直前に挿入するというメソッドです。

   1 a = "Live!"
   2 puts a.insert(0, "Love ")

考えてみよう

  • putsメソッドの引数はなんですか?
  • insertメソッドの引数はなんですか?
  • insertメソッドの戻り値はなんですか?
  • 次のプログラムは実行できるでしょうか?

   1 a = "Live!"
   2 puts a.insert("Love ", 0)
  • 次のプログラムは実行できるでしょうか?

   1 b = 1
   2 puts b.insert(0, "Love ")
  • 次のプログラムは実行できるでしょうか?

   1 c = ["live"]
   2 puts c.insert(0, "love")
  • (上級)putsメソッドの戻り値はなんですか?

オブジェクトの種類

すでに気づいている人も多いとは思いますが、オブジェクトには幾らかの種類があります。
整数であったり、文字列であったり、配列であったりです。

オブジェクトの種類の違いはオブジェクトに属しているメソッドの違いにも現れています。
たとえば整数のオブジェクトはreverseメソッドを持ちません。
文字列のオブジェクトはtimesメソッドを持ちません。

このように呼び出せるオブジェクトに違いがあるので、Rubyの仕様側で陽にオブジェクトの種類の違いを区別できるような仕組みが必要になります。

この仕組の一つとしてクラスというものが存在します。Rubyではオブジェクトの種類ごとにクラスと呼ばれるものを1つ用意しています。
クラスにはそのオブジェクトが持っているデータやメソッドが定義されています。

例えば

   1 "Love Live!"

はStringクラスのオブジェクトである、といいます。Stringは文字列という意味です。

また

   1 0
   2 1
   3 -99
   4 934387

などはFixNumクラスのオブジェクトである、といいます。FixNumはFix Numberの略です。Fixの意味についてはコンピュータの詳しい仕組みを知っていないと理解できないので省略しますが、
要するに整数を表しているということです。

   1 ["hoge", "fuga"]

はArrayクラスのオブジェクトです。Arrayは配列という意味です。

つまり

   1 ["Love", "Live!"].reverse

というふうにかけるのは、Arrayクラスにreverseメソッドが定義されているからだといえます。

特定のオブジェクトに属さないメソッド

クラス

  • これは多分時間がないのでやらない。

alstamber/2013FreshManRubySeminar2 (最終更新日時 2013-07-04 23:39:28 更新者 alstamber)