はじめに
会社のマネージャー技術力高くてすごく尊敬してるのだけど、年に50冊技術書読むらしい、、、!
— ゆうすけ@Railsエンジニア (@ysk_pro) 2018年7月13日
毎週1冊ペースや…!
早速、毎週 技術書1冊をブログでアウトプットするチャレンジ始めてみます!!!
モチベーション高くて時間もある今なら出来るはず…!
誰か一緒にやりませんか?笑
ということで、毎週 1冊技術書を読んでブログでアウトプットするチャレンジを始めました!
この記事はその第一弾です。
毎週読むにあたって心がける読み方のポイントはこちらです。
・何が書いてあったかを覚えるだけでいい → 辞書のように使う
・具体的なことよりも抽象的な考え方を身につける → 抽象的なことの方が汎用的
・できるだけたくさんの本を読んだ方がいい → 引き出しを増やす
・アウトプットをする → 考えながら読むようになる
詳細はこちらのブログに書いています。
「何が書いてあったか」「抽象的な考え方」を中心にアウトプットしていきます。
第一弾として読んだ本はこちらです。
Ruby on Railsの超有名な本です。
1章 Ruby on Railsの概要
<Railsの思想>
・CoC(Convention over Configuration)(設定より規約)
(メリット)
- 規約に従うことで設定ファイルを書く必要がなくなる
- 開発者毎の設定の差異が無くなり、他のエンジニアと共通のルールでコミュニケーションが取れる
・DRY(Don’t Repeat Yourself)
- 1つのことは1箇所だけに書く
・REST(Representational State Transfer)
- Webアプリケーションの設計概念の1つ
- 全てのリソースに一意となる識別子(URI)がある
- URIを通じてリソースを操作する手段を提供する
(メリット)
- リソースを中心に考えることで、機能追加のしやすい自然な設計になる
・自動テスト
- Railsでは自動テストを行う文化を重要視している
2章 Ruby on RailsとMVC
・Model:データベースとの接続とデータに対する操作、およびビジネスロジックを書く
・View:Modelの内容を参照し視覚表現を行う
・Controller:Modelのロジック呼び出し、必要なViewの選択など、ModelとViewをつなぐ
<モデル>
・ActiveRecordによるモデルには、大きく分けて2つの側面がある
- データベースと接続し、データベースのレコードのレコードとエンティティを結びつける役割
- ビジネスロジックの実装的な振る舞いに関するところ、すなわちバリデーションや、様々なコールバック(特定の処理に引っ掛けて別の処理を呼ぶこと)などを実行する役割で、ActiveRecordの内部で利用されているActiveModelというモジュールが担っている
・モデルにはScopeを定義できる
- Scopeとは、よく利用する検索結果に名前をつけてひとまとめにしたもの
(メリット)
- 繰り返し利用するクエリの再利用性が上がる
- クエリに名前をつけることで可読性が向上する
・ActiveRecord enumsは、プログラム上では定数のように扱えるが実態は数値で表されるもの
(メリット)
- 直接文字列として保存するより数値として保存した方がデータベース上の空間効率が良くなる
・アプリケーションの主要なロジックはなるべくモデルに書くべき
(メリット)
- コードが整理され、テストがしやすくなる
<コントローラ>
・コントローラが継承しているApplicationControllerは、アプリケーションのすべてのコントローラで共通するヘルパーや属性、挙動などを定義する場所
・Railsアプリケーションにおいては、基本的にコントローラが例外処理を担当する
<ビュー>
・variantsという機構で、接続してきた端末によって別々のテンプレートを表示させることができる(スマホ用のテンプレートなど)
・HTMLタグの付与などビューに特有の加工をする場合は、モデルに変換処理を書くより、ヘルパーを利用するやり方が一般的
3章 アセット
・Railsではデフォルトでいくつかのアセットパスが用意されている
- アプリケーションのメイン機能に関わるもの:app/assets
- 共通で利用するライブラリに関わるもの:lib/assets
- オープンソースのJavaScriptライブラリなどの外部から取得して利用するもの:vendor/assets
・アセッツプリコンパイルについての説明
・CoffeeScript、Sassについての説明
・Turbolinksは、JavaScriptやCSSに変化が無いのであればタイトルとbodyだけ差し替えることでJavaScriptやCSSの読み込みを省略することができ高速化できる、という思想のもとに成り立つ
(注意点)
- ページ遷移時のイベント発行を前提にしていたり、グローバルな変数にデータをを保持しているJavaScriptは、意図した通りに動作しなくなる場合があるので注意が必要
4章 Railsのロードバスとレイヤーの定義方法
・MVCに当てはまらないようなモジュールの主要な管理方法
- モデルとして扱う
- libディレクトリで管理する
- 新しいレイヤーを定義する
・Sidekiqは、バックグラウンドで継続する非同期処理を行う
- Sidekiqを使用するためにはRedisが必要になる
5章 開発を効率化するgem
・Pry:ステップ実行を行うことができる
・Hirb:コンソール上でモデルを表形式で出力できる
・Better errors:JavaScriptでの非同期処理などのエラー画面が表示されないようなケースで例外が発生した場合、「/_better_errors」 にアクセスすることで最後に発生した例外のBetter errorsのエラー画面を参照できる
・rails-erd:モデル情報からER図のPDFを出力できる
6章 Railsアプリケーション開発
・Twitterログインの実装
・ログイン状態を管理するヘルパーメソッド
・イベントのCRUD機能実装
・i18nの設定
・よく使うgem(kaminari、ransack、carrierwave)の使い方
7章 Railsアプリケーションのテスト
・テストを書く理由
- 仕様と設計を考える機会が増えることで、仕様の抜け漏れを減らし、きれいな設計になりやすい
- 手作業によるテストを減らせる
- ちゃんと動くかどうかの不安を減らせる
- リファクタリングや仕様変更に対応しやすい
・モデル、コントローラ、ビューのテスト、エンドツーエンドのテストの書き方
・TDDについて
(メリット)
- それぞれの段階で、設計すること、実装すること、リファクタリングすることだけに専念できるため、一度にきれいで動くコードを書こうとするのに比べて考えなければいけないことを減らすことができる
8章 Railsのインフラと運用
・サーバにデプロイするにあたって必要なミドルウェア
- ウェブサーバ:ブラウザからのリクエストを一番最初に受け取るサーバ(Nginx、Apache2)
- データベース
・Capistranoについて
9章 より実践的なモデルの使い方
・コールバックやバリデーションを別クラスに分離するメリット
- テストのための事前条件を満たすための負荷が減り、テストが容易になる
・ActiveModelモジュールを活用することで、自分で定義したプレーンなRubyクラスに対してActiveRecordに備わっている機能を組み込むことができる
・モデルとコントローラにデフォルトで存在するconcernディレクトリは、横断的関心事(複数のモデルや機能に跨って影響するもの)を実装する際に利用する
・サービスクラスはコントローラとモデルの中間のイメージで、処理そのものをカプセル化し責務を分離したもの
10章 Railsを拡張する
・gemを作ることができる方法としての、Rack Middlewareについての説明
おわりに
一週間で読むと決めると集中して読めるし、アウトプットすることで頭に残るのでいい感じです。
毎週頑張っていきますよー!
一緒にチャレンジしてくれる方募集中です〜(笑)