日経ソフトウェア7月号の特集を読んだ感想

日経ソフトウェア7月号の特集「そのコードは古い!」を読んだ感想。

これとは別の技術書を書店まで買いに行きました。

そこで日経ソフトウェアを手に取りました。

いつもは、日経ソフトウェアを書店でパラパラ目を通す程度です(エンジニアに端くれかみたいな感想は兎も角) ただ、今回は特集のタイトルに惹かれて買ってじっくり読んでみました。

なので、特集に限って読んだ感想というメモを残します。 あくまで、私めの意見というか感想なので・・・スルーしていただけると。

C言語編


point1「void mainはやめよう」とありますが、これは入門書のサンプルが諸悪の根源かと思います。
自分がC言語を学習したときは、普通にvoid mainで教わりました。
当時は、Unix/Linuxの知識も無いので当たり前ですし、戻り値が、intになっていてもおまじない程度の認識でした。

なので、intの意味まで教えてあげるべきかなーと思います。(特に初学者に対してですが)
こうやって、サンプルコードとして教えてあげればいいかなーとか思いました。(これなら処理が正常終了していることが明確になるかと)

1
2
3
4
5
6
7
#include<stdio.h>
#include<stdlib.h>

int main(void){
 printf("Hello world");
 return EXIT_SUCCESS;
}

以下のものは当たり前の話かなーと思いました。

  • point2「文字定数にchar型は使わない」(関数同士で受け渡す際はint型に変換されるから)
  • point3「古い関数定義はやめよう」(K&Rの記述方法。本を読めば分かります)
  • point4「gets関数は古い」(確保された領域以上のものが入力されたらバッファオーバーフローになっちゃうから)
  • point5「switch文あり気で考えない」(これはどの言語でも言える話で、コードが見づらくなっちゃう上に、break文忘れるとバグになってしまう)
  • point6「何でも#defineで定数や関数マクロを定義するのは古い」(コンパイル時の型チェック等スルーする上、関数マクロは記述ミスをしやすくなるから)
  • point7「定数の羅列に#defineは古い」(意味のある連続したものだとenum使ったほうが便利ですね)
  • point8「ポインタサイズでメモリを確保しない」(ポインタ型とデータ型は処理系によってサイズが違うから)

point8の良くないコードは以下のもの

1
2
double *d
d = (double *)malloc(sizeof(d)*100)

良いコードは以下のもの

1
2
double *d
d = (double *)malloc(sizeof(*d)*100)

書いて思ったけど、普通のことだな。。。

java編


お仕事柄メイン(?)で使ってたので・・・

  • point1「C言語で主流だったハンガリアン記法は古い」
  • point2「スネークケースは使わない」
  • point3「メソッドの先頭に変数宣言を並べるのは古い」
  • point4「エラー種別をintで返さない」
  • point5「処理結果を引数に格納しない」

このあたりはCの悪癖なんで、マジ勘弁して下さい・・・。
コードレビューにこんなコード出してきたら速攻Rejectしちゃいますよ。。。
poin4は、Exceptionをthrowすればいいのでなんとかなります(尤もjniに依存するようなコードだと考えてもいいかなーなんて個人的には考えてしまいます)
point5なんか副作用が山盛りなコードになりますしね。

気を取り直して・・・。

  • point6「ジェネリクスを使用しないコードは古い」(リストを型安全にできますよねー。キャスト地獄はヤダー)
  • point7「定数インターフェースは古い」(static importとか、定数の機能分割をやるでしょ)
  • point8「意味のない定数値は書かない」(enumにしろって話。これもC言語の定数定義の話と同じですね)
  • point9「finally句でcloseするのは古い定石」(java7以降だとそうですね。java6までだとこの定石を使いましょう)
  • point10「ジェネリクスで型を省略しないのは古い」(point6と矛盾してるような感じですが、こちらはjava7の話で俗にダイヤモンド演算子と呼ばれるもの)
  • point11「ファイルの読み込みには数行も使うな」(java7以降に限る話です。java6までは従来道理の読み込み処理を書きましょう)
  • point12「定番ライブラリはApacheCommonsだけではない」(それもそうだよねーって話。ジェネリクス非対応だったり、流れるようなインターフェースもなかったりだし)
  • point13「Listからある条件に一致した要素を取り出す際、for文を使うのは古い」(filterメソッドを使ったらいいよってこと。因みにGroovy使えって言ったらダメ?)

point9で言ってるjava7での新しい定石「close句の省略」

1
2
3
4
5
6
try ( FileReader in = new FileReader("hoge.txt");
    BufferdReader br = new BufferedReader(in);{
    // 詳細な処理
}catch(Exception e){
    // 例外処理
}

point10のダイヤモンド演算子

1
List<String> list = new ArrayList<>();

point11のファイル読み込み処理(Filesクラスが便利になった)

1
Files.readAllLines("hoge.txt",Charset.defaultCharset());

因みに、従来の長い処理(途中の前後を省略)

1
2
3
4
5
BufferdReader br = new BufferedReader(in);
String line;
while((line = br.readLine()) == null){
    // 読み込んだときの処理
}

javascript編


思うところというよりも・・・
HTML5といいJQuery,CoffieScript,Dart等、言語の発展が最近めざましいと個人的に思ってます。
そのため、感想というよりもこうするのが最近のトレンドだよねーみたいな感じでした。

  • point1「HTMLのform要素に処理を埋め込むのは古い」(特殊な事をしなければ、HTML5で事足りることが増えてきたと思う)
  • point2「ロールオーバにa要素を使っているのは古い」(ブラウザのサポートに依るのは?と思った。SE/SIerなところだと未だにIE6でみたいなことがまかり通るし、一概に古いと断言するのはどうかと思った。)
  • point3「JavaSriptライブラリを使わないのは時代遅れ」(これはそうかなーと思う。実際にjQueryは使いますし。)
  • point4「jQueryを使わないコードは古い」(古いと断言するのは、どうかと思うが使うほうが楽できる。コラムにあったけど万能ではないね。特にIEが絡むとなると途端に辛くなる)
  • point5「HTML5のAPIを使わないと時代遅れ」(新規に書く場合ならHTML5を使っていき、補助(Flashがやってたとことか)でJSを使うのがいいのかなーと思う)
  • point6「多言語の助けを借りる」(DartとかTypeScriptかな。得手不得手があるので適材適所で使えばいいと思う。jsとかで書きづらいところはサーバサイドJavaとかでやってもいいわけだしね)

C#編


自分が、C#を現在進行形で勉強中なので、感想が出てくるより先にこう書けばいいのかー。
なんてことを思いました。
サンプルのあるのが全てではないよ~的な感じですね。

Ruby編


これは、好きな言語

  • point1「大量の引数が必要な際ハッシュオブジェクトを利用するのは古い」(このテクニック自体は好きだけど、ハッシュキーが無かったら大惨事になることがありますね)
  • point2「配列のグループ分けを長々と書くのは古い」(1.8系に限らず、1.9系でも思わずやってしまいそうな処理がコード例だった。chunkメソッドで配列のグループ分けができるのか)
  • point3「配列からランダムに値を抽出する際delete_atメソッドは古い」(samplingって意味から作ったっぽいsampleメソッドを使用すればランダムに値を抽出できる)
  • point4「テストフレームワークは1つと考えるのは古い」(要するに適材適所。RSpecとTestUnitの両方を併用(てテスト範囲なり、記述方法なり、assertなり)してテストをすればいいと個人的に思ってる)
  • point5「execコマンドでjavaのクラスを読み込むのは古い」(一々、外出しにしたjavaを読み込む何かの実行ファイルを作成する必要はなく、JRubyを使えばいいよって話。割りと普通かと思ってた)

point1はRuby2.0で導入されたキーワード引数でデフォルト値を設定すればいいですね。

1
2
3
4
5
6
def keyword(hoge:0,fuga:"fugafuga")
    puts #{hoge}
    puts #{fuga}
end

keyword hoge:10 fuga:"hogehoge"

point2の配列のグループ分け(偶数のものと奇数のもを分ける)

1
[1,2,4,7,9].chunk{|a| a.even?}.each{|k,v| puts "#{k} #{v}"}

point3の配列からランダムに値を抽出する

1
[1,2,4,7,9].sample(2) #-> [4,9]

point5のJRubyで実行する話(Jythonとかも似たような感じですね)

1
2
3
4
5
require 'java'
import 'java.lang.System'

puts "hogehoge"
System.out.println("fugafuga");

特集を読んだ感想は以上かなー。 なんとなく、書籍のサンプルがアレな時があるって感じじゃねーの?みたいな感想でごめんなさい。