質問: いつもお世話になっております。 ### 背景 ちょっとした単純作業を効率化すべき主にRubyでコードを書いています。 CSVやJSONを取り扱うことが多く、コードを書く際、if や for を多様します。 そうするとインデントが深くなってしまいコードがとても見にくくなってします。 エディターをブラウザと分割して表示しており、エディターの横幅に限界があります。 ### 試したこと そこで私がとっている対策は、長いコードを何分割かにして関数化しています。 動作1→動作2→動作3という感じに関数化し分割しています。 しかしこれでは分割し関数化にしたコードを再利用しませんし、使い方が間違っていると思い腑に落ちません。 ### 質問 1) インデントが深くなることは、良くないことなのでしょうか? 私にはコードが見づらいので、インデントを多様することにメリットを感じません。 2) forやifを多様せず、効率よく書く方法はないのでしょうか? JSONを扱っているとfor-if-forのように入れ子になるケースが多くと感じます。 3) ユーザースクリプトを主に書いております。長いコードは、文章のように上から下へコードの流れを書くのが可読性が高いと思っています。 ただ長くなってしまうとインデントが雪だるま式に増えてしまいます。何か対策はないのでしょうか?
回答: コードが無いと具体的には説明しづらいのですが、 データ加工の処理はループだけで書くと下のようになりがちですね。 メソッド分割したところで、ループ処理があっちこっちに行ってしまうと、見通しが悪くなりがちです。 ``` loop { Aの処理 loop { Bの処理 loop { Cの処理 } } } ``` (loopのとこはwhileだったりするかもしれませんが。) こういうときは、Enumerableにあるメソッドで、一括して処理してあげると、ネストが深くならずに書くことができます。 処理が増えても、下へ下へ伸びるだけですし、メソッド化しても大きな流れを見失うことは無いかと思います。 https://docs.ruby-lang.org/ja/latest/class/Enumerable.html ``` 対象のデータ. xxx { Aの処理 }. xxx { Bの処理 }. xxx { Cの処理 } ``` xxxの部分で呼び出すべきメソッドは処理の内容によっていろいろです。 単にループを回したいだけならeachだったり 値を変換する処理ならmap if/unlessを置き換えるなら、selectやrejectなど。 処理内容が長くなりすぎてしまうと、読みづらいので、メソッド化するとよいです。 その際はぜひrubyの特徴であるブロックを使いましょう。 ブロック引数の使い方を学ぶといいです。 https://docs.ruby-lang.org/ja/latest/doc/spec=2fdef.html#method Enumerableには、隣接する要素を加工する(each_slice)とか、二つの配列から値を組み合わせる(zip)とか、変わり種なメソッドもあります。 まずはリファレンスを眺めてみると良いのではないでしょうか。