それって車輪の再発明じゃない?


僕が書いたこのコードはどうやら「車輪の再発明」らしい → そうだよだからはよドキュメント読め

車輪の再発明とは

「すでにあるものの存在を知らない、またはそれがある意味を誤解しているために、すでにあるものを一から作ってしまうこと」という意味の慣用句

ことの経緯

ある wiki 作成アプリの、ページカテゴライズのためのタグ機能の実装をすることになった

アプリ開発初学者の僕「ページにタグをつける機能を実装するんだから、Tag モデルは作らなきゃだよな」

ちなみにこのアプリは mongoose という MongoDB 用の ODM を使っている

「ページとタグは多対多の関係だから... なるほど page id と tag id という情報を持つモデルを作ればいいのか。これをPageTagRelation として...よし、これでページとタグの紐付けが表現できた!」

...

「指定したページに紐づいてるタグを全部返してくれるようなメソッドが欲しいな。よく使いそうだし、PageTagRelation の static メソッドとして追加しておこう

src/server/models/page-tag-relation.js
  /**
   * find all tag related to the page
   *
   * @static
   * @param {page} page
   * @returns {Promise<ObjectId[]>}
   * @memberof PageTagRelation
   */
  static findAllTagIdForPage(page) {
    return new Promise((resolve, reject) => {
      // 指定した page id を持つ PageTagRelation モデルを全て取得
      this.find({relatedPage: page._id}, function(err, relations) {
        if (err) {
          reject(err);
        }
        // 取得した PageTagRelation モデルから tag id だけ取り出して返す
        resolve(relations.map(rel => rel.relatedTag));
      });
    });
  }

「よし、紐づいてる tag id 取れた!」

PR

レビュワー「select 使えばよくない?」

select... ああ確かに、そんな字面を Mongoose の公式 Docs で見かけたぞ。本当だこれ使えば一発解決じゃん

select という車輪を再発明しようとしてました。

これ以外にも、Tag モデルに createTag() っていう Tag モデルを新規作成するメソッドとか、タグを id 指定で取得してくれる getOneById ってメソッド作ってたけど、これも Mongoose が用意してる create とか find とか使えばいいんじゃん、早く言ってよ

自分で調べましょう

ライブラリにもよるけど、基本的に用意してあるモジュールやメソッド等はドキュメントにちゃんと記載してあるから、こういうメソッドが欲しいなとか思ったら一旦ドキュメントを漁ってみよう。

自力で見つからなかったら、知ってる人に、こういうメソッドはないのかと聞いてみよう。初学者からはわかりづらい表現で記載されてる場合もあるので。

それでもなさそうなら作る。なんでないんだよと愚痴をこぼしながら作りましょう。

まとめ

あらゆるライブラリは基本的に便利に作られてて、欲しいメソッドとかは大抵用意されてる。全部が全部そうではないから自分でカスタマイズしなきゃいけない場合もあるけど、まずは本当に用意されてないのかちゃんと確かめよう。気付いてないだけだったらライブラリ開発者が泣いてます。