071117 ruby open class

59
みなさんは、言語やフ レームワークが自分の 好みと異なる挙動をし ているとき、どうして いますか?

Upload: tomoki-maeda

Post on 22-Jul-2015

2.137 views

Category:

Technology


0 download

TRANSCRIPT

みなさんは、言語やフレームワークが自分の好みと異なる挙動をしているとき、どうして

いますか?

例えば

文字列クラスに文字列を短く省略するメソッドがあったら便利なのになぁ“長い文字列”     => “長い...”

とか

標準の仕様だと、HTTP POSTの生データを取り出すことができないんだよなぁ(servletとかcgi.rbの仕様)

とか

フレームワークが出力するログのフォーマットに時刻が出てくれないけど、時刻は出したいよねぇ(Rails)

とか…

ここでとれる行動は以下の4つぐらいある

(1)

メソッドが足りないだけなら、外部にそのメソッドを定義して使うことができる

String s =“長い文字列”;s = StringUtils.abbreviate(s,3);// => “長い文...”

文字列を操作するメソッドなのに、わざわざ別クラスを定義したり呼びださないといけない

ショボーン(́・ω・`)

(2)

ソースコードがあれば、ソースコードを書き換えてしまう。最近はオープンソースのものが多いし!

でも、書き換えたMyフレームワークをコンパイルして、運用環境にインストールしないといけない

ショボーン(́・ω・`)

(3)

フレームワークに、クラスを挿げ替える仕組みがあれば自作のクラスでフレームワーク内のクラスを置き換えてしまう

Delegate(委譲)class MyClass...end

o = FrameworkClass.newmyobject=MyClass.newo.set_delegate(myobject)

とか

DI Container

とか

でも、委譲の仕組みを作り込んでくれていたりDIを使っているフレームワークって少ない

ショボーン(́・ω・`)

(4)

諦める

我慢して使う

どよーんorz

ここで今日のお話

OpenClass

オープンクラスとは何か

クラスを自由に再定義できる

を自由に再↑

ここ重要

自由に↑

ここ重要

再定義とは

メソッドを追加、削除、上書きしたり

インスタンス変数を追加したりなど。

使用例

Ruby標準添付ライブラリkconv(文字コード変換)

Rubyのマニュアル

>> “ほげ”.tosjis=> <ShiftJISの”ほげ”>Stringという組み込みのクラスに文字コード変換メソッドが追加されている

もう一個

RailsのActiveSupport

「今から1ヶ月前」の時刻オブジェクトを得るには?

>> 1.month.ago=> Sat Oct 17 15:56:21 +0900 2007

>> 1.month=> 2592000

自分でもやってみる

(問題)Railsのログ出力フォーマットが気に食わない

 logger.debug("log test")

と書くとdevelopment.log に

 log test

と出る。日時も出したいよね?

クラスLoggerを再定義class Logger def format_message(severity, timestamp, progname, msg) "[%s] %5s -- %s: %s\n" % [timestamp, severity, progname, msg] endend

 logger.debug("log test")

と書くとdevelopment.log に

 [Sat Nov 17 16:23:48 +0900 2007] DEBUG -- : log test

と出る

もう一個

(問題)文字列を省略して

縮めたい

Stringクラスを再定義class String def truncate(n) slice(/^.{0,#{n}}/m) + (nchar > n ? "..." : "") end def nchar split(//).size endend

>> “長い文字列”.truncate(3)=> “長い文...”

あたかも元からあったメソッドのように使える!

まとめ

もう面倒なことしない!

諦めない!

俺たちは自由だ!

自主規制