私のプログラムの書き方

どうも!Senkokusyaです。

最近、とてもありがたいことにさまざまな企業の方に私の作ったゲーム、プログラムを見てもらう機会を頂き、アドバイスを多く頂きます。
しかし、反面多くの方からアドバイスを頂く分、人によって言うことが全然違うんですよね。当然のことなんですけど。
主に[プログラムの命名規則]周りのことを言われることが多く、

・変数名は省略できるものは省略しろ~
だの
・判定の関数名の最初にIsをつけないとは何事だ
だの言われます。

とてもありがたいことなのですが、大体そういう場って私から何かを言えるタイミングがなくて[むむむむ]って思ったままその場は終わってしまうんですよね。
というわけで、私の書き方を理由も含めてここに記しておこうと思います。
また、かなりの長い記事になることが予想されます。目次とか使って、見たいところだけ見ることをお勧めします。

1.前置き

あらかじめ書いておきますが、絶対に意見がある人はいると思います。
又、私は[この書き方じゃないとプログラムは絶対に書かない!]とかそういうことを一切言うつもりもありません。
あくまで学生の身で、私が書きたいように書いているので会社に入った場合は勿論そのルールに適応していくつもりです。そのことを踏まえたうえで見ていただきたいです。

私の中でルールとしていることがあるとすれば、
1.追加しやすい。
2.元をたどりやすい。
ですかね。

2.クラス宣言編

始めに宣言周りです。

1.書き順

私がクラスの宣言を書く時基本この流れで書きます。

全体の書き順としては
1.private定数
2.private変数
3.public関数
4.private関数
の順番で自分は書きます。

ここも人によって流れが違うと思います。
最初にpublicな関数を書く人もいれば、最後に定数を書く人もいる。なぜこの書き方で書いているのか。それは

書きやすいからです。

以上。
重なりますが、異論は認めます。

2.命名規則

上の画像の切り取りになります。

用語を並べて簡単に言うならば
・識別する文字は小文字。
・その次の文字からはアッパーキャメルケース。
で書くことにしています。

識別する文字というのはメンバ変数には[m]、メンバポインタ変数は[mp]で書くことにしています。
理由は区別しやすいからです。

定数は画像にはありませんが全部大文字のスネークケースで書いています。

3.関数名

上の画像の切り取りです。

基本的にはコンストラクタ、デストラクタは変数がある場合は空白でも実行ファイルに書くことにしています。
順序としては
1.コンストラクタ類
2.どのクラスにもあるような関数(初期化や更新、描画など)
3.そのクラスにしかない関数(移動関数や値増加の関数)
4.変数のアクセサ
の順番で書くようにしています。

4.基底クラス

新しい画像です。
順番的に後のほうがわかりやすいと思ったので、下に持ってきました。

基本的にはprotected宣言は使用していません。
とある企業の方に[protected知らないの?]的なことを言われましたが、あえて使っていません。
理由としてはカプセル化を破壊する考え方だと、私は考えているからです。
(簡単に説明すると、親クラスで宣言したアクセス権protectedの変数[a]を派生先で書き、赤の他人が派生クラスでaを気づかないまま宣言すると、エラーが吐かれないまま処理が通ってしまう。)
なので、変数及び定数ごとにアクセサを作成しています。
異論は認めます。


3.実行ファイル編

次いで、実行ファイルです。
こちらは画像が長くなってしまうので、都度画像を貼ります。

1.コンストラクタ、デストラクタ

基本的には何も書くことがなかったとしてもデストラクタは書いています。
また、メモリの動的確保を行う場合は基本的にはコンストラクタでメモリの確保を行っています。
理由は書くオブジェクトの初期化処理で生成してしまうと、初期化を各順番によってはポインタの保存のタイミングでエラーが起きてしまうことがあるからです。
なので、確保をするものは一か所に固定し、ポインタなどを渡す場合は初期化の処理で行うことにしています。

2.基本的な書き方

ここは特に言うことはありません。

3.関数の呼び出し

基本的にはポインタ変数にはアロー演算子を使用します。これはみんな共通だと思いますが、自分自身の関数にもthisを付けます。俗にいう[thisポインタ]ですね。
理由としては[どこから呼ばれてるかわかりやすい]からです。これは後で解説します。

4.private関数及び基底クラスの関数の呼び出し

privateな関数については最初のコメントで記載することにしています。
基底クラスの関数の呼び出しに関しては、スコープ解決演算子をつけて呼び出しています。これの理由としては先ほど挙げた通り[どこから呼ばれているのかわかりやすくするため]です。
これは主にライブラリなどの関数と区別をつけたり、どこのクラスで宣言されている関数なのか見分けるためです。
また、どのクラスから呼ばれているのかわからなくなるのを防ぐという点にもつながりますが、名前空間の省略もなるべくしないような設計にしています。

以上が大体の私のプログラムの書き方になります~

ではでは。


この記事が気に入ったらサポートをしてみませんか?