最近、Udemyでリーダブルコードに関する動画を視聴しました。
https://www.udemy.com/course/readable_code/
この動画では50のコードが読みやすくなる方法を紹介していて、その中から自分が特になるほどなって思った方法を2点紹介したいと思います。動画がC#で紹介していたのでここで紹介する例もC#で紹介します。
メソッド内で変数を最初に宣言しない
1個目は「メソッド内で変数を最初に宣言しない」です。これに関しては結構驚きでした。プログラム系の参考書を見ると、ソースコードの例で、最初に変数をまとめて宣言して書かれていることが多いからです。
「悪い記法の例」で示したメソッドのような途中でreturnする場合は事前に宣言しておいた変数(filename2)は無駄になります。変数は使用する直前で宣言しましょう。
悪い記法の例
private void badMethod(){
string filename1 = "file1";
string filename2 = "file2";
if(!System.IO.File.Exists(filenmae1)){
//ここで抜けた場合、使用しない変数(filename2)の宣言は無駄になる
return;
}
if(!System.IO.File.Exists(filenmae2)){
return;
}
}
良い記法の例
private void goodMethod(){
string filename1 = "file1";
if(!System.IO.File.Exists(filenmae1)){
return;
}
// 変数は使用する直前で宣言する
string filename2 = "file2";
if(!System.IO.File.Exists(filenmae2)){
return;
}
}
メソッド内のコメントではなくメソッド名で伝える
2つ目は「メソッド内のコメントではなくメソッド名で伝える」です。自分が書いたソースが他の人にも伝わるようにするためについつい、メソッド内に多めにコメントを書いてしまいます。「悪い記法の例」のように処理のたびにコメントを書くのではなく、「良い記法の例」のようにメソッドの上にXMLコメントを書くとすっきりしたコードになります。また、「悪い記法の例」のメソッドの中のforeachの中身のようなパット見ただけじゃ分かりにくいコードはメソッド化して、そのメソッド名でどういう処理をしているのか伝えます。
この方法を見ると、コメントでコードを細かく説明するよりもいかにして、少ない量で別のエンジニアにどういうコードかを伝えることが大事なのかなと思いました。
悪い記法の例
private void badMethod(){
//filename1の中身が存在しないときreturnする
string filename1 = "file1";
var lines = System.IO.File.ReadAllLines(fileName);
if(lines.Length < 1){
return;
}
var products = new List<Product>();
foreach(var line in lines){
//値の上書きはしない
int productId = Convert.ToInt32(line.Substring(0, 2));
string productName = line.Substring(2, 10);
int price = Convert.ToInt32(line.Substring(12, 2));
//productsはここの直前で宣言しているので, 影響チェックが簡単
products.Add(new Product(pproductId, productName, price, 0));
}
.
.
}
良い記法の例
/**
<summary>
ファイルを読んでプロダクトを生成する
</summary>
*/
private void generateProduct(){
string filename1 = "file1";
var lines = System.IO.File.ReadAllLines(fileName);
if(lines.Length < 1){
return;
}
var products = new List<Product>();
foreach(var line in lines){
products.Add(FileLineToProduct(line));
}
.
.
}
/**
<summary>
ファイルの1行をProductクラスに変換する
</summary>
*/
private Product FileToProduct(string line){
int productId = Convert.ToInt32(line.Substring(0, 2));
string productName = line.Substring(2, 10);
int price = Convert.ToInt32(line.Substring(12, 2));
return new Product(pproductId, productName, price, 0);
}
さいごに
今回の学びでリーダブルコード(読みやすいコード)についての理解が深まりました。この読みやすくなる書き方はもっといろいろな方法があると思うので続けて勉強していきたいと思います。