トップページ⇒tech
39コメント12KB

コーディングの定石ってありますか?

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 NGNG
たとえば、グローバル変数は使っちゃいけないけど、こういう場合は
許す…とか、C++でこういう場合は継承しておくとか、主にC++に
絞って、コーディングの際のみなさんが培った定石のようなものを
いろいろ教えていただきたいです。おねがいします。
0002名無しさん@お腹いっぱい。 NGNG
デザインパターン読め。
0003名無しさん@お腹いっぱい。 NGNG
> グローバル変数は使っちゃいけないけど、こういう場合は
> 許す…とか、C++でこういう場合は継承しておくとか

それは設計の定石
0004名無しさん@お腹いっぱい。 NGNG
この板とprot板の過去ログに一通り目を通せ。
0005あなたのうしろに名無しさんが・・・ NGNG
Cで僕が使ってるのの一例。どれもあんまりいいものじゃないという自覚はあるが・・

(1)sizeofには変数名を指定する
 今やってる仕事の既存のソースに
 memset(buf@`NULL@`sizeof(char)*BUFSIZE);
 なんていう表記が出てきた。
 bufの宣言が char buf[BUFSIZE]; なんだけど、宣言を変えたら、処理を変えないといかん。
 僕は
 memset( buf@` 0@` sizeof(buf) );
 と、宣言を変えても大丈夫なようにしてる。
 経験上、ポインタを memset() に指定する事って少ないし。

(2)配列の個数だけループする場合はsizeof()を使ってループ回数を決める
int status[40];
for(i=0;i<sizeof(status)/sizeof(status[0]);i++){
 hoge(&status[i]);
}
普通はマクロ使う

(3)==の左辺には代入不可のものを使う
a=1
a==1
のタイプミス防止。1=aならエラーだから。

・・・こんな事が聞きたかったの?>1
0006名無しさん@お腹いっぱい。 NGNG
とにかく、人に聞く前に調べることが、コーディングの際の定石だよ。
そういうわけで、過去ログしらべてごらん。
それから、調べた結果をこのスレッドで発表して世の中に還元すること!
期待してるよ。
0007名無しさん@お腹いっぱい。 NGNG
> 人に聞く前に調べること

それは人に質問する際の定石


0008名無しさん@お腹いっぱい。 NGNG
コーディングの定石とかスタイルってなものは、人に聞いて覚える物で
はなく、自分でプログラムを書きまくって自ずと体得する物。

例えば「グローバル変数は極力使うな」なんてのは、自分でグローバル
変数が百個くらいあるプログラムを書いて、デバッグで苦しんでみれば、
次からはもうちょっとプログラムの構造を見直そう、と思うだろう?

などと、元々趣味からプログラムに入った者(今は仕事)としては、こ
う思うのだが、仕事の人、特にチーム開発なんてしてる人の場合は、
「そんな悠長なこと言ってられるか!」何だろうなあ。特に新人教育係
の人。
0009名無しさん@お腹いっぱい。 NGNG
人に聞かなくてもいいけど、良いソースは見たほうがいいでしょう。
つっても、難しいけど<どんなんが良いソースなのか。
0010名無しさん@お腹いっぱい。 NGNG
       ヾ
        @`)_
      /  'つ
    ∧∧ /  / ̄ ̄ ̄ ̄ ̄ ̄ ̄
   (゚Д゚ )'   < 検索などせず、俺に聞け!
   ∪ ∪    \_______
0011名無しさん@お腹いっぱい。 NGNG
>>8
言いたいことは分かるけれど、苦難を体験しないと進歩しないかなぁ。
それじゃたたき上げの職人になっちゃうよ。

言葉は悪いけれど、ある一定の品質のコーダーを大量生産するためには、
8さんの方法はあまりよくない。職人やハッカーは計画して作れないし、
資質にも大きく依存する。

僕も趣味(ベーマガ)から入ったから言いたいことはよくわかるよん。
0012名無しさん@お腹いっぱい。 NGNG
1です。確かにおっしゃる通り、人に聞く前に自分で・・・というのが
礼儀ですね。でも、ボクだって、プロの人にはかないませんけど、
技術本も買うし、試行錯誤もしました。それでも「なにかがちがう」と
いう気持ちが、ボクを質問に踏み切らせたのです。過去ログも読んで
ます。でも、なかなか、C++ならC++でまとまったような体系的に
なったものってないじゃないですか。デザインパターンじゃなくて、
なんか、これやっとくと便利だよ〜的な豆知識みたいのを期待して
ました。でも、それが「ずうずうしい」根性なんですね。
 でも、ボクもプログラミングは好きですから、みなさんと同じ苦労を
ボクも続けていきます。そして、何か見つけたら、惜しまず書き込む
ようにします。
0013名無しさん@お腹いっぱい。 NGNG
>1
http://www.possibility.com/Cpp/CppCodingStandard.html
和訳してくれ
0014じじい>1 NGNG
昔のプログラマはみんなヒネクレもんが多かったからね。
「こうだからこうやれ」なんて言ったら逆にその悪い面が浮き出るような
コードわざわざ書いて無言の抗議なんて状態だった。
たとえばgoto使うななんて言われたら、goto使った方が絶対いいような
スタイルで全部通して、でも言われた通りgoto使わないなんてね。

定石なんてものには縛られたくない。
あえて定石というならそれは自分で作るって感じだったなあ。
0015名無しさん@お腹いっぱい。 NGNG
便利だよ〜なんてテクニックなんかあるのだろうかね。
そういう要望ならEffective C++やMore Effective C++で十分な気がするけど。
0016名無しさん@お腹いっぱい。 NGNG
定石
while((c = fgetc(fp)) != NULL){
/* hogehoge */
}

0017>14 NGNG
それはお前だけ
昔もそんな奴は使えないプログラマとしてたらい回し
0018名無しさん@お腹いっぱい。 NGNG
>16
それでは思った通りには動かないよ。
0019名無しさん@お腹いっぱい。 NGNG
コーディングの定石
・同じことは2度書かない。
0020>14 NGNG
協調性のかけらもないな・・・
0021名無しさん@お腹いっぱい。 NGNG
>16
はこういうのが書きたかったんだね
while((c = fgetc(fp)) != EOF){
/* hogehoge */
}

定石
char LineBuffer[256];
while(fgets(LineBuffer@` 256@` fp) != NULL){
/* hogehoge */
}
0022>21 NGNG
後半はsizeof(LineBuffer)が定石だと思うが・・
0023名無しさん@お腹いっぱい。 NGNG
定石っていうか、イディオムっぽい
0024名無しさん@お腹いっぱい。 NGNG
256なのも定石か(w
0025名無しさん@お腹いっぱい。 NGNG
私は BUFSIZ を使ってます。
002621 NGNG
私が書いた二つは16の人がこの二つを混同していませんか?
って意味で別にこれが定石だといっている訳ではありません
(定石って言うほどご立派な部分でもないですし)
こぴぺした時の"定石"が入っちゃってるんでアレなんですけど・・・

なんかこう、みんなが感動するような定石求む(1じゃないけど)
002721 = 26 NGNG
このレベルが定石になっちゃうと
char *pString@` *hoge = "もなー";
if((pString = malloc(strlen(hoge) + 1)) == NULL){
  return false;
}
こんなんでも定石になっちゃうし・・・
ていうか自分定石の意味間違ってる? 鬱だ死脳
0028名無しさん@お腹いっぱい。 NGNG
「鬱だ氏のう」は自分が間違ったときに使うのが定石です。とかいう
0029名無しさん@お腹いっぱい。 NGNG
1より
>主にC++に
>絞って、コーディングの際のみなさんが培った定石

>27
C++でmallocを使用するのは悪手
0030名無しさん@お腹いっぱい。 NGNG
もちろん「悪手でなくては解決しない問題もある」ことも定石
0031名無しさん@お腹いっぱい。 NGNG
>30
> もちろん「悪手でなくては解決しない問題もある」ことも定石
C++でmallocを使用しないと解決しない問題をおもいつかない
具体例を挙げて欲しい

# 「C++でmallocを使用するのは悪手であることが多い」
# には同意します


0032名無しさん@お腹いっぱい。 NGNG
>31
別のライブラリとリンクする必要があって
その関数がmalloc()されたメモリを要求している場合
0033!30 NGNG
::operator new(size_t)を書き換えるときにmalloc使う。
::LocalAlloc等でもいいけど・・・。
003429@` 31 NGNG
すいません
C++をかたるのは10年早かったようです
勉強し直してきます
0035名無しさん@お腹いっぱい。 NGNG
while()とかループ条件内で && ||を使わないってのがあったなあ。
言った奴は酷く叩かれてたけど、
実際 && を使うべき所を || に間違ってしまう事多いからねえ
0036名無しさん@お腹いっぱい。 NGNG
while(1) {
 operation1;
 if (cond1) break;
 operation2;
 if (cond2) break;
 operation3;
}
というのは悪手ですか?
0037>36 NGNG
operation1でcond1を作る
operation2でcond2を作る

繰り返したいのはoperation3って感じですよね?
判りやすくていいと思います
0038名無しさん@お腹いっぱい。 NGNG
operation1と2が別関数にできるなら
while(funcop1()&&funcop2()){
 operation3;
}
と書くほうがすっきりする

こういうときに関数内関数が欲しい‥>C
0039<38 NGNG
そのために関数内で関数定義するくらいなら>>36の方がすっきりするかな、オレの感覚だと。
■ このスレッドは過去ログ倉庫に格納されています