執筆理由

変数名や関数名、api名は第三者から見てもその存在意義がわかるようにすべきという意識はあったなかでも、以下のようなミスをしてしまったので備忘録として

本題

PR external_link

getHoge と命名する場合は、必ず return する。

言われてみれば当たり前だが、今回なんでそこに気づかなかったのか

作った関数

getLinkTextPreview() { const linker = this.generateLink(); const linkText = linker.generateMarkdownText(); this.setState({ linkText }); }

Q. なぜgetという接頭辞をつけた?

A. (yusuketk) この関数の中で LinkTextPreview という情報を取得 (get) しているので、そうゆう処理を行ってる関数であることがひと目で分かるように、getという接頭辞をつけました!

Q. そのメソッドを呼び出す側は getLinkTextPreview()を呼び出せば 返り値にlinkTextPreviewが入ってると期待するんじゃないですか?

A. (yusuketk)...そうですね

なぜ気づかなかったのか

普段getHogeという関数を作るとき、hogeという情報をreturnするのは当たり前のように書いていた。これは、その関数内に情報を取得する処理を書いたあとに、取得した情報はこのあとどうするの?という質問が自然と投げかけられ(場合によってはlint errorとして指摘される)、呼び出し元にわたすんですと答えるので、その答えの通り取得した情報をreturnする文を書きます。

今回はメソッド呼び出し側に取得した情報をreturnで返すのではなくstateにセットする処理であるため、本来はその時点でgetHogeという変数名は適さないと気づくべきであったが、関数内で行っていることを説明するためにつけていたgetという接頭辞をつける、という誤った認識があったのでそのままにしていた。

もしgetHogeを作るなら以下のようにすべき

setLinkTextPreview(){ const linkText = getLinkTextPreview(); this.setState({ linkText }); } getLinkTextPreview() { const linker = this.generateLink(); return linkText = linker.generateMarkdownText(); }

結論

関数名は、その関数の中で何をやっているのかより、その関数を実行した暁には何ができるのか(実行した側がどのようなことを達成できるのか)、どのような目的を果たしてくれる関数なのかを明示すべき