【プログラミング勉強法】コードを理解するならコメントで動きを書いてみる。だらだら書いてもよし。
スポンサーリンク
プログラミングを勉強中、コードをなんとか理解したいときがある。
そんなとき、ぼくはそのコードに対して、またプログラムの流れについて日本語でコメント書いてみる。
そうすると、理解ができる。
昨日、そんなツイートした。
せっかくなので、ブログでもうちょい詳しく書く。
コードにコメント書くと学べると言われる
— ろきsan@プログラミング続ける人。 (@AhrkIzo) July 9, 2018
Progateやっているときも一部書いてる@user = User.find_by(id: params[:id])
→usersテーブルから、idがparams[:id]と一致したデータを@user変数に代入
とか
コードの理解に繋がるし、その後の演習も、そのコメントを元にコード書いてまた勉強になる
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」
こういうときに、笑って許してくれる仲間やメンターがいる人は幸せものですよ。
※ラバーダッキング
プログラマが問題解決の手段として使用する「問題を物に話しかけることで、話しているうちに頭の中で問題が整理され、解決法が導かれる」というテクニック。
引用:はてなキーワード