ろきメモ【ROKI MEMO】- ろきsanの備忘録 -

ろきさんの備忘録。プログラミング学習記録や開発記録、および学んだ知識等のアウトプットとシェアを目的に書いています。たまに普通のことも書きます。

【プログラミング勉強法】コードを理解するならコメントで動きを書いてみる。だらだら書いてもよし。

スポンサーリンク

プログラミングを勉強中、コードをなんとか理解したいときがある。

そんなとき、ぼくはそのコードに対して、またプログラムの流れについて日本語でコメント書いてみる。

そうすると、理解ができる。

昨日、そんなツイートした。
せっかくなので、ブログでもうちょい詳しく書く。



Progete勉強中のツイート。


Progeteはよく、
「1周目は理解できなくてもいいから一通りやる。2周目に理解する」
がいいと言う人が多いので、その2周目の理解に参考になれば。

まぁ、ぼくは1周目からがっつり理解したい派だけど、まぁこれは好き好きで。


コメントはむしろだらだら書く

さて、そのコメントだけど、
コメントと言っても、コードの中に簡潔にわかりやすく書いてある、美しいコメントじゃなくていい。
もっとハードル下げる。


コメントが長くなってもいいし、箇条書きじゃなくてもいい。
日本語だらだら書いてみる。

当然間違ってもいい。



例えば、ぼくの場合はこんな感じ。
(Progate Rails5 学習コースXの内容)



config/routes.rb

Rails.application.routes.draw do
  get "users/:id/likes" => "users#likes"
  ...
end

URL「localhost:3000/users/1/likes」にアクセスする。
ルーティングで"users#likes"とあるから、usersコントローラのlikesアクションを呼び出す。

で、そのusersコントローラは、


app/controllers/users_controller.rb

class UsersController < ApplicationController
  ...
  def likes
    @user = User.find_by(id: params[:id])
    @likes = Like.where(user_id: @user.id)
  end
end

likesアクション内で、
Userクラスだから、usersテーブルのid(カラム)が、params[:id]、つまりURLの数字のやつが一致したデータを@userに入れる。


Likeクラスだから、likesテーブルのuser_id(カラム)が、さっき取得した@userのidと一致したデータ、whereだから複数のデータを@likesに入れる。

さて、コントローラの次はビューだ。
usersコントローラのlikesアクションのビューだからusers/likes.html.erbか。


app/views/users/likes.html.erb

...
    <% @likes.each do |like| %>
      <% post = Post.find_by(id: like.post_id) %>
      <div class="posts-index-item">
        <div class="post-left">
          <img src="<%= "/user_images/#{post.user.image_name}" %>">
        </div>
        <div class="post-right">
          <div class="post-user-name">
            <%= link_to(post.user.name, "/users/#{post.user.id}") %>
          </div>
          <%= link_to(post.content, "/posts/#{post.id}") %>
        </div>
      </div>
    <% end %>
...

取得した@likeをeachメソッドを使って、1つずつ変数likeに入れて出力する。
変数likeは<%= =>とかつかって、Rubyコードでいい感じに表示される。


まぁ、こんな感じ。

一見めんどくさそうだけど、理解がぼやっとしている人は書いてみるのもよいかと。


わからなくても書く。すると素敵なことが起こる

上記の例を見ていると、こう思う。

「いやいや、これは理解しているから書けるだけで、理解できてないから困っているんだよ」


そういう時はどうするか


それでも書く!

わからないまま書いてみる



例えばこんな感じ

app/controllers/users_controller.rb

class UsersController < ApplicationController
  ...
  def likes
    @user = User.find_by(id: params[:id])
    @likes = Like.where(user_id: @user.id)
  end
end

Userってよくわかんないけど、たしかusersテーブルからidがURLの数字と同じやつが@userに入るんだっけ?

で、likesテーブルの方は、whereって忘れたけど、user_idが一致したデータを今度は@likesに入れるんだな。


これでもいい。


なぜかというと、何がわかっていないかがわかるから。

それと、意外と書いているうちになぜか理解できてくるから。


上記のように、わかんないことを書いていると、たまに次のようになる。

Userってよくわかんないけど、たしかusersテーブルからidがURLの数字と同じやつが@userに入るんだっけ?

で、likesテーブルの方は、whereって忘れたけど、user_idが一致したデータを今度は@likesに入れるんだな。


たしかwhereって複数のデータを取得するんだ。
ってことは、find_byで取得した@userは1つのデータだけど、
@likesは複数のデータ、たぶん配列だろう。


そうか、配列だからビューで、<% @likes.each do |like| %>
って感じでeach使っているんだ。


なるほど。
で、1つずつ表示できてるんだな。
はいはい。わかってきたぞ。


って感じで、独り言のようにコメント書いていると、
いつの間にか理解できてたりする。


一種の「ラバーダッキング法」※


もしコードを理解できずにもやもやしてるときは、試してみるのもあり。


同様に、誰かににslackとかで質問するときも、
ちょいと詳しく書くと、書いているうちに自己解決する場合もある。



質問した相手に一言も言わせない


これは「あるある」だけど、
ぼくもコーディングしていたときの、とある出来事。


出力がうまくいかないときに、後輩に質問

「ちょっといい?教えてほしいんだけど

「いいですよ」

「このデータがうまく出力できないんだけど」

「データがこの配列に入ってて、こんなふうに取り出してたらうまくいかなくて」

「この配列って、中身こういうふうになってて、こうするとうまくいかない。たぶんこれがこうなっているから・・・だったらこれをこう使うといい感じになるかも?

「・・・」

「で、こうすると、あ、いける!そうかこうすればいいのか。」

「ちょっと試してみる。よし!できた!ありがとう!

「・・・何しにきたんですか!w」

こういうときに、笑って許してくれる仲間やメンターがいる人は幸せものですよ。



※ラバーダッキング

プログラマが問題解決の手段として使用する「問題を物に話しかけることで、話しているうちに頭の中で問題が整理され、解決法が導かれる」というテクニック。

引用:はてなキーワード