よりよいソースコードはどっち? – 固定ページ 3 – プログラミング – Home

よりよいソースコードはどっち?
 
通知
すべてクリア

[解決済] よりよいソースコードはどっち?

固定ページ 3 / 5

PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

goto文に関しては何処にでも飛べるので使いこなすのに
センスとか能力が必要と言う話もわかるのですけれど、
continue文に関しては使いこなせないと駄目なのではと思います。
確かに慣れないと追いにくいと言うのはあるんでしょうけれど、
gotoと違って跳び先が限定されているのでスパゲッティプログラムには
なら無いと思いますし。

私は、皆で共有するソースは、
「単純、素直」が良い
と思っているので、基本的なスタイルはAみたいになるかなと。
今まで比較的よく見るルールに
「3項演算子を使わないと言うのがあります。」
これに関しても代替の解りやすい表現法がありますし、
ソースを読む方のスキル依存を下げる目的なのだと思います。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

わはは、括弧の位置を間違えました。
気にしないで下さい。


返信引用
PSB
 PSB
(@PSB)
ゲスト
結合: 20年前
投稿: 7
 

ガイドラインは
・全員のコンセンサスを得る
・逸脱する場合は理由を明記する。
くらいで運用してますな。

MISRA-CとかIPA/SECとかが参考になれば。


返信引用
まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

> 「使い方次第」「使いこなす」「使い分ける」「上手に使う」
> これが、ルールの理由なんじゃないかな。

なるほど、そうかもしれませんね。
「分かりやすくなるような使い方をしろ」だと、
結局、人によってその定義が様々だから、
それだったら「ルール化しましょう」ってことなのかも。

自分も、趣味では自分流のルールを定めてはいるのですが、
まだまだ模索中だったりします。
とりあえず、趣味でも「人に見せること」を意識する場合は(滅多にないけど)、
if文のカッコと非マルチステートメント化は、行うようにしようと思います。

でも、マルチステートメントについては、やっぱりどうしても捨てがたいんですよね。
以前、実際に書いたソースですが、

// コマンドによって処理を分岐
if (strcmp(ComStr, LIST) ComList();
else if (strcmp(ComStr, MAKE) ComMake();
else if (strcmp(ComStr, EDIT) ComEdit();
else if (strcmp(ComStr, SAVE) ComSave();
else if (strcmp(ComStr, OPEN) ComOpen();
else if (strcmp(ComStr, SORT) ComSort();
else if (strcmp(ComStr, HELP) ComHelp();

というのが、何十行も続くものを書いたことがあります。
こういう場合だったら、やっぱりマルチステートメントの方が
見やすいと思いませんか………?

> MISRA-CとかIPA/SECとかが参考になれば。
ありがとうございます。じっくり読んでみます。


返信引用
まに
 まに
(@まに)
ゲスト
結合: 18年前
投稿: 78
Topic starter  

if文の閉じるカッコを忘れました…
気にしないでください。


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

>// コマンドによって処理を分岐
>if (strcmp(ComStr, LIST) ComList();
>else if (strcmp(ComStr, MAKE) ComMake();
>else if (strcmp(ComStr, EDIT) ComEdit();
>else if (strcmp(ComStr, SAVE) ComSave();
>else if (strcmp(ComStr, OPEN) ComOpen();
>else if (strcmp(ComStr, SORT) ComSort();
>else if (strcmp(ComStr, HELP) ComHelp();
>
>というのが、何十行も続くものを書いたことがあります。
>こういう場合だったら、やっぱりマルチステートメントの方が
>見やすいと思いませんか………?
僕なら関数ポインタを活用して for 文で処理するけどな。

// 例
static struct table_t {
const char *str;
void (*pfunc)(void);
} table[] = {
LIST, ComList,
MAKE, ComMake,
EDIT, ComEdit,
SAVE, ComSave,
OPEN, ComOpen,
SORT, ComSort,
HELP, ComHelp,
NULL, NULL,
};

for ( struct table_t *p = table ; p->str != NULL ; p++ ){
if ( !strcmp(cmdname,p->str) ){
p->pfunc();
return;
}
}
printf( コマンドエラー\n );
return;

こんな感じです。


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

追記。
コーディング(ルール)も重要ですが
アルゴリズムの追求・研究も重要だと思う。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

>// コマンドによって処理を分岐
>if (strcmp(ComStr, LIST) ComList();
>else if (strcmp(ComStr, MAKE) ComMake();
>else if (strcmp(ComStr, EDIT) ComEdit();
>else if (strcmp(ComStr, SAVE) ComSave();
>else if (strcmp(ComStr, OPEN) ComOpen();
>else if (strcmp(ComStr, SORT) ComSort();
>else if (strcmp(ComStr, HELP) ComHelp();
>
>というのが、何十行も続くものを書いたことがあります。

アルゴリズムの話が出たので一言。
このコード、劇的に遅いです。
CMapを使いましょう。

LIST,MAKE,...をキーにして、ComList(),ComMake(),...の関数ポインタを
CMap::SetAt()するか、

もう少し分かりやすくするなら、
enum ECmdNum
{
ECN_List,
ECN_Make,
:
};
LIST,MAKE,...をキーにして、ECN_List,ECN_Make,...をCMap::SetAt()した
上で、
switch()
{
case ECN_List:
break;
case ECN_Make:
break;
:
}


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
 

>CMapを使いましょう。
ん?MFC使用している様には見えないのだが。。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

>>CMapを使いましょう。
>ん?MFC使用している様には見えないのだが。。

「素直に連想配列(辞書)使いなさいよ」の意じゃねぇですかしら。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

そうです、
連想配列(辞書) 要するに ハッシュ を使った方がいいよという意味です。

ただ、連想配列とかハッシュとかそう言う言葉だと知らない人には伝わらないので
あえて、CMapと言ってみました。

かえって分かりづらくなってしまったようで失礼


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> というのが、何十行も続くものを書いたことがあります。
> こういう場合だったら、やっぱりマルチステートメントの方が
> 見やすいと思いませんか………?

まにさんが書き直したマルチステートメントのソースコードを貼ったら、
どっちが見やすいかの意見が集まると思いますよ。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 連想配列(辞書) 要するに ハッシュ を使った方がいいよという意味です。

ぃゃぃゃ、連想配列(associative-array)とハッシュはまた別物ですぜ。
連想配列の実装のひとつがハッシュであるってだけで。
# std::map だとbinary-tree実装だし


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

>ぃゃぃゃ、連想配列(associative-array)とハッシュはまた別物ですぜ。
>連想配列の実装のひとつがハッシュであるってだけで。
># std::map だとbinary-tree実装だし

なるほど、勉強になりました φ(..)メモメモ


返信引用
悠
 悠
(@悠)
ゲスト
結合: 17年前
投稿: 40
 

bunさん、イラン突っ込み申し訳ありません。
επιστημηさん、フォローあろがとうございました。
納得です。


返信引用
固定ページ 3 / 5

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました