ろき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」

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



※ラバーダッキング

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

引用:はてなキーワード