Ruby on Rails で知っておくと便利な原則
オブジェクト指向を活用したプログラミング手法には、色々と研究が重ねられた結果、いくつかの原則が作られました。この原則を意識して開発すると、WEBアプリケーションを楽しく自由に作れるので紹介してみます。特にRuby on Rails を使ったアプリケーション開発をする際に、意識しておきたい原則をまとめてみました。
●CoC
CoCとはConvention over Configurationの略で、「設定より規約」という原則です。設定を大量に記述するのではなく、規約に則ってプログラミングすることで、余計な設定を省く事ができます。
例えば、生徒クラスを「Student」とすれば、生徒情報を格納するデータベースは複数形で小文字から始まる「students」にするという規約があります。このルールに従うことで
StudentクラスとstudentsテーブルのマッピングをRailsは自動的に行ってくれるので、開発者がクラスとテーブルを関連付ける設定を記述する必要が無くなります。
Railsが敷いてくれたレールの上をきちんと走ることで、開発者はビジネスロジックなどの本来やるべき部分の開発の注力することができるというわけです。
●DRY
DRYとはDon't Repeat Your Selfの略で、「同じことを繰り返さない」という考え方です。開発者はアプリケーションの中に何らかの「重複」があれば、また起きそうであれば察知する必要があります。
同じことを繰り返すとどのような事が起きるでしょうか?
・記述量が多く複雑になり、コードを読むのが難しくなる
・修正が発生した場合、修正箇所が多くなり大変&修正漏れがおこる可能性がある
アプリケーションのコードは、どれも将来的にバグになる可能性があります。重複してしまうと、アプリケーションのコードは不必要に大きくなり、バグが生じる可能性も高まります。また、システム構造は複雑になり、開発に携わる人間がシステム全体を完全に理解することも難しくなってしまいます。どこかに変更を加えた場合、それとロジック等が重複している箇所にも同様の変更が必要がどうか確認しなければなりません。DRY原則を守ればこのような事態を防ぐことができるのです!
DRY原則は、コードを重複しないということだけでなく、開発作業にも適用するべき原則です。アプリケーションの開発に関わる作業の多くは「同じ作業の繰り返し」です。例えば、テストは同じ作業の繰り返しになることが多く、手作業でやっていると手間も時間もかかり、また間違いも起きやすくなります。そのような繰り返し行う作業は、可能な限り自動化すべきなのです。
●YAGNI
YAGNIとはYou Aren't Gonna Need Itの略で、「機能は実際に必要となるまでは追加しないのがよい」という原則です。
必要かもしれないとあれこれ機能を追加するとどうなるでしょうか?
・機能が使われないまま放置される
・プログラムの規模が必要以上に大きくなる
・設計や構造が複雑になり保守や修正が難しくなる
・その結果、バグや不具合が起きやすくなる
今現在、具体的な必要性がないのに、将来必要になるかもしれない、あれば便利かもしれないなどといった見込みや思い込みで機能や要素を追加するべきではないのですね。後で使うだろうという予測の元に作った機能は、実際には10%程度しか使われないとも言われているそうですよ。
オブジェクト指向を取り入れる意味
「Rubyはオブジェクト指向のプログラミング言語です」
この意味は大体分かってきました。
でも、「Rubyは〜」と言っているということはオブジェクト指向じゃない言語もあるわけですよね。
ということで、今回はオブジェクト指向を取り入れる意味について考えてみます。
●オブジェクト指向は何のためにあるのか?
実は、オブジェクト指向を全く取り入れずにアプリケーションを作ることもできます。皆さんは、アプリケーションを触っていて「あ〜これはオブジェクト指向で作られてるなぁ〜最高だなぁ〜」とか感じたことありますか?ないですよね?笑
いや、エンジニアの人は感じるのでしょうか。とりあえず、感じないという前提で話しますね。
アプリケーションがオブジェクト指向で作られたかどうかはユーザーには分からないですし、オブジェクト指向で作ったからといってユーザーが得られるサービスが変わるわけでもありません。
なぜなら、オブジェクト指向はユーザーの為の知識ではなく、開発者同士の円滑なコミュニケーションのためにある指向なんです!
●オブジェクト指向のメリット
オブジェクト指向でコードを書く理由は、ずばり、、、
変更に対して柔軟に対応するため!です。
プログラムは、日々更新しないと時間と共に枯れていきます。
いいサービスを提供し続ける為には、メンテナンスが必要なのです。
オブジェクト指向によるアプリケーション開発は、頻繁に変更されるであろう箇所をクラスに取り出しておくことができます。
そうすることで、システムが変更に対して柔軟に対応できるようになるのです。
これがオブジェクト指向を取り入れる最大のメリットと言えます。
●まとめ
アプリケーションを開発する際には、「このサービスには、今後このような仕様変更の可能性がある」と予測を立てて、変更に強いアプリケーションを設計することが大切です。その手助けとなってくれるのが、オブジェクト指向だと覚えておきましょう。
●独り言コラム
この「可能性を予測する」ということを意識すると、どこまで予測するべきか悩む事になるかもしれません。例えば、頻発に変更されると予想した箇所をクラスに取り出して、使うかもしれないメソッドを定義したのに、結局そのような仕様変更が発生しなかった!意味無かったじゃん!ということが起きそうな気がします。かもしれないかもしれないかもしれないを考えすぎて、無駄なコードが増えてしまいそうですよね。きっとそれを良いバランスで予測できるエンジニアが、いいエンジニアなのでしょうか。そうなれるように、がんばりましょう。
「オブジェクト指向」に悩んでたことが嘘みたいになる記事
●結論
オブジェクト指向とは「現実世界を正しく捉えること」です。
えっ?
そして、現実世界を正しく捉えながら、複数のオブジェクトを組み合わせてプログラムを構築するという考え方です。
えっ?
では、まずそもそもオブジェクトって何よ?という所から考えていきたいと思います。
●オブジェクトとは?
直訳すると物体です。今、目の前にはどんな物がありますか?私の目の前には冷蔵庫がありましたので、これを例に考えたいと思います。
まず、私の家の冷蔵庫について思い付いたことを書き出してみます。
・色はシルバー
・扉は両開きタイプ
・2016年製
・プラズマクラスター付き
・食べ物を冷やすことができる
・飲み物も冷やすことができる
・大抵の物はなんでも冷やせる
・氷も作れる
・冷凍することができる
・野菜を新鮮に保てる機能付き
などが思い付きました。
オブジェクトとは、データの集まりとも言えます。
ただ漠然とした集まりではなく、ひとつのテーマを持った集まりです。
ここに書き出したものは、「冷蔵庫」という1つのテーマを持ったデータの集まりですよね。
このデータを書き出せれば、オブジェクト指向が分かったようなものです!
皆さんも目の前にある物について説明できたら次に進んでくださいね。
●クラス
クラスとは簡単に言うとオブジェクトをコードで書いたものです。
class 冷蔵庫 {
}
これで冷蔵庫というオブジェクトのクラスができました。OK?
はい、次。
●プロパティ
オブジェクトはプロパティ(属性)を持ちます。簡単に言うと、オブジェクトを説明するデータのことです。このプロパティはクラスの中で定義します。
冷蔵庫の例で書いてみますね。
class 冷蔵庫 { 色 = シルバー; 扉 = 両開き; 製造年 = 2017年; }
こんな感じになりました。OK?
はい、次。
●メソッド
オブジェクトはメソッドを持ちます。メソッドというのは、オブジェクトの動きを説明するもので、もーっと簡単に言うとオブジェクトが使える技みたいなことです。これもクラスに書き込んでみますね。
class 冷蔵庫 { 色 = シルバー; 扉 = 両開き; 製造年 = 2017年; 冷やす(食べ物) { //ここで食べ物を冷やします } 凍らせる(食べ物) { //ここで食べ物を凍らせます } }
こんな感じに書いてあげることができます。OK?
はい、次。
●メッセージ
オブジェクト同士はメッセージを送り合えます。例えば、冷蔵庫classの中に書いた「冷やす」とか「凍らせる」とかいうメソッドを他のオブジェクトに送ることができるのです。メッセージを送るには、「オブジェクト名.メソッド名」と書くだけです。
それでは、「冷蔵庫というオブジェクトを使って人間がジュースを冷やす」というプログラムをコードにしてみます。
class 冷蔵庫 { 色 = シルバー; 冷やす(飲み物) { //ここで飲み物を冷やします } } class 人間 { 名前 = marikotokyo; 冷蔵庫で飲み物を冷やす(飲み物) { 冷蔵庫.冷やす(飲み物) } } main() { 飲み物 = オレンジジュース; 人間.冷蔵庫で飲み物を冷やす(飲み物) }
こんな感じになりました。
●まとめ
ここでオブジェクト指向とは?の結論「現実世界を正しく捉える」に話を戻してみましょう。
現実世界を正しく捉えていないと、非現実的なコードを書いてしまうことになります。
例えば、人間が氷を凍らせていたり、冷蔵庫が勝手に飲み物を冷やし出したりしています。
これって現実世界で起きていますか?ありえないことですよね。
氷を凍らせることができるのは人間ではなく冷凍庫ですし、人間が飲み物を冷やそうとして初めて冷蔵庫は飲み物を冷やすことができます。
これが現実です。そうです、現実を見てください!笑
オブジェクト指向では、このように常に現実を見ることが大切なのです!!
「現実世界を正しく捉える」という意味、お分かり頂けたでしょうか?
私も理解するまでに時間がかかりましたが、とにかく目に入った物をオブジェクトとして捉え、プロパティやメソッドを考える癖ができると、オブジェクト指向の言語を学習する時に役立つと思います。
●独り言コラム
頭の中がオブジェクト指向になれば、ついつい現実逃避をする自分にもGood-byeできる日がくるのでしょうか...!
現実を見ろよっていう響き、つらいわ(笑)
Ruby on Rails?
プログラミングスクールでは、Ruby on Railsを使ったWEBアプリケーション開発を勉強しています。
Ruby on Rails(略してRails)とは一体何なのかというと、
Rubyというプログラミング言語を使ったWebアプリケーション開発のためのフレームワークのことです。
このフレームワークは何をしてくれるのかというと、Webアプリケーションを簡単に楽しく作れて、「こういうアプリを作ろう!」と閃いたらすぐに作り始めることを手助けしてくれます。
例えば、ターミナルで
$ rails new 作りたいアプリケーション名
と、たった1つのコマンドを打つだけで、Webアプリケーションを作るために必要なファイルやフォルダを用意してくれるのです!!
Webアプリケーションというのは、プログラムが書かれたファイルの集合体とイメージして良いと思います。Railsで作成するアプリケーションは、多数のファイルで構成されていますが、1つのファイルだけでプログラムが動くのではなく、複数のファイル同士がいい感じに連携して1つのアプリケーションとして動く仕組みになっています。
祝!ブログ開設しました
はじめまして!marikotokyoと申します。
「そうだ、プログラミングを学ぼう」と思い立ち、2018年の11月からスクールに通い始めた新参者です。どうぞよろしくお願い致します。
まずは初回なので、どうしてプログラミングを学ぼうと思ったのかという真面目なことを書いておきたいと思います。
私は、日常生活の中で「こういうサービスがあったら絶対買うのになぁ。こういう事が出来たら世の中の役にも立つし、面白そう!」とアイディアだけはどんどん浮かんでくるタイプなのですが、それを形にできない女なんです(笑)
そのもどかしさを多分10年間くらい感じていました。だいぶ長いこと感じるだけで終わっていたのですが、遂に決意したんです。自分が欲しいものは自分で作る。
これは、最近の人生のテーマ「自分を幸せにするのは自分」にも繋がる所がありまして、人任せにしないで自分から行動を起こそうと思ったのです。そこで、WEBサービスを作りたいなら、プログラミングができなきゃお話にならないよねということで勉強することを決意しました。
このブログでは、主に学習したことをアウトプットしていきます。なぜなら、アウトプットするという事は、最も効率よくスキルアップする手段の一つなんだそうです!
1番効率が良い方法は、「自分が学んだことを人に教える事」なのですが、まずはこのブログでは自分が理解したことを説明するために情報を整理して、その過程で理解を深めたり、分からないことを調べたりして力をつけていきたいと思っています。
1年後くらいに振り返った時に「自分、成長したな」と思いたいので、その記録としても使っていこうと思います。
それでは、これからよろしくお願いします。