シングルトンオブジェクトをデフォルト引数として使う(翻訳)|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。原著者の許諾を得て翻訳・公開いたします。シングルトンオブジェクトをデフォルト引数として使う(翻訳)オプション引数を1つ取るメソッドを定義したくなることがときどきあるかと思いますが、プログラマーがこのメソッドにnilを渡す可能性がないわけではありません。コードの側では、値が提供されない(つまりデフォルト値にする)場合とnilの場合を区別する必要があるとします。やったらこれをうまくさばけるでしょうか?こういう場合によく使われるのは、nilやその他の空値やゼロ値をデフォルト値としてメソッドを定義するというものです。0や文字列、空の配列などの場合であれば、この方法は理にかなっています。endendしかし、nilと、値が指定されていない場合を区別する必要がある場合はどうしたらよいのでしょうか。具体的には、次の2つを区別する方法です。nil)foo.bar(:something)こんな場合に使えるのは、単一かつ一意のオブジェクトを定義して、それをデフォルトに用いる方法です。渡された引数がnilかどうかをチェックするのではなく、シングルトンオブジェクトであるかどうかをチェックします。:NOT_PROVIDEDendprivate_constantは無理して使う必要はありませんが、私はこのメソッドを引数に使えることと、privateクラスでも同じようなことができることをRuby開発者に思い出していただきたいのです。2)12:not_providedのようにシンボルを使ってもよいですし、数値などRuby内部で一意であるものなら何でも構いません。後述のassert_changesのような一般的なメソッドでは、引数に有効なオブジェクトが渡される可能性もあります。最善の方法は、引数として受け渡せない一意のオブジェクトを使うことです。以下は、Railsでこれを用いてassert_changesを実装する方法です。retvalend私はどうやら、RSpecのこのアプローチが好みです。}.from(0).to(1)しかしその一方で、UNTRACKEDオブジェクトを用いるassert_changes実装もありだと思います。これは、論理値(boolean)引数にどこか似ています。これは、2つの異なるオブジェクトで定義されるべきフラグとしてよく用いられます。false)よりも、単にfoo(1)やbar(1)とする方がよいとされることが多く、私も普通はこのガイドラインに従います。assert_changesの場合であれば、名前付き引数とシングルトンオブジェクトの組み合わせはよいのではないかと思います。知りたい方へ本記事を気に入っていただけた方は、Arkencyのニュースレターの購読をお願いします。開発者を悪い意味で驚かせないRailsアプリを構築するための弊社のノウハウを毎日お送りします。いずれも英語記事です)。Rails』もぜひどうぞ。巨大で複雑なRailsアプリを扱ってる方に有用です。ツイートよりこれ私も使ったことあって有用...なんだけど、これ「シングルトン」オブジェクトって呼んじゃうことに違和感がある。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。