いつも思う不要な一時変数問題
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 7
◆ 次でしか使わない一時変数をなくしたい
◆ if の条件と関数呼び出しの引数に使いたい場合など
◆ if に使うなら if で for みたいに変数宣言できればいいのに
◆ if の条件と関数呼び出しの引数に使いたい場合など
◆ if に使うなら if で for みたいに変数宣言できればいいのに
const value = something()
if(value) {
send(value)
}
直下の 1 つでしか使わないのに value が以降も残るのが嫌な部分です
さらに これのすぐあとに something2() で同じようなことしようとすると value がすでに定義されてるという問題もあるのですよね
value2 のように一時変数を増やして連番つけるのも見やすくないですし
かと言って これのためにブロックスコープ作ると行が長くなるしインデント深くなるしで 見やすさ的に悪い方向に行ってる感じがします
なのでこういうヘルパ関数を作ってみようとしてはなんか違うなーと思います
const fn = (value, fn) => fn(value)
fn(something(), x => {
if (x) {
send(x)
}
})
fn を用意しなくても即時関数実行でできるものですし
!((x) => {
if (x) {
send(x)
}
})(something())
でもさすがにこれは見づらすぎです
結局のところ const にせず使いまわし変数を用意してこうするのが シンプルに書けて不要な関数呼び出しも避けれてパフォーマンス的にも最適なんですよね
let _
if(_ = something()) {
send(_)
}
_ は使い回すので 直下に something2 で同じような処理を書けます
ただ こういうミスしやすそうな書き方が許せない気持ちも大きいです
C# の if に is を使ったようなパターンマッチでスコープ内変数ができてくれるといいのですけど
それか for 文のように if の () 中に let や const 定義できるようにするとか
if (const value = something()) {
send(value)
}
とりあえず for にして 1 回ループするようにすれば ただブロックスコープ作るより短くなるけど やっぱりわかりづらいです
for (const value of [something()]) {
if (value) {
send(value)
}
}
メソッドであれば最近使えるようになった ?. を使うと
something()?.send()
と書けますが関数呼び出しだと使えません
その他色々考えてみても複雑になるだけでスッキリとした書き方にはならないです
const callIf = fn => value => value && fn(value)
const sendCallIf = callIf(send)
sendCallIf(something())
const when = cond => (truefn, falsefn) => value =>
cond(value) ? (truefn && truefn(value)) : (falsefn && falsefn(value))
when(e => e)(send)(something())
if で変数宣言できるのがベストなのですが 他の言語だといい方法あるのでしょうか
COMMENT
コメント一覧 (7)
-
- 2020/02/19 01:51
-
呼び出し先に分岐を隠蔽ですかね。
まあ分岐は恐ろしいほどスキル差出ると思いますので書かせないに限る。。w
七段if〜elseif&ネスト(四桁行)とか平気でやるのが居ますからね… -
がしました
-
- 2020/03/01 04:04
-
関数オブジェクトに適当なプロバティを作って関数の戻り値を代入しておくのはどうでしょう
関数結果のメモ化をその関数プロパティにもたせることは見なくはないので
if(something._result = something()) {
send(something._result);
} -
がしました
-
- 2020/09/06 14:58
-
これはどうでしょう?
const when = (cond, then, els) => cond ? then(cond) : els(cond);
when(something(), send, console.log); -
がしました