C++開発に日本語を試した結果について
この記事は、C++ (fork) Advent Calendar 2013 14日目の記事になります。
カレンダーを読んでる人はそろそろ、息抜き記事が続いてガチなC++の話題が欲しくなった頃ではありませんか?
と言うことで今回はガチな息抜きエントリーです。
(普段の読者の方へ:ゲームは今朝公開しました)
forkじゃ無い方は26日に多分C++開発の嵌まりポイントについて書く予定ですが、最も嵌った部分が独立して書けそうなので、そこについて書きます。
・日本語
C++03からC++11の変更では、例えばlambdaやrvalue等のように設計方針にも影響を与える変更の他に、
範囲forやautoなど設計レベルの影響はそこまで大きくないがコードの可読性を向上させるsyntax sugar的な変更がありました。
範囲forやauto、using等は旧来の手法のほぼ上位互換みたいな存在なのであまり深く考えずに使っても問題は無く普通に使われているように思います。
しかしながら日本語が使えるようになった事はあまり認識されていない上、活用されていないようです。
(C++関連のブログのサンプルコード調べ)
使える文字の数が相当増えるので、表現力が上がり便利になるに決まってるのになぜ使われないのか?
ということで、ものは試しと実際の開発で使ってみた感想を書きます。
※個人の感想であり、効果は個人差があります
・どこで使うか
参考:
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#lex.name
日本語が使えるかはコンパイラの実装依存とあるような気がしましたが、普通は大丈夫でしょう。
追記:
そもそもユニバーサル文字名が使えないと規格準拠ではないため、普通に考えるとUnicodeは使えるはず。無論ShiftJIS等で保存している場合はコンパイラによります。
wandbox:
http://melpon.org/wandbox/permlink/XFAIKASAHmKDei4h
と思ったけどclang3.3以上なら実行可能で、gccはエラー出ました。
clangはcでも行ける(using int消して試せます)。全く関係ないですがgitを使う場合も結構文字コードが問題になる場合がありました。wandboxってunicodeになってないんだろうか?正直良くわかりません><
日本語は識別子に使えるつまり、変数、列挙子、関数、仮引数、クラス、namespace等、使用範囲はかなり広い。
範囲forやautoとは比較になりません。
Cプリプロセッサにも使えたので、あまり深く考えずに出来るだけ使う方針にすると最悪こうなる。
・無計画に使う
全部日本語にすると分かりにくいコードが簡単に書けてしまう。
Unicode空白文字等がコンパイラで実装されていれば、さらにやばいコードが書けるかもしれません。
日本語を使うのをためらっている人は、こういうイメージを持っているのかもしれません、無制限で使うのは辞めましょう。
(最初からコードをwandboxに置いた方が息抜き記事としての完成度が高かったと思うと残念に思う。)
・変数
利点・
変数に日本語を使うメリットは、可読性と書きやすさを上げるためでしょう。
まず英語で変数名を付ける場合、英単語がスラスラ出ない場合、辞書等で調べる必要があります。
また今回の例だとdeffenceとtypoしてますが、英語だとわりと気付きにくいです。
若干恣意的な例ですが、省略無しでインデントを揃えやすくなる等の効果もあります。それから基本的にコメントが不要になって、可読性も大体の場面で向上します。
欠点・
IMEの切り替えが多少面倒で、IDEによってはコード補完が微妙でこの場合だとkと打っても攻撃力を察してくれ無いことが多いと思います。
英語のようにis○○みたいなプレフィックスを付けたい場面で、日本語は表現しにくいです。
また外来語等をカタカナで書く場面は違和感があるかもしれません。
他には英語の場合どう省略するかで表記がゆれないように決める必要があるように、日本語の場合も書き方がバラバラにならないように、よく使う単語はその辺りを決めておく必要があります。
・列挙型
例のように列挙子にローマ字を使う場面では、日本語を使用するべきです。
それ以外の場合は、日本語でも英語でも分かりやすい方を使うと良さそうです。
同じ列挙型に日本語の列挙子と英語の列挙子を混ぜるのは違和感があるので、避けたほうが良さそうですが、列挙型名を英語にして列挙子を日本語にするのはそこまで違和感はありませんでした。
・関数
※コードが綺麗に表示されない関係で山括弧を一部全角にしています
日本語を一番上手く使える箇所は引数です。
引数の場合、日本語でも英語でも呼び出し元が書くコードは変化しないので、デメリットが殆どありません。
IDEの引数のヒント表示などで、英語と日本語が交互に来るので、何番目の引数の型が何か等はかなり読みやすくなります。
また宣言と定義で引数名は別に出来るので、宣言が日本語引数名のファイルと、英語引数名のファイルを配布するといった事もC++では可能です。(templateの場合IDEのヒント表示の仕様によります)
引数は変数に比べて具体的で説明的な名前になる事が多く、日本語はそういった場合に表現力が英語に比べて優れており、簡潔に書くことが出来ます。
さらにコメントの量をかなり減らせます。doxygenでコード自動生成させようとコメントを付けたけど途中で面倒になって辞めてしまった人は多いと思われます。
欠点は引数名に日本語を使う場合、全ての引数を日本語に統一したいので、今回の例で言うとDrawのx,yなど日本語でも英語でも対して可読性が変わらない場面で少し入力が面倒に感じるぐらいでしょうか。
関数名に日本語を使うのは微妙です、今回の例だと関数名は英語にして引数名を日本語にしました。
関数はGet等のプレフィックスを使いたい場面が多くて、全て日本語に統一するのが難しく。具体的な名前と言うより抽象的な名前になるので、一般的な英単語を使う事が多いため、日本語にするメリットが薄いと感じます。
テスト用のメソッドなどの場合は日本語にしても良いのですが、中途半端に使うぐらいなら全面禁止でも良いかもしれません。
・クラス
例のImageを画像とするのは良くない例になります。
引数に使われそうなクラス名を日本語にすると、英語と日本語が交互に来ることで可読性が向上する日本語引数のメリットが薄れる事があるのがまず一点。
もう一つは「画像を内部で保持して操作する」クラスと訳するのが正しかったので、Imageでも画像でも誤訳になるからなのか、日本語の方が違和感が強くなります、抽象的な意味のクラスは英語の方がいい感じでした。
クラス名を日本語にした方が分かりやすい場合もあります、例えばEnemyクラスを継承してキングスライムと言う名前の敵を作りたい場合等、クラス名が具体的な場合日本語名の方が分かりやすいです。
またキングスライムクラスのようなクラスは引数の型に使われないのも重要です。
・namespace
名前空間に日本語を使うのは殆ど試してませんが、あまりメリットは感じませんでした。
・まとめ
※個人の感想であり、効果は個人差があります
引数に日本語を使うのはかなり良い、英語で書く意味がある場合を除いて日本語にするべき
他の識別子と違い、全ての引数を日本語に統一するのも自然に出来る
引数は全て日本語、他の識別子は全て英語はベストではないかもしれないけどベターな方法だと思う
列挙子はデメリットが少ないので日本語を使いやすい。ローマ字を日本語にするのは基本。
変数は統一が難しいので、規約で使用範囲を決めないと辛い。いっそ禁止して、日本語を見たら引数だと判断出来るようにするのも良い。そうするとメンバー変数とコンストラクタの引数が被って云々もなくなる。
関数やクラスも統一が難しいので、ちゃんとした規約が必要。関数はいっそ禁止しても良いが、クラス名は使いたい場面もあるように感じた。
名前空間はどっちでも良いと思う。
日本語入力はGoogleIMEが便利。
オフショアしそうな場合や、社内公用語が英語な場合等は知りません。
普段の読者層を無視してC++の記事を書くつもりだったけど、プログラムが分からない人でもなんとなく言ってる事が分かるような分からないような内容になったと思います。
日本語識別子には文法のように正解はありません(文法もたまに改定されるけど)、もっと良い方法があるかもしれませんので、もっと議論されると良いと思います。
今まで日本語識別子を試した事が無い人は、一回試してみるのはどうでしょうか?
自転車操業的に続いているC++ (fork) Advent Calendar 2013 は日本語の記事で終わらないと信じて!
カレンダーを読んでる人はそろそろ、息抜き記事が続いてガチなC++の話題が欲しくなった頃ではありませんか?
と言うことで今回はガチな息抜きエントリーです。
(普段の読者の方へ:ゲームは今朝公開しました)
forkじゃ無い方は26日に多分C++開発の嵌まりポイントについて書く予定ですが、最も嵌った部分が独立して書けそうなので、そこについて書きます。
・日本語
C++03からC++11の変更では、例えばlambdaやrvalue等のように設計方針にも影響を与える変更の他に、
範囲forやautoなど設計レベルの影響はそこまで大きくないがコードの可読性を向上させるsyntax sugar的な変更がありました。
範囲forやauto、using等は旧来の手法のほぼ上位互換みたいな存在なのであまり深く考えずに使っても問題は無く普通に使われているように思います。
しかしながら日本語が使えるようになった事はあまり認識されていない上、活用されていないようです。
(C++関連のブログのサンプルコード調べ)
使える文字の数が相当増えるので、表現力が上がり便利になるに決まってるのになぜ使われないのか?
ということで、ものは試しと実際の開発で使ってみた感想を書きます。
※個人の感想であり、効果は個人差があります
・どこで使うか
参考:
http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#lex.name
日本語が使えるかはコンパイラの実装依存とあるような気がしましたが、普通は大丈夫でしょう。
追記:
そもそもユニバーサル文字名が使えないと規格準拠ではないため、普通に考えるとUnicodeは使えるはず。無論ShiftJIS等で保存している場合はコンパイラによります。
wandbox:
http://melpon.org/wandbox/permlink/XFAIKASAHmKDei4h
と思ったけどclang3.3以上なら実行可能で、gccはエラー出ました。
clangはcでも行ける(using int消して試せます)。全く関係ないですがgitを使う場合も結構文字コードが問題になる場合がありました。wandboxってunicodeになってないんだろうか?正直良くわかりません><
日本語は識別子に使えるつまり、変数、列挙子、関数、仮引数、クラス、namespace等、使用範囲はかなり広い。
範囲forやautoとは比較になりません。
Cプリプロセッサにも使えたので、あまり深く考えずに出来るだけ使う方針にすると最悪こうなる。
・無計画に使う
#define もしも if
#define 違う else
#define 足す +
#define 大きい >
#define 1 1
#define 2 2
#define 3 3
#define は =
#define 表示する printf
using 整数 = int;
int main()
{
整数 数字 は 2 足す 1;
もしも( 数字 大きい 3)
{
表示する("大きい");
}違う{
表示する("小さい");
}
}
全部日本語にすると分かりにくいコードが簡単に書けてしまう。
Unicode空白文字等がコンパイラで実装されていれば、さらにやばいコードが書けるかもしれません。
日本語を使うのをためらっている人は、こういうイメージを持っているのかもしれません、無制限で使うのは辞めましょう。
(最初からコードをwandboxに置いた方が息抜き記事としての完成度が高かったと思うと残念に思う。)
・変数
int power;
int deffence;
int speed;
int 攻撃力;
int 防御力;
int 素早さ;
利点・
変数に日本語を使うメリットは、可読性と書きやすさを上げるためでしょう。
まず英語で変数名を付ける場合、英単語がスラスラ出ない場合、辞書等で調べる必要があります。
また今回の例だとdeffenceとtypoしてますが、英語だとわりと気付きにくいです。
若干恣意的な例ですが、省略無しでインデントを揃えやすくなる等の効果もあります。それから基本的にコメントが不要になって、可読性も大体の場面で向上します。
欠点・
IMEの切り替えが多少面倒で、IDEによってはコード補完が微妙でこの場合だとkと打っても攻撃力を察してくれ無いことが多いと思います。
英語のようにis○○みたいなプレフィックスを付けたい場面で、日本語は表現しにくいです。
また外来語等をカタカナで書く場面は違和感があるかもしれません。
他には英語の場合どう省略するかで表記がゆれないように決める必要があるように、日本語の場合も書き方がバラバラにならないように、よく使う単語はその辺りを決めておく必要があります。
・列挙型
enum class EnemyImage
{
Suraimu,//スライム
Oogarasu,//おおがらす
Ooarikui,//おおありくい
Ikkakuusagi,//いっかくうさぎ
Total,//合計
};
enum class 敵画像
{
スライム,
おおがらす,
おおありくい,
いっかくうさぎ,
合計数,
};
例のように列挙子にローマ字を使う場面では、日本語を使用するべきです。
それ以外の場合は、日本語でも英語でも分かりやすい方を使うと良さそうです。
同じ列挙型に日本語の列挙子と英語の列挙子を混ぜるのは違和感があるので、避けたほうが良さそうですが、列挙型名を英語にして列挙子を日本語にするのはそこまで違和感はありませんでした。
・関数
class Image
{
public:
bool Draw(int x , int y);
/// <summary>回転軸等を指定してImageを描画</summary>
/// <param name="posX">描画座標X</param>
/// <param name="posY">描画座標Y</param>
/// <param name="axisX">回転軸X</param>
/// <param name="axisY">回転軸Y</param>
/// <param name="zoomRate">拡大率</param>
/// <param name="angle">回転角度</param>
/// <param name="isReverse">左右反転フラグ</param>
bool DrawRotateAxis(int posX, int posY, int axisX, int axisY, double zoomRate, double angle, bool isReverse);
}
/// <summary>範囲内の乱数を取得</summary>
/// <param name="mix_inclusive">以上</param>
/// <param name="max_exclusive">未満</param>
int GetRand(int min_inclusive, int max_exclusive);
class 画像
{
public:
bool 描画(int 座標X, int 座標Y);
/// <summary>回転軸等を指定してImageを描画</summary>
bool 軸指定回転描画(int 描画座標X, int 描画座標Y, int 回転軸X, int 回転軸Y, double 拡大率, double 回転角度, bool 左右反転フラグ);
}
/// <summary>範囲内の乱数を取得</summary>
int 乱数取得(int 以上, int 未満);
※コードが綺麗に表示されない関係で山括弧を一部全角にしています
日本語を一番上手く使える箇所は引数です。
引数の場合、日本語でも英語でも呼び出し元が書くコードは変化しないので、デメリットが殆どありません。
IDEの引数のヒント表示などで、英語と日本語が交互に来るので、何番目の引数の型が何か等はかなり読みやすくなります。
また宣言と定義で引数名は別に出来るので、宣言が日本語引数名のファイルと、英語引数名のファイルを配布するといった事もC++では可能です。(templateの場合IDEのヒント表示の仕様によります)
引数は変数に比べて具体的で説明的な名前になる事が多く、日本語はそういった場合に表現力が英語に比べて優れており、簡潔に書くことが出来ます。
さらにコメントの量をかなり減らせます。doxygenでコード自動生成させようとコメントを付けたけど途中で面倒になって辞めてしまった人は多いと思われます。
欠点は引数名に日本語を使う場合、全ての引数を日本語に統一したいので、今回の例で言うとDrawのx,yなど日本語でも英語でも対して可読性が変わらない場面で少し入力が面倒に感じるぐらいでしょうか。
関数名に日本語を使うのは微妙です、今回の例だと関数名は英語にして引数名を日本語にしました。
関数はGet等のプレフィックスを使いたい場面が多くて、全て日本語に統一するのが難しく。具体的な名前と言うより抽象的な名前になるので、一般的な英単語を使う事が多いため、日本語にするメリットが薄いと感じます。
テスト用のメソッドなどの場合は日本語にしても良いのですが、中途半端に使うぐらいなら全面禁止でも良いかもしれません。
・クラス
例のImageを画像とするのは良くない例になります。
引数に使われそうなクラス名を日本語にすると、英語と日本語が交互に来ることで可読性が向上する日本語引数のメリットが薄れる事があるのがまず一点。
もう一つは「画像を内部で保持して操作する」クラスと訳するのが正しかったので、Imageでも画像でも誤訳になるからなのか、日本語の方が違和感が強くなります、抽象的な意味のクラスは英語の方がいい感じでした。
クラス名を日本語にした方が分かりやすい場合もあります、例えばEnemyクラスを継承してキングスライムと言う名前の敵を作りたい場合等、クラス名が具体的な場合日本語名の方が分かりやすいです。
またキングスライムクラスのようなクラスは引数の型に使われないのも重要です。
・namespace
名前空間に日本語を使うのは殆ど試してませんが、あまりメリットは感じませんでした。
・まとめ
※個人の感想であり、効果は個人差があります
引数に日本語を使うのはかなり良い、英語で書く意味がある場合を除いて日本語にするべき
他の識別子と違い、全ての引数を日本語に統一するのも自然に出来る
引数は全て日本語、他の識別子は全て英語はベストではないかもしれないけどベターな方法だと思う
列挙子はデメリットが少ないので日本語を使いやすい。ローマ字を日本語にするのは基本。
変数は統一が難しいので、規約で使用範囲を決めないと辛い。いっそ禁止して、日本語を見たら引数だと判断出来るようにするのも良い。そうするとメンバー変数とコンストラクタの引数が被って云々もなくなる。
関数やクラスも統一が難しいので、ちゃんとした規約が必要。関数はいっそ禁止しても良いが、クラス名は使いたい場面もあるように感じた。
名前空間はどっちでも良いと思う。
日本語入力はGoogleIMEが便利。
オフショアしそうな場合や、社内公用語が英語な場合等は知りません。
普段の読者層を無視してC++の記事を書くつもりだったけど、プログラムが分からない人でもなんとなく言ってる事が分かるような分からないような内容になったと思います。
日本語識別子には文法のように正解はありません(文法もたまに改定されるけど)、もっと良い方法があるかもしれませんので、もっと議論されると良いと思います。
今まで日本語識別子を試した事が無い人は、一回試してみるのはどうでしょうか?
自転車操業的に続いているC++ (fork) Advent Calendar 2013 は日本語の記事で終わらないと信じて!
スポンサーサイト