コードリーディングの効能

この記事はSpeee Advent Calendar 20日目の記事です。

前日の記事はコチラ ハリネズミと暮らすエンジニアライフ | CTO.Works


こんにちは、ミドルサーティーエンジニアのkawakuboxです。

2015年もあと残すところ10日ちょい。

あらためて2015年を振り返ると

などと、直近5,6年の中で最も変化の大きかった年だった。

今日は、10年近くJavaで食ってきた自分が、Rubyへとシフトチェンジした際にコードリーディングを通じて感じた効能を書いていく。

文法が覚えられる

代入系の演算子が多く定義(||= etc)されていて、初見で??となったり。

<=> を見て「ナニコレ?」となったりした。

そっから調べてみると「便利!」といったこともあった。

また、繰り返し処理にも学びがあった。

一昔前のプログラム言語だと、while, for あたりを押さえていれば事足りた*1けども、Ruby は更に表現力が増していて、 while と対になる until があったり、 イテレーション系のメソッド(each, map, times etc...)が豊富に用意されている。

こんな標準メソッドあったんだという感動

先の繰り返し処理each するのにインデックス用のカウンタ欲しいなと思ったら、 each_with_index ってのがあったりと至れり尽くせり。

そんなこんなで、カウンタ用の変数が広めのスコープに定義されていたら、あれっ?と思う感性はついた。

初日に suthio も書いてるとおりで、自分の知っている範疇のメソッドしか使えないので、いくらコード書いてアプリ作れるようにはなっても、いっこうに中身は洗練されてない、、、なんてことになりかねない。

やっぱり他人のコードやリファレンスを読む数をこなさないと身につかないなぁ〜と感じるわけっす。

命名やコメントのセンスを磨ける

英単語語彙や英分作成能力の乏しい自分にとっては、ここを伸ばそうと思ったら他人のコードを見るのが手っ取り早いと思っている。

命名のお作法まとめや、commitコメント検索サービスもあるけど、ロジックの背景を汲んだ活きた単語やコメントに触れるのも大事なんじゃないの? と思う次第。

標準のディレクトリ構成を知れる

Java であれば、maven で標準的なディレクトリ構成が提示されるよねってのと同じで、 Ruby であれば、rails newbundle gem によって基本となるディレクトリ構成が生成される。

さらには初期生成されるディレクトリに加えて、サービスはテストデータ、デコレーション用のクラスなんかはどこに入れるんだろう?? ってのことも色んなコード見ることでどの辺に置くのが一般的かは見えてくると思う。

例えばRails だと、サービスクラスは app/services だし、テストデータは spec(or test)/fixtures に入れましょうといったお作法があったり。

まとめ

リーディングが大事ってのはプログラムに特化した話ではなく、英語・ドイツ語といったような、一般的に言語と呼ばれる学習にも通じることだと思う。

アプリケーションを作るというのはアウトプットする場なので、それの良し悪しを左右するのはインプットの質と量ということになる。

ではそのインプットって何なの? と考えると、コードリーディングがその筆頭になるじゃないかなと考えてる。

追伸

巷にあふれている外国語のすぐれた勉強法を適用するのはとてもよい戦術だと思う。

 最短ルートで英語をマスターする現実的かつ効率的な勉強法をまとめてみる

 これなんかも、 s/英語/Ruby/g, s/英語/Go/g で脳内置換すると、あぁそうだよねぇ とすごく腹落ちする感じ。


明日(12/21)、は Tei1988Pebble Watchでmrubyを試す(まだ動かせて無いよ編)です。

*1:Java もバージョン重ねるごとに、 Iterator や 拡張 for が導入されたりした

java.sql.ResultSetMetaData メモ

java.sql.ResultSet のメタデータである java.sql.ResultSetMetaData。

 

今更感もあるが、何が取得できるのかを調べてみたのでメモとして残しておく。

 

引数の列番号は、0ではなく1始まり。

 

メソッド名 メモ
getCatalogName(int column) カタログ名を返却。カタログはh2, MySQLではデータベース名に相当する。
getSchemaName(int column) スキーマ名を返却。CREATE SCHEMA にて作成されたスキーマ名が得られる。
getTableName(int column) テーブル名を返却。
getColumnName(int column) 列名を返却。
getColumnLabel(int column) 列ラベル = AS で付けられたエイリアス名に相当。
getColumnDisplaySize(int column) 表示桁数を返却。DATE型の場合は、yyyy-MM-dd で10が返却される。INTEGERはマイナス符号を含めて11。
getColumnType(int column) java.sql.Typesの定数値を返却。一覧はコチラを確認。
getColumnTypeName(int column) 列の型名を返却。
getColumnClassName(int column) JDBCドライバにてマッピングされたJavaのクラスを返却。
getPrecision(int column) 型の精度を返却する。INTEGERは10, DECIMALは65,535が返却。
getScale(int column) 小数点以下の桁数を返却。VARCHAR, DATEなどの型は0が返却される。

※使用したDBMSは、h2 の 1.3.175。