関数定義をするときに存在するかチェックして、存在しなければ定義するというコードをたまに見かけます。
タグは PHP と JavaScript ですが、私がよく見かけると思っただけで他の言語でもあると思います。
すでにある関数を上書き・もしくは上書きできないことによるエラーを防ぐためなのかと思うのですが、そのエラーを防いだところで定義する関数が polyfill でもなければムダだと思います。
必要なケースってありますでしょうか?
以下私の考えです。
チェックあり+存在する場合
関数は定義されない。
polyfill ならば、元からある関数と同じ動きなので問題ないが、そうでない場合は別の動きとなるため、自分が定義した関数のつもりで引数を渡しても引数の数や渡すデータが既存の関数とは全然違うのでエラー、もしくは運良く数や型があっていてエラーが起きなくても返り値は期待通りにならないはず。
チェックする+存在しない場合
普通に定義される。
自分で定義した関数に引数を渡すだけなので意図した動きになっているはず。
チェックしない+存在する場合
上書きできる場合は上書きされる。
既存の関数として呼び出している部分(ライブラリなど)は動かなくなるが、自分で書いた部分は少なくとも自分で定義するはずの関数に合わせた引数なので動くはず。
上書きできない場合はそこでエラーが起きる。
チェックしない+存在しない場合
チェックして存在しない時と同様で普通に定義される。
自分で定義した関数に引数を渡すだけなので意図した動きになっているはず。
存在する場合にチェックするということは、自分定義した関数で実行されるか元からある関数で実行されるかわからない状態になります。
エラーが起きずに返り値が返ってきてしまうとどこが原因なのかわかりづらく探すのにこまると思います。
チェックしない場合は上書きできない言語ではエラーが出るのでどこが原因かすぐにわかると思います。
JavaScript のような上書きできる場合は自分で書いたコード外でエラーが出るかもしれないですが、それをチェックするなら「関数がなければ定義する」ではなく「関数があればエラー出す」とすべきだと思います。
昔、関数あるかチェックしてるコード書いてる人に聞いてみた時は、たしか「将来的に同じ名前の関数が出てきても大丈夫なようにかいたほうがいいらしい」、のような感じのことを行ってた記憶がありますが、同じ名前の関数で同じ引数をとり、同じ返り値を返す仕様な確率なんてほぼありえないと思います。
長くなりましたが、関数がなければ定義するというチェックが必要な場合はありますか?
コードはたしかこういう感じのものです。
php
1if (!function_exists('debug_print')) { 2 function debug_print(){ 3 // 4 } 5}
javascript
1if(typeof window["debug_print"] !== "function"){ 2 debug_print = function(){ 3 // 4 } 5}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/25 13:28
2016/08/25 13:32