涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

usingディレクティブをファイルスコープで使わないでほしい

言語の入門時、コンソールに文字列を出力することにより、プログラムの動きを確かめていきます。一般的にC++ではコンソール出力のために"iostream"の"std::cout"を利用します。

C++
#include <iostream>

using namespace std;
 
int main() {
    cout << "Hello, world!" << endl;
    return 0;
}

しかし、この"std::cout"を使用するにあたって、許せないことがあります。それは、殆どの入門書籍、入門サイトで、当たり前のように、おまじないのように、usingディレクティブを使用して教えていることです。

using namespace std;  // ←お前だよ、お前


これは悪しき習慣です。なんのために名前空間があるのかって、名前の衝突を避けるためにあるのです。usingディレクティブは、せっかくの衝突を避ける仕組みをぶち壊すために存在します。そりゃ、確かに"std::"の5文字をいちいち書くのは苦痛かもしれません。冗長に見えるかもしれません。

    // usingディレクティブを使う
    cout << "Hello, world!" << endl;
    // usingディレクティブを使わない
    std::cout << "Hello, world!" << std::endl;


だからと言ってファイルスコープはねーだろ!というお話でございます。

#include <iostream>

int main() {
    using namespace std;  // ←メソッド内のスコープなら許せなくもない
    cout << "Hello, world!" << endl;
    return 0;
}


特に、ヘッダーファイルでusingディレクティブなんて使わないで頂きたいです。私が経験豊富なプログラマーであれば、胸を張って「絶対使うな!」と書くところです。私のような、名前空間を2層にも3層にも重ねてしまう奴のプログラムを相手にすることなってしまったとしてもです。


#includeを"おまじない"と言うとか、「変数は箱だ!」とかいう全然違うのメタファを用いるとか、その場の教えやすさのために後々に混乱するような教え方は、好みではないのです。ポインタが理解できない理由なんて、8割が始めに適当な教え方をしたせいだと思います。私が入門サイトを作るとしたら、その辺りから真っ向勝負で教えます。


今は気にしなくて良い部分を割愛する利点も分かるのですが、やはり「ここは後から出てくるからね」みたいな教え方をするより、1つ1つ時間をかけてでも丁寧に教えて、常に疑問点を潰しておき、始めから高品質とされるコードで教えていった方が、長期的に見て良いと思うのです。そういう点で"苦しんで覚えるC言語"が好きです。
苦しんで覚えるC言語


ではでは。