みなさんは、言語やフレームワークが自分の好みと異なる挙動をしているとき、どうして
いますか?
文字列クラスに文字列を短く省略するメソッドがあったら便利なのになぁ“長い文字列” => “長い...”
標準の仕様だと、HTTP POSTの生データを取り出すことができないんだよなぁ(servletとかcgi.rbの仕様)
フレームワークが出力するログのフォーマットに時刻が出てくれないけど、時刻は出したいよねぇ(Rails)
メソッドが足りないだけなら、外部にそのメソッドを定義して使うことができる
String s =“長い文字列”;s = StringUtils.abbreviate(s,3);// => “長い文...”
文字列を操作するメソッドなのに、わざわざ別クラスを定義したり呼びださないといけない
ソースコードがあれば、ソースコードを書き換えてしまう。最近はオープンソースのものが多いし!
でも、書き換えたMyフレームワークをコンパイルして、運用環境にインストールしないといけない
フレームワークに、クラスを挿げ替える仕組みがあれば自作のクラスでフレームワーク内のクラスを置き換えてしまう
Delegate(委譲)class MyClass...end
o = FrameworkClass.newmyobject=MyClass.newo.set_delegate(myobject)
でも、委譲の仕組みを作り込んでくれていたりDIを使っているフレームワークって少ない
Ruby標準添付ライブラリkconv(文字コード変換)
>> “ほげ”.tosjis=> <ShiftJISの”ほげ”>Stringという組み込みのクラスに文字コード変換メソッドが追加されている
>> 1.month.ago=> Sat Oct 17 15:56:21 +0900 2007
>> 1.month=> 2592000
(問題)Railsのログ出力フォーマットが気に食わない
クラス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)=> “長い文...”
あたかも元からあったメソッドのように使える!