ようこそゲストさん

CPA-LABテクニカル

2008/03/03(月) Inflectorのバグ?要注意単語集。単数・複数変化もの

クラス名やモデル名に使う時に注意すべき単語


要注意タンゴ
ox
atlas地図
genie魔神
genus種類
graffito掻き絵
loaf
money
move動き
mythos神話体系、価値観
numen精霊
penisペ ニス

 なぜ注意が必要?

Inflectorクラス分析-単語変化関数の使い方に書きましたが、CakePHPは、非英語圏の者にとっては、やっかいな単数、複数、大文字、小文字の変化の規約があります。


それを司るのが、Inflectorクラスです。


CakePHP 規約ワードメーカーを作っていて、Inflectorクラスのバグらしきものを発見しました。(バグなのか、仕様なのかよくわからないけど。)

CakePHPでは、通常のsをつけるだけの複数形ではなくて、特殊な変化系もサポートしていると、Inflectorクラス分析-単語変化関数の使い方で述べました。


例えば、単独だと


複数形単数系意味
peopleperson
oxenox

こんな感じです。しかし、複数の単語を組み合わせた時に異変がっ!


複数形単数系意味
good_peoplegood_person
good_oxengood_oxen

と、牛さんは変化しません。


原因と思われるもの

その原因は、Inflector.php のInflectorクラスの、function singularize($word)において、、、

if (preg_match('/(.*)\\b(' . $regexIrregular . ')$/i', $word, $regs)) {
    $_this->singularized[$word] = $regs[1] . substr($word, 0, 1) . substr($irregular[strtolower($regs[2])], 1);
    return $_this->singularized[$word];
}

というコードがあるのですが、複数の単語を組み合わせた場合は、これに引っかからないためです。peopleも、oxenと同じように、このルーチンには引っかからないのですが、peopleは、別の部分で、ちゃんと変化するよう手当がされており、そちらで上手に変化します。しかし、「牛」は忘れ去られてしまったようで。。。。。


コードをみる限りでは、本当は \\b という正規表現(単語境界にマッチ)が、「_(アンダースコア)]に、マッチすれば問題ないのですが、実験の結果、preg_matchでは、マッチしませんでした。また、マッチしたとしても、substr($word, 0, 1)の部分でおかしくなってしまうので、この部分は、根本的に見直すか、peopleと同じように、oxenについても、別ルールで手当する必要があります。


悲しき日本人

ただし、悲しきかな日本人。ひょっとしたら、このような不規則変化も意味あるのかも、なんて思ってしまって、コード修正はやめました。イングリッシュぺらぺらなら、直接質問するのですけどね~。


こんなことで時間を使いたくないでしょ。

以上のことを知っておかないと、以下はエラーになります。

コントローラーファイル名:big_oxen_controller.php  
モデルファイル名: big_ox.php 

モデルファイル名は、big_oxen.php でないとダメです。しかも、テーブル名は、 big_oxens という、たぶんネイティブさんには許せない形をCakePHPは指示してきます。

という訳で、おとなしき日本人は、以下の単語を使う場合は、細心の注意を払いましょう。(単独で使う場合は大丈夫です。 small_atlases のように、複数組み合わせる時に注意です)


対象は少数


かなり特殊な単語ばかりですが、たまに money や atlas、moveなんかは、どこでも使いそうな感じですよね。それぞれの正しい複数形わかりますか?まあ、それは、Inflectorクラスを覗くか、辞書サイトで調べてみて下さい。普通の変化ではないです。


単独使用は問題なし。


繰り返しになりますが、単語ひとつで運用する場合は上記の要注意単語でも、問題はおきません。


many_oxen


のように、2つ以上の単語を組み合わせた時が要注意です。


他にもあるの?

たぶん、ないと思いますが。。。Inflectorクラスをみた方は、必ずしも、 $coreIrregularSingular で定義されているすべてが変なわけではありません。その中でも、一般ルールで対応できないのが、最初に抜き出した単語たちです。


というか。

単複の区別がない方が、、、いいなあ。womansでもいいだけどな~。

CakePHP 楽じゃないよ(英語わからんちんには)。全然。そんな貴方に

CakePHP 規約ワードメーカー


 この情報は、

1.2.0.6311 beta ですので、いずれ改善?されるのかも知れません。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/0101/tb/