Chapter 03無料公開

✅命名規則をコード化する

たった
たった
2021.06.25に更新
バックエンド
be
├── src
├── tests
├── migrations   ... マイグレーションファイル(自動生成)
├── schema       ... GraphQLスキーマ(自動生成)
├── eslintrc.js  ... コーディングルール
> ├── ormconfig.js ... DBの接続設定
> └── TypeOrmNamingStrategy.js ... 命名規則

使用するライブラリ

  • TypeORM

概要

Ruby on Railsの設計理念でいうところのCoCですね。
命名規則は開発を始める時に決めます。でも時間が経って忘れられたり、新しく参画したメンバーに伝わらなかったり、といった事態を経験をされた方も少なくないはずです。

人為的ミスを少なくし、本来解決したい問題に集中するために命名規則はコードで表現したいです。

以下で例を挙げて紹介します。

命名規則の例

エンティティ

TypeScript Deep Dive の変数命名規則に従います。

  • エンティティ名
    • パスカルケースの単数形, ファイル名も同じ名前
    • ex) User, UserImage
  • プロパティ名
    • ロワーキャメルケース
    • ex) name, userId

データベース

Ruby on Rails の命名規則に従います。

  • テーブル名
    • ドメインオブジェクト名のスネークケースの複数形
    • ex) users, user_images
  • カラム名
    • ドメインオブジェクトのプロパティ名のスネークケース
    • ex) name, user_id

実装

命名規則をコードで表現します。

be/TypeOrmNamingStrategy.js
const DefaultNamingStrategy = require('typeorm').DefaultNamingStrategy
const snakeCase = require('typeorm/util/StringUtils').snakeCase
const pluralize = require('pluralize')

module.exports = class TypeOrmNamingStrategy extends DefaultNamingStrategy {
  tableName(className, customName) {
    return customName || pluralize(snakeCase(className))
  }

  columnName(propertyName, customName, embeddedPrefixes) {
    return (
      snakeCase(embeddedPrefixes.join('_')) +
      (customName || snakeCase(propertyName))
    )
  }

  relationName(propertyName) {
    return snakeCase(propertyName)
  }
  
  /* 以下同様にオーバーライドします */
}

接続設定に、命名規則を適用します。

be/ormconfig.js
const TypeOrmNamingStrategy = require('./TypeOrmNamingStrategy.js')

module.exports = [
  {
    /* 略 */
+    namingStrategy: new TypeOrmNamingStrategy(), // 命名規則を反映する
    /* 略 */    
  },
]

これでEntityを定義するだけで、規則に従ったテーブル名、カラム名などが設定できるようになりました!

コラム: GraphQL Schemaの命名規則をコード化したい

Shopify API の命名規則に従うのがおすすめです。
ShopifyのGraphQLは非常に洗練されたスキーマだと思います。また設計のチュートリアルも参考になるので、ぜひ一度目を通してみてください。

  • Field
    • ロワーキャメルケース
    • ex) customers, cratedAt
  • Variable
    • ロワーキャメルケース
    • ex) $firstName, $lastName
  • Type
    • パスカルケース
    • ex) CustomerInput
  • Query, Mutation
    • ロワーキャメルケース
    • 名詞が先、動詞が後。
    • ex) user, userCreate, userUpdate

なおGraphQL Schemaの命名をコード化する手段は、まだ知らないのでご存知の方がいれば、ぜひ教えてください!