JSのコードを読んでいるとhandleOnClick()
handleOnChange()
のようにonに対してhandleを付与するメソッド名の命名を見かけます。
メソッド名は処理内容を端的に示すべきだと思うのですが、皆さんどう思いますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/08 03:40

回答2件
0
解決済のようですが、別の切り口で回答しておきます。
handleOnChange
handleOnChange()
のようにonに対してhandleを付与するメソッド名の命名を見かけます。
争点はhandleOnChangeが相応しい名前かという点につきます。
- "handle" からは「イベントハンドラ」の意味を読み取れます。
- "on" からは、onclickイベント属性のように、「イベントハンドラ」の意味を読み取れます。
"handleOnChange" は重言であり、もっとスマートな名前に出来ると考えます。
適切な命名
JavaScript
1element.onclick = onClick; 2element.addEventListener('click', handleClick, false);
- 前者は "on" で始まるイベント属性名を元にイベントハンドラを暗喩するスタイル
- 後者は "handle" にハンドラの意味を込めたスタイル
MDNでは後者の命名規則を採用しており、私はより具体的な名前である後者を採用しています。
addEventListener
がリスナー関数を引数にとれることから、clickListener
と命名する事も出来ますが、
JavaScript
1element.addEventListener('click', { 2 handleEvent: function handleEvent () {} 3}, false);
上記のように listener オブジェクトを指定した場合の関数はhandleEvent 関数となるので、両者を識別する為によりハンドラの意味が強い handleClick
を採用しています。
これらは一つの考え方に過ぎず、名前が持つ意味を定義し、徹底して論理的に考察する事が重要だと思います。
疑問に思った事は、「論理的に」「矛盾がなくなるまで」考察を勧めて下さい。
onに対してhandleを付与するメソッド名の命名を見かけます。
何か思うところがある事は伝わるのですが、どのような論理で疑問を感じているのか、その点を深く追求できれば、一歩先の考えに進めると思います。
無名関数
関数型プログラミングが流行ってから無名関数が広く使われるようになりましたが、リーダブルコードの観点では無名関数は悪手だと思います。
JavaScript
1const handleClick = event => { 2 // 長い関数コード 3}; 4 5document.addEventListener('click', handleClick, false);
無名関数を採用しないこのコードは本当に無意味でしょうか。
document.addEventListener
のコードがすっきりしている分、可読性が上がっているという見方もあるのでは…?
JavaScript
1const array = [1,2,3,4,5]; 2 3for (var i = 0, len = array.length; i < len; i++) { 4 document.addEventListener('click', () => console.log(array[i]), false); 5}
このコードはどうでしょう?
コーダの期待に反して、undefined
が5回出力されますが、原因が分かりますか。
JavaScript
1const array = [1,2,3,4,5]; 2 3function handleClick (event) { 4 console.log(this.i); 5} 6 7// (A) 8for (var i = 0, len = array.length; i < len; i++) { 9 document.addEventListener('click', (function (i) { 10 return () => console.log(i); 11 }(i)), false); 12} 13 14// (B) 15for (let i = 0, len = array.length; i < len; i++) { 16 document.addEventListener('click', () => console.log(array[i]), false); 17} 18 19// (C) 20for (let i = 0, len = array.length; i < len; i++) { 21 document.addEventListener('click', { 22 i: i, 23 handleEvent: function handleClick () { 24 console.log(this.i); 25 } 26 }, false); 27} 28 29// (D) 30for (let i = 0, len = array.length; i < len; i++) { 31 document.addEventListener('click', {i: i, handleEvent: handleClick}, false); 32}
先のコードを解決する手段として、A~Dの度のコードが最も美しいと感じますか。
可読性だけでなく、機能的な違いを説明できますか。
JavaScript
1document.addEventListner('click', function handleClick (event) { 2 if (event.target.name === 'enable') { 3 document.getElementById('foo').addEventListener('click', function handleClick2 (event) { 4 console.log(event.type); 5 }, false); 6 } 7}, false);
今度はどうでしょう。
このコードが持つ問題を解決するには、どのように修正すれば良いと考えますか。
ざっくり書きましたが、これらは初心者が無名関数を好んで使った場合に陥りやすい罠たちです。
- コールバック関数には無名関数を使うのがエレガントな書き方である
という風潮で盲目的に無名関数を使い続けると、これらの罠に陥ります。
「短く書ける」という性質に目を向ける前に、「変数のスコープ」や「スコープチェーン」にまで目を向けると、関数の位置の重要性に気が付けると思います。
あと、「無名関数式」よりも「名前付き関数式」の方がリーダブルだと思います。
Re: nyako_prog さん
投稿2019/08/08 12:53
総合スコア18194
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
私は上級エスパーなので貴方の質問文の行間を読みましたが、
おそらく下記のようになっていると考えられるのでリーダブルではありません。
JavaScript
1const handleOnClick = event => { 2 document.querySelector('.foo').style.display = 'none'; 3 document.querySelector('.bar').style.display = 'block'; 4} 5document 6 .querySelector('.hogehoge') 7 .addEventListener('click', handleOnClick); // じゃあ最初からここに無名関数で入れたら?
因みにhandleOnClick()
は条件付きでリーダブルです。
ただし、私のイメージと一致するならばの前提です。
私がソースコード無しでその名前を見た場合、
こういう引数と処理になっているだろうと想像します。
JavaScript
1const handleOnClick = (target, fn) => 2 target.addEventListener('click', fn);
私が法だ!!!
まぁ冗談ですけど、こういう想像をするエンジニアはまぁまぁ居ると思います。
addEventListener
が長いとはいえ
こんなラッパー関数あんまり意味がありませんよね。
関数名もこの用途ならばonClick
にした方が良いと思います。
投稿2019/08/08 04:02
総合スコア21510
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。