1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ハッシュ・配列を「見やすく」する7つの意識をAIに聞いた

1
Posted at

背景

  • 外部サービスの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. {[ かで型を確定(ロッカー? 行列?)
  2. 外側1階層だけ把握して安心する
  3. 必要な階層まで1段ずつズームイン
  4. 取り出すなら住所を上から繋ぐ(型に応じてカッコ/ドット)
  5. 迷ったらconsole で .class と中身を確認(頭で悩まず外に出す)

まとめ

  • 苦手の正体は「記憶力」ではなく「外に出す習慣がなかった」こと
  • 上達の近道は rails console で実際に触ること(打つ → Enter → 返り値を見る、のループ)
  • boolean の比較は == true 不要。select { |p| p['online'] } で十分
  • JSON.parse 由来のハッシュはキーが文字列。シンボルで引くと nil になる罠に注意

感想

  • コードの読み方をAIと議論して振り返るのはめっちゃ良いなと思いました
  • 個人的にはコードレビューはAIがしてくれるよりも、AIにサポートさせるという感覚のほうがあっている気がした
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?