ファイル内のstatic変数を、操作する関数についての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かりんとう
記事: 7
登録日時: 14年前
連絡を取る:

ファイル内のstatic変数を、操作する関数についての質問

#1

投稿記事 by かりんとう » 14年前

初心者丸出しの質問かもしれませんがよろしくお願いします。

カプセル化というのを知って、さっそくやってみようと思ったのですが、
ファイル内のstatic変数を、操作する時の関数について悩んでしまいました。

例)サウンドノベルのコードでの例ですが

コード:

message.cppファイル
---------------------------------------------


// キーを入力するまで、メッセージ表示を、次に進めないで待つフラグ
true : 待ち状態 |  false : 待ち状態解除

static bool WaitKeyFlag = false;

と、宣言したstatic変数を、操作するときの関数を2つのやり方の内どっちがいいか悩んでいます。

1つ目の方法:

コード:

// WaitKeyFlag に引数のbool型( true  又は false)を代入する関数
void setWaitKeyFlag ( bool hWaitKeyFlag )
{
     WaitKeyFlag = hWaitKeyFlag;
}
として1つの関数を作り、引数で true 又は false を代入する方法
がいいのか、

2つ目の方法:

コード:

// WaitKeyFlag に true を,代入する関数
void setWaitKeyFlag ( void )
{
     WaitKeyFlag = true;
}

// WaitKeyFlag に false を,代入する関数
void unsetWaitKeyFlag ( void )
{
     WaitKeyFlag = false;
}
として、true と false をそれぞれ代入する関数をつくるという方法
がいいのかです。

1つ目の方法は、引数を使う分、メモリを使うかなあと思ったり。
2つ目は、引数を使わない分、処理はこっちのほうが速いかなとは思うものの、
この方法を他のフラグ関係の全部の変数に使うとなると、関数が多くなってコードの量が増えてしまうのではないかなあとも思ったりして悩んでいます。

コードを読んだときのわかりやすさを考えると、
個人的には、1つ目の方法の,setWaitKeyFlag( false );と記載したほうが、
         2つ目の方法のunsetWaitKeyFlag();より
フラグにfalseを代入したことが、見た目的にわかりやすい感じでいいと思うのですが皆さんは、どのような方法でされているのでしょうか?

あと、関数名が長くなってしまいがちなのですが、あまり長い関数名は良くないものなのでしょうか?
関数名の作り方の定石のような物があれば教えてほしいです。

他人から見たらどうでもいい事なのかもしれないのですが悩んでいます。アドバイスよろしくお願いします。

アバター
bitter_fox
記事: 607
登録日時: 15年前
住所: 大阪府

Re: ファイル内のstatic変数を、操作する関数についての質問

#2

投稿記事 by bitter_fox » 14年前

かりんとう さんが書きました: 1つ目の方法:

コード:

// WaitKeyFlag に引数のbool型( true  又は false)を代入する関数
void setWaitKeyFlag ( bool hWaitKeyFlag )
{
     WaitKeyFlag = hWaitKeyFlag;
}
として1つの関数を作り、引数で true 又は false を代入する方法
がいいのか、

2つ目の方法:

コード:

// WaitKeyFlag に true を,代入する関数
void setWaitKeyFlag ( void )
{
     WaitKeyFlag = true;
}

// WaitKeyFlag に false を,代入する関数
void unsetWaitKeyFlag ( void )
{
     WaitKeyFlag = false;
}
として、true と false をそれぞれ代入する関数をつくるという方法
がいいのかです。
僕ならば前者ですね。
というのも、CanPlayerMoveに応じてWaitKeyFlagを変化させるときに前者ならばsetWaitKeyFlag(CanPlayerMove())だけでいいのに対し、
後者なら呼び出し側で

コード:

if (CanPlayerMove())
{
	setWaitKeyFlag();
}
else
{
	unsetWaitKeyFlag();
}
のように書かなくてはなりません。
かりんとう さんが書きました: 1つ目の方法は、引数を使う分、メモリを使うかなあと思ったり。
2つ目は、引数を使わない分、処理はこっちのほうが速いかなとは思うものの、
この方法を他のフラグ関係の全部の変数に使うとなると、関数が多くなってコードの量が増えてしまうのではないかなあとも思ったりして悩んでいます。

あと、関数名が長くなってしまいがちなのですが、あまり長い関数名は良くないものなのでしょうか?
関数名の作り方の定石のような物があれば教えてほしいです。
リソース面の話ですが、そんなに気にするレベルではないと思います。

関数名ですが、後者のようにするのであればもっと直感的なenableWaitKeyやdisableWaitKeyのような名前が適しているかと思います。
関数名の作り方は基本は動詞(+名詞, 形容詞・・・)などの英語に準じた形(V,VC,VO,VOO,VOCなど)になるようにしています。

かりんとう
記事: 7
登録日時: 14年前
連絡を取る:

Re: ファイル内のstatic変数を、操作する関数についての質問

#3

投稿記事 by かりんとう » 14年前

bitter_foxさん丁寧なアドバイスありがとうございます。

1つ目の方法のメリット部分の書き込みは、勉強になりました。
そういう使い方もできるのですね。
リソース部分の不安も気にする必要はないようですね。
あと関数名の表記の仕方もとても勉強になりました。これからはbitter_foxさんのアドバイスされた方法で関数名をつくってみます。

大変参考になりました、ありがとうございました。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: ファイル内のstatic変数を、操作する関数についての質問

#4

投稿記事 by Dixq (管理人) » 14年前

bitter_foxさんの回答はもちろん良いと思いますし、書き方は人それぞれだと思います。
もちろん私もfoxさんの言う通りに実装する時もあります。

しかし私の先輩は、よく「Flagという言葉は使うな」「コードは物語のように書け」と言います。
ザッとコードを読んだ時

1.敵の動きフラグをオフにする
2.敵のショットフラグをオンにする
3.自機のショットフラグをオンにする

のように書かれているより

1.敵が動き始める
2.敵が弾を撃ち始める
3.自機が弾を撃ち始める

と書かれていた方がよりすんなり読めるわけで「物語」になっているので、知らない人がコードを読んでも読みやすいわけです。
あちこちでありとあらゆるフラグがオンオフになっていると、大規模になってくると訳が分からなくなることがあります。
関数の実装の仕方に関しても

void setWaitKeyFlag ( bool hWaitKeyFlag )



「WaitKeyFlagの状態を引数の状態にセットする」

のように読んでしまうので物語になりにくくなります。
そういう意味では、分けた方が自然な読みやすさになります。

引数が1つあるからメモリが云々は全く気にしないで下さい。
そんなことがボトルネックになることはまずないです。

もし1ループに数万回もコールされる可能性があるような関数ならinline化するなり、参照渡しにするなり、マクロ化するなり、高速化する為の検討が必要になってきますが、
まずは可読性を最大限優先して良いと思います。
コードが読みやすくしっかりしていれば、後からチューニングする時も楽に行えると思います。

また、C++で書かれているかどうかわかりませんが、カプセル化ということで・・messageクラスは更に細分化していいように見えます。
Key入力があるまで待つだけのクラスがあっても良いかと。
それならば
WaitKey.enable();
WaitKey.disable();
の2つの関数があればよく(状態を聞く関数もいりますが)シンプルに実装出来そうで、関数名に悩むこともなさそうです。
そうなるとクラス名はWaitKeyじゃなくなりそうですが・・。

かりんとう
記事: 7
登録日時: 14年前
連絡を取る:

Re: ファイル内のstatic変数を、操作する関数についての質問

#5

投稿記事 by かりんとう » 14年前

アドバイスありがとうございます。
Dixq (管理人) さんが書きました:しかし私の先輩は、よく「Flagという言葉は使うな」「コードは物語のように書け」と言います。
ザッとコードを読んだ時

1.敵の動きフラグをオフにする
2.敵のショットフラグをオンにする
3.自機のショットフラグをオンにする

のように書かれているより

1.敵が動き始める
2.敵が弾を撃ち始める
3.自機が弾を撃ち始める

と書かれていた方がよりすんなり読めるわけで「物語」になっているので、知らない人がコードを読んでも読みやすいわけです。
なるほどー、いままで「自分がわかりやすいコード」を書いていましたが、
「知らない人がコードをよんでも読みやすいコードを書く」という意識が欠けていました。

プログラムスキルとして「誰が見ても読みやすいコード」をかける方がいいに決まっていますよね。
これからは、そういう作り方をしていくようにします。
Dixq (管理人) さんが書きました:あちこちでありとあらゆるフラグがオンオフになっていると、大規模になってくると訳が分からなくなることがあります。
確かにそうですね。今は頭の中に入っているのでいいですが、時間がたつにつれ忘れたり、大規模になってきたりするとわかりづらくなりそうですね。
Dixq (管理人) さんが書きました:また、C++で書かれているかどうかわかりませんが、カプセル化ということで・・messageクラスは更に細分化していいように見えます。
最初はC++で全ての処理を、クラスで作っていたのですが、まだ未熟で完成したときには構造がわかりにくく、
把握しにくいプログラムになってしまいました。
なので今は、クラスをできるだけ少なくして、ファイルの中でstatic変数を関数で処理する方法で進めていこうと思っています。
Dixq (管理人) さんが書きました:Key入力があるまで待つだけのクラスがあっても良いかと。
その方がわかりやすいですね。

大変貴重な情報をありがとうございました。
自分で検索して探しても、こういう細かで具体的な情報ってなかなか見つからなかったのでとてもありがたいです。
こういう貴重な場を作ってくれた管理人様と皆様に感謝です。

閉鎖

“C言語何でも質問掲示板” へ戻る