背景
- 外部サービスのWeb APIを叩いてデータを取得する機能のコードリーディングを通して、「ハッシュ・配列のような入れ子データ」を読むのが苦手だなぁと思った
- AIと壁打ちしつつ、どうやったらいい感じに読めるのか議論したので記載しておく
苦手の正体
入れ子データが苦手なのは才能の問題ではなく、「やり方」の問題らしい
原因は、入れ子の全体を頭の中だけで保持しようとして、ワーキングメモリ(同時に3〜4個が限界)が溢れていること。対策の大原則は**「頭の中で保持する」のをやめて「外に出す」**(書く・潰す・console で触る)こと
ハッシュ・配列を「見やすく」する7つの意識
① 見る前に「型」を一言で確定する
{ か [ かだけ見て種類を確定させる
| 記号 | 正体 | イメージ | 引き方 | 順番 |
|---|---|---|---|---|
{ } |
Hash | 名札つきロッカー | 名札(キー)で引く | 意味なし |
[ ] |
Array | 番号つきの行列 | 番号(0始まり)で引く | 意味あり |
「これはロッカー(名札で引く)か、行列(番号で引く)か?」を最初に決める
② 一度に「1階層」しか見ない
入れ子の全体を一度に理解しようとしない。いま見ている階層以外は … で潰す。エレベーターで1フロアずつ降りる感覚
{ "name": "グループX", "participations": [ … ] } // まず外側だけ「2キーのHash」と確定して安心する
↓ それからズームイン
"participations": [ {…}, {…}, {…} ] // 次に配列だけ見る
体感としてこれは結構良かったです
③ 記号を「日本語に音読」してから読む
-
{→ 「〜という情報がまとまった箱(名札つき)」 -
[→ 「〜が順番に並んだリスト」 -
"email": "tanaka@example.com"→ 「email という名札に tanaka@example.com が入っている」
④ 「引き方」は型で自動的に決まる(ドット問題の最終解決)
| 相手 | 引き方 | 例 |
|---|---|---|
| Hash | カッコ + キー | room["participations"] |
| Array | カッコ + 番号 | participations[0] |
| モデル(メソッドを持つ) | ドット | user.email |
ドットは「メソッドを持つオブジェクト」専用。ただの Hash / Array はカッコ
⑤ 出どころで「ドット or カッコ」を予測する
- DB(Active Record モデル)から来た → ドット(
user.email) -
JSON.parse/ 外部 API から来た → カッコ + 文字列キー(participant["email"])- ※
JSON.parseの結果はキーが文字列。participant[:email](シンボル)はnilになる罠あり
- ※
⑥ 取り出しは「住所」を1段ずつ繋ぐだけ
room['participations'][1]['name']
# └Hash────────┘└Arr┘└Hash─┘
# 「participations の → 1番目の人の → name」 ← 左から順に降りる住所
⑦ 「加工したい」ときは3つの動詞で考える
やりたいことを動詞で言う → 対応メソッドを選ぶ
| やりたいこと(動詞) | メソッド | ブロックが返すもの | 結果 |
|---|---|---|---|
| 変換したい | map |
値1個 | 配列 |
| 絞り込みたい | select |
true/false(真偽) | 配列 |
| ハッシュに固めたい | to_h |
[キー, 値] のペア |
ハッシュ |
これもだいぶ助かったアドバイス
困ったときの読む手順
-
{か[かで型を確定(ロッカー? 行列?) - 外側1階層だけ把握して安心する
- 必要な階層まで1段ずつズームイン
- 取り出すなら住所を上から繋ぐ(型に応じてカッコ/ドット)
- 迷ったらconsole で
.classと中身を確認(頭で悩まず外に出す)
まとめ
- 苦手の正体は「記憶力」ではなく「外に出す習慣がなかった」こと
- 上達の近道は
rails consoleで実際に触ること(打つ → Enter → 返り値を見る、のループ) - boolean の比較は
== true不要。select { |p| p['online'] }で十分 -
JSON.parse由来のハッシュはキーが文字列。シンボルで引くとnilになる罠に注意
感想
- コードの読み方をAIと議論して振り返るのはめっちゃ良いなと思いました
- 個人的にはコードレビューはAIがしてくれるよりも、AIにサポートさせるという感覚のほうがあっている気がした