Go言語を一通り学べるgoogle設えのA Tour of Goというチュートリアルをやっている。
Go言語の最大の特徴であるgoroutineやchannelも含めて、Go言語をとりあえずウォークスルーできるから、趣味や仕事でGo言語に入るための第一歩としてとても良い。
しかしながら、このチュートリアルを通して、Go言語自体へのムクムクとした不満が、季節外れの入道雲のように立ち昇ってきた。
それは、省略がヒドいというもの。
Channel
実際に見てみよう。まずは、goroutineやその呼出元の間で値をやりとりするために使われるchannnel。これがロック機能も備えていることで、非同期処理どうしで同期的なロジックを簡単に組み込める素晴らしい仕組みなのだけれど、これを生成する処理が……。
1 |
c := make(chan int) |
出典はA Tour of Goの64番から。
整数型のchannelを作る処理で出てくるchanという文字列はどういうことだろう。cahnnelの省略なのだろうが、chanまで書いたんならnelまで書けばいいじゃない!
こういう中途半端な省略なら、cdやlsよろしく、たった二語でchと省略したほうが短くていい。
Read
お次は、Go言語が標準で提供するReaderインターフェースのReadというメソッド。
この定義を見て欲しい。
1 2 3 |
type Reader interface { Read(p []byte) (n int, err error) } |
p? n? 考え始めると迷宮入りしてしまいそうな一語が引数と返り値に使われている。
レファレンスを読むと、”p”には、Read()メソッドで読み込んだデータを格納し、”n”は、その読み込んだデータの長さを返すのだそう。わからんよな〜。”p”を”buffer”, “n”は”readLength”にしといてくれたらわかるのだけれど……。
何故省略するのだろう?
ただ、ここまで過剰に省略したい気持ちもわかる。
このRead()系のメソッドで、読み込んだデータをバッファーに格納し、読み込めた長さを返すという作法は他の言語でも使われている。
また、インターフェース定義だけ読んでそのメソッドを使うことはなく、その詳細な使い方をレファレンスで把握してから使うだろうということ。
あと、C言語の省略バリバリな作法に倣ったとか。
個人的には、channelといいRead()といい、C言語風な省略作法をなぞった匂いがプンプン感じられて嫌になる。
しっかりレファレンスを読んで、しっかり処理を追えば、変数名が省略されて短くなっていても、何の省略か、どんなデータが入っているかはわかる。
わかるけれど、しっかりしないといけないところがネックで、集中力と短期記憶力を要するから、そういうコードは読んでいて疲れる。
理想を言えば、まるで英文を読んでいるかのように、上から下まで立て板に水を流すかのごとく読めると、ノットストレスフル。
そんな読みやすいコードを書く方法は「リーダブルコード」という本で体系化されていて、これを読む前と後ではコードの読みやすさに雲泥の違いが表れる。
最近のC++コードはそうでもないけれど、ネイティブCなコードは読んでいて目眩がする。
そこまでではないにしろ、goroutineやchannelという革新的な機能を持っているGo言語だけに、名前の省略さえやめればもっと良くなるのになと残念になることしきりだ。
改訂2版 基礎からわかる Go言語
A Tour of Goを終え、次は基礎を固めたい方へ。
2 Responses
もしプログラミング言語がビールだったら | TOACH
[…] ナチュラルCぐらいGo言語の省略がヒドすぎる件について [golang] […]
tenntenn
変数名が短いのはスコープが短い場合ではないでしょうか?
標準パッケージでも、パッケージ変数名やフィールド名は長めにしてあると思います。
参考:https://github.com/golang/go/wiki/CodeReviewComments#variable-names