こんにちは、ナイトレイインターン生の鈴木です。
Wantedlyをご覧の方に、ナイトレイのエンジニアがどのようなことをしているか知っていただきたく、Qiitaに公開している記事をストーリーに載せています。
少しでも私たちに興味をお持ちいただけた方は下に表示される募集記事もご覧ください↓↓
はじめに
株式会社ナイトレイの和田です。普段、自社サービスの開発に取り組んでいます。
現在私が関わっているLaravel製プロダクトに対する「コーディングガイドライン」をゼロから作成してみました。この記事ではそのガイドラインの内容の一部(かつバックエンドのみ)を公開してみたいと思います。
ちなみにLaravelの現versionは8.83.17です。
コーディングガイドラインの内容
前提事項
ガイドラインの目的
可読性や保守性を高め、開発効率を向上させる
ガイドラインの作成の背景
プロダクトのコード量が日に日に増えていくのに伴って、次第にコードの統一感が無くなり、複雑性も増し、その結果開発効率が下がってきていたため
作成・運用における目標
- 長期的な運用を実現させるために簡潔明瞭な規約とする
- 該当プロダクトにフィットする規約とする
- チーム内で相談し随時アップデートされる規約とする
マークの定義
🔴 必須
🟢 推奨
🔵 任意
🚫 禁止
DBアクセス
🔴 DBアクセスとドメインロジックは分離する
🔴 HTTPリクエストに対しレスポンスを返却する程度の処理はEloquentのみで実装する(クエリは Eloquentビルダ で生成)
🔵 大量データ処理などEloquentでは深刻なパフォーマンス問題が発生する場合は クエリビルダ を使って良い
ルーティング
🔴 次の場合を除き名前付きルートを設定する
- 同じURIが複数のリクエストメソッドを受け付ける(代表となる1つのみ必須)
- アプリケーションから直接参照されないURI(APIやコールバックURLなど)
- フォールバックルート
- リダイレクトルート
🔴 アプリケーション内でのURLの生成するはルート名を使う
🚫フォールバックルートを除きクロージャによるアクションの実装
ユニットテスト
下準備編
🔴 **Test¥Unit\
と App\
配下とで名前空間の階層名とフォルダ構成を揃える**
🔴 テスト対象となるクラス名にサフィックス Test
を付与したものをテストクラス名とする
🔴 テストメソッドの名前はTest{*テスト対象*}_{条件}_{*想定結果*}
とする
- テスト対象と想定結果は必ず記入
- 命名例
- ー条件がある場合
Test_CreateUser_AdminUser_OK
- ー条件がない場合
Test_CreateUser_OK
Test_CreateUser_ValidationError
実施編
🔴 パブリックメソッドのみテストする
- 数と変更頻度が少なく、テストとSUTが密結合になるのを防げる
- メッセージの戻り値に対するテストを一箇所に留めておくことができる(重複排除)
- このテストだけで全体の正しさについて証明できる
🔴 DBアクセス層はDBを、それ以外はテストダブル(Mockery)を利用してテストする
- テストダブルを利用する理由
- 依存先の結果に影響を受けずにテストができる
- テスト実行時間が短い
- DBアクセス層のテストにはDBを利用する理由
- ーテストダブルを利用すると莫大なコードが必要になる
- 時間が多量にかかる
- 可読性が悪い
- ーテストダブルを利用すると保守性に問題が生じる
- テスト対象コードが少しでも変更されれば修正が発生する、テストが壊れる
- ー本質的なテストが実施しにくい
参考
使い倒し系Laravelコーディング規約 / 小中規模案件を爆速で回す
laravel-best-practices/japanese.md
ユニットテストのガイドラインを作成しました / メルカリエンジニアリング
オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方 Kindle版 / amazon.co.jp
最後に
私たちの会社、ナイトレイでは一緒に自社開発のWebサービスを盛り上げてくれるエンジニアメンバーを募集しています!
基本的には直接ユーザーと接することのないポジションですが、セールス部門から
「顧客の声」を教えてもらったり、希望すればユーザーとのMTGに参加することも可能です。
モチベーションの高め方はあなた次第。
✔︎ 自社Webサービスの開発で事業の発展に携わってみたい
✔︎ 自分が開発したサービスで地域活性化に貢献したい
✔︎ 位置情報ビッグデータに興味があり、新しい活用方法を提案したい
✔︎ 地理や地図が好きで仕事中も眺めていたい
一つでも当てはまる方は是非お気軽に「話を聞きに行きたい」ボタンを押してください!