マッスル・メモリー

筋肉エンジニアのブログ

オブジェクト指向でなぜつくるのか?いや、、そもそもオブジェクト指向って?

オブジェクト指向でなぜつくるのか」という本についてのアウトプットをしていきます。

 

 

オブジェクト指向でなぜつくるのか 第2版

オブジェクト指向でなぜつくるのか 第2版

 

 

この本を読むと


オブジェクト指向とは、何者なのかがわかる。

オブジェクト指向でなぜつくるのかという問いに答えられるようになる。

 

プログラミング言語の進化の歴史


まず、オブジェクト指向とは一体何者なのか?

それを理解するために、この本ではまずプログラミング言語の進化の歴史について解説をしています。

 

f:id:takuma521:20190715210300j:plain

このように、プログラミング言語の進化の歴史は、今まで使っていたものの欠点を改善することで新しい言語が生み出されてきました。

 

最初は機械語で0と1の羅列だったのが、人間が読めるような英文っぽくなり、混乱しないように処理が行われる順番が確立、似たようなコードは1つにまとめるように進化しました。

 

そこで、たどり着いたのが構造化言語でしたが、大きな欠点がまだ2つありました。

 

グローバル変数の存在

・サブルーチンしか共通化できない。 

 

 なぜこれが欠点なのかというと、

まずグローバル変数はプログラムのどこからでも書き換えることができます。そうすると、変数に不正な値が入って直さないといけない場合にプログラム全体を見直す必要があります。もしプログラムが何千、何万行だとしたら骨の折れる作業ですよね。

 

 また、サブルーチンしか共通化できないということも、大規模なアプリケーションからするとまだまだ足りないものだったそうです。

 

 そこで、オブジェクト指向の登場です!!

f:id:takuma521:20190715210228j:plain

 簡単に説明すると、クラスでインスタンス変数という変数が生まれました。これはグローバル変数とローカル変数(サブルーチン内でしか使えない)のいいとこ取りです。

またそのクラスはサブルーチンとインスタンス変数をまとめることで、サブルーチンではできなかったロジックの共通化ができるようになりました!!

 

結果、フレームワークやライブラリなどの大規模な再利用が可能になりました。

いま私たちがrailsを触れるのもオブジェクト指向のおかげですね!

 

最初に戻りますが、じゃあオブジェクト指向

・一体何者なのか?

・なぜ使うのか?

について、本にも書かれていますが、自分なりにまとめます。

 

・一体何者なのか?

コードを整理整頓し、共通なところは1箇所にまとめ再利用しやすくし、制約をつけて事前に間違いを防ぐというプログラミングの考え方

 

・なぜ使うのか?

コードが見やすくまとまっていて、書き方のルールで事前に間違いを防いでくれることで、楽にプログラミングできるようになるから。

また、共通なコードが1箇所にまとまっていることで楽に修正を行えるから。

そして、作ったものを再利用できるので、プログラミングがまた楽になるから。

 

最後に

 

今日お話ししたのは、この本の一部ですが他にもプログラミングから派生した応用技術やオブジェクト指向の次の開発技術である関数型言語についても書かれていますので、ぜひ読んでみてください!(ちなみに私はまだ全部読んでません!笑)

 

ActiveRecordってなんぞ?

ActiveRecordとは

ActiveRecordとは、ウェブアプリケーションフレームワークであるRuby on railsO/Rマッピングを担うライブラリ。

https://magazine.rubyist.net/articles/0004/0004-RLR.html

 

 

で、そのO/Rマッピング(Object-relational mapping、オブジェクト関係マッピング)とはデータベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法のこと。

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E4%BF%82%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0

 

 

うんうん、なるほど。

簡単にいうと、ActiveRecordとは、DBとRuby(rails)の間でデータの変換を行ってくれる便利なライブラリって感じですかね!


ちなみに関係的にはこんな感じだそうです。
f:id:takuma521:20190707193046j:plain

汚なっ!

 

ActiveRecordのメリット

 

ActiveRecordを使うと、

 「どのDBに対してもRubyで直感的に記述することができる。」

そうです。

 

DBっていろいろ種類があります。
Oracle Database
MySQL
PostgreSQL
SQLite
Microsoft SQL Server
などなど、、、

 

しかし、どれも全く同じ書き方ではなく、微妙に違ったりします。
なので、文法を気にせず書けるっていうのは、大きなメリットですね。

 

あと、Rubyで直感的に書けます。例えば

User.where("age >= 25").delete_all

っていうのは、見たまんまでuserのageが25以上に合致するものを全件削除してくれます。
わかりやすいですね!

 

ActiveRecord のデメリット

 

ただ、ActiveRecordについて調べていくとデメリットも存在しました。
・複雑なデータベース設計とは相性が悪い
ActiveRecordから逸脱したことをやろうとすると面倒

 

まあ自分的にはこれらは今後、より難しいことをやる時に考えればいい話で、
まずはActiveRecordを使いこなせるようになってrailsのDB周りをできるようになりたいなと思いました。

 

命名ルール


Active Recordには、モデルとデータベースのテーブルとのマッピング作成時に従うべきルールがいくつかあります。

 

・データベースのテーブル - 複数形、語はアンダースコアで区切られる (例: book_clubs)

・モデルのクラス - 単数形、語頭を大文字にする (例: BookClub)

 

で、この命名ルールかなり厳格であり、例えば"Mouse"という単語、複数形にすると"mice"なのですが、このように書かないといけないらしいです。
単数形から複数形へ不規則な変換でも、探索してしまうなんてすごいですね。

 

ルールって厳しいと窮屈に感じられますが、rails初心者の自分からしたらむしろそれの通りにやればいいんだって寧ろありがたいです。

 

スキーマのルール


Active Recordでは、データベースのテーブルで使うカラム名についても利用目的に応じたルールがあります。

 

外部キーは、は"テーブル名の単数形_id"にする必要があります
例えば、1人のuserが複数のcommentを持つ時に、commentsテーブルにどのuserが持つcommentかを識別するキーとして、user_idを持ちます。

 

主キーは、デフォルトでidという名前のintegerカラムとして使われます。Active Recordマイグレーションでテーブルを作成すると、このカラムが自動的に作成されます。

 

他にも、いくつかルールがあります。
・created_at: レコード作成時に現在の日付時刻が自動的に設定されます。
・updated_at: レコード更新時に現在の日付時刻が自動的に設定されます。
・lock_version: モデルにoptimistic lockingを追加します。
・type: モデルでSingle Table Inheritanceを使う場合に指定します。
・関連付け名_type: ポリモーフィック関連付けの種類を保存します。

 

まとめ


ActiveRecordは、どのDBに対してもRubyで直感的に記述することができる便利なライブラリで、命名ルールやスキーマのルールが厳格に決められている。

 

うーん、ブログ書くって大変だなぁ笑

続けるためにももう少し適当にシンプルにやった方がいいかな笑

 

 

ブログはじめました💪💪💪

はじめまして、たくまです。 この度ブログを始めることにしました!!😆😆😆


始めた理由は、"学びをアウトプットすることによってより成長🏋️‍♀️していきたい!!"からです。

なぜアウトプットなのか🤔それはアウトプットが記憶を強固なものにしてくれるからです。

記憶するには、繰り返しインプットすることが必要ですが、それだけだと脳には似た情報が繰り返し入ってきた場合に、その情報を無視する現象があります。🐛
役に立たない情報を無視するためです。

そこでアウトプットをすることにより、インプットとは別の刺激(脳波が異なるそうです。)が入り、記憶をより定着させてくれるそうです。

難しい話をしてしまいましたが、要は、
インプット→アウトプット→インプット→アウトプットをしまくれば、学びが身について成長🏋️‍♀️するだろうってことです。


今まで、続けるのが苦手だった自分ですが、ブログを通じてアウトプットを習慣化していきたいと思います!!💪