LoginSignup
12
15

More than 5 years have passed since last update.

Immutable.jsで型(モデルクラス)を作ってコメントで楽をしよう

Last updated at Posted at 2016-11-10

コメントががが

オブジェクトを引数で渡しちゃうとコメントがこんな感じになります。

/**
 * ほげする関数
 *
 * @param {object} param                いろいろ入ってるよ
 * @param {string} param.namae          名前だよ
 * @param {number} param.nenrei         年齢だよ
 * @param {object} param.kuwashiku      さらに突っ込んで
 * @param {string} param.kuwashiku.are  あれだよ
 * @param {string} param.kuwashiku.kore これだよ
 * @param ...たくさん書く...
 */
function hoge(param) {

大変ですね。
大変だと書かない人が出てきたり、IDE使ってたとしてもメンテしなくなったり、、、
そして後々になってparamの中の構造がわからず、ログに出して確認しなきゃいけなくなったり。。。

なので immutable.js でクラスを作って楽に書こう!という話です。

import Murabito from './models/Murabito';

/**
 * ほげする関数
 *
 * @param {Murabito} murabito これだけになる!楽チン!
 */
function hoge(murabito) {

イミュータブルなベースを作る

まずは拡張しやすいベースを作ります。
ここでは hito というベースを作ってみました。

import { Record } from 'immutable';

const hito = extendValues => class extends Record({
    namae  : '',
    nenrei : 0,
    ...extendValues,
}) {};

hito は関数式で、実行されるとクラスを返します。
引数のオブジェクトの値はデフォルト値となります。
extendValues というのが味噌なのですが、ひとまず置いておきます。

ベースからシンプルなクラスを作る

hito関数を実行するとクラスが返りますので、これを extends してクラスを作ります。

// 何もせずに拡張する
class Hito extends hito({}) {}

// インスタンスを生成
const hitoA = new Hito({
    namae  : '山田',
    nenrei : '14',
});
console.log(hitoA.toJS()); // { namae: '山田', nenrei: '14' }

new する時に初期値を渡してあげることで、 Hito クラスから hitoA(山田くん14歳)を生成することができました。
これでイミュータブルな人を量産できますね!!

const hitoB = new Hito({ namae  : '佐藤', nenrei : '15' });
const hitoC = new Hito({ namae  : '鈴木', nenrei : '16' });
const hitoD = new Hito({ namae  : '高橋', nenrei : '17' });

どれも Hito型 として楽にコメントできます。

拡張してみる

Hito型だけでは辛くなってきたので、拡張して Murabito型を作ってみましょう。

class Murabito extends hito({
    serifu : '',
}) {
    hanasu() {
        return `${this.namae}: ${this.serifu}`;
    }
}

味噌である extendValues に増やしたいプロパティを入れたオブジェクトを渡します。
これにより、元々もっていた namae, nenrei に加えて serifu を持つことができるようになりました。
ついでにメソッドも書いてみました。
これはインスタンスが楽しみですね♪ では早速、

const murabitoA = new Murabito({
    namae  : 'おじさん',
    nenrei : 33,
    serifu : '今日もいい天気だね',
});
console.log(murabitoA.toJS());   // { namae: 'おじさん', nenrei: 33, serifu: '今日もいい天気だね' }
console.log(murabitoA.hanasu()); // おじさん: 今日もいい天気だね

村人A(おじさん、33歳)を生成することができました。
台詞もバッチリです。

安心して型として使える

おじさんに続いておばさんを生成してみます。

const murabitoB = new Murabito({
    namae  : 'おばさん',
    nenr   : '',
    serifu : 'レディに齢を言わすんじゃないよ',
});
console.log(murabitoB.toJS()); // { namae: 'おばさん', nenrei: 0, serifu: '' }

おっと、おばさんの威圧に怖気付いて、 nenrei をタイポしてしまったようです。
でも安心してください。タイポした nenr は murabitoB のプロパティとして増えることはありません。
また nenrei にはクラス定義時に指定したデフォルト値の0が入っています。
このように、Murabito型は定義した3つのプロパティをちゃんと保証してくれます。
やったね!

まとめ

  • Immutable.Recordを使って、色々な人型を作ってみました。
  • 引数に渡せば内容もはっきりしててわかりやすい!しかもイミュータブル!
  • これで楽できるから、ドキュメント自動生成しなかったとしても、I/Fコメントをちゃんと書こう!

参照

12
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
15