質問するログイン新規登録
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

5372閲覧

handleOnClick() はリーダブルと言えるのでしょうか?

nyako_prog

総合スコア13

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/08/08 03:27

編集2019/08/08 03:36

0

0

JSのコードを読んでいるとhandleOnClick()
handleOnChange()
のようにonに対してhandleを付与するメソッド名の命名を見かけます。

メソッド名は処理内容を端的に示すべきだと思うのですが、皆さんどう思いますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyako_prog

2019/08/08 03:35

命名規則的には正しいのですが、リーダブルかどうかという観点での質問でした。タイトルを修正しておきます。
m.ts10806

2019/08/08 03:40

となると、そのメソッドの処理内容と呼び元(要はどう呼び出されどう利用されるのか)まで必要に思います。名前だけ見てもそれが適切かどうかは判断できませんので
guest

回答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

think49

総合スコア18194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyako_prog

2019/08/08 13:24

ご丁寧な回答ありがとうございました。 意味合いの被りが違和感を生んでいたわけですね。論理的で大変わかりやすかったです。
guest

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

miyabi-sun

総合スコア21510

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyako_prog

2019/08/08 11:28

行間を的確にお読みいただきありがとうございます。 handleOnClickは「onClickした際の挙動だからhandleつければいいだろ!」的な発想から生まれたのだと思いますが、やはりリーダブルではないですよね。 ご回答ありがとうございました!
miyabi-sun

2019/08/09 06:57

ハンドラとして関数名切って管理するにしても、 何が行われるかに着目した関数名の方が良いですね。 例えばクリックするとタブが切り替わるなら`switchTab`みたいな感じでこれなら、許せる度はかなり上がりますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問