ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

趣味でプログラミングをしているのですが、
現場で働いている人が見ても理解されるコードを
目指して学習をしています。

今、C/C++用のスタイルブックを買って読んでいます。
それと、デザインパターンの本を読んで、少しずつですが学習しています。

理解しやすいコードを書く練習として、他に「これはやっておけ」
というのがあれば教えてください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (11件中1~10件)

色々あがってますが、コレも必読かと。



 リファクタリング―プログラムの体質改善テクニック

コードを常にメンテナンス性の高い状態に保つテクニック、リファクタリングの本です。
デザインパターン、アナリシスパターン、XPに続くマイヒットです^^

参考URL:http://www.amazon.co.jp/exec/obidos/ASIN/4894712 …
    • good
    • 0

処理の入口と出口をはっきりさせるくらいでしょうか。


関数の中でreturnを配置する場所と条件の規則性を考えてみるとか、
for/whileループを抜ける場所を1カ所にまとめるとか。
セマフォロックの解放など、抜ける前にやるべきことを忘れたりとか
が虫になることが多いんで、長い処理はデバッグ時に状況確認のタイ
ミングを確保できるように、分岐から戻ってきて確実に通る場所を
用意しておくと見やすいと思います。
    • good
    • 0

>本を読み、自分でプログラムも組み、そのプログラム


>を人に見せて批評してもらい、人のプログラムも読ん
>でください。これだけすれば、絶対上達するはずで
>す。

上記は『Cプログラミング診断室』からの引用です。

サイトの紹介(参考URL)

参考URL:http://rec.ncos.co.jp/link.html
    • good
    • 0

No6 ency です。



> > 練習として、他に「これはやっておけ」
>
> というものとして、コメントを一切書かず、コードだけで理解できるように
> 記述する訓練が有効です。

訓練という意味では、確かにそのとおりですね。>No7 jacta さん。

あと「だらだらと長い関数を作らない」っていうのも付け加えておきます。
# 1000行以上ある関数を見たことがあるもので。。。

ちなみに、私の目安は100行前後、長くて 200行以内が妥当なところだと思いますが、どうでしょうか。>他の方々。
で、それ以上長くなるような場合には、関数に分けることを考えると。。。
# スクロール等を考慮すれば、ホントは 100行以内を目標にしたいところですが、
# 現実問題かなり厳しいので、目安として私はこれくらいにしています。
    • good
    • 0

#2です。

少し補足しておきます。

> 練習として、他に「これはやっておけ」

というものとして、コメントを一切書かず、コードだけで理解できるように記述する訓練が有効です。

実際の製品には適切なコメントを付けることになるでしょうが、練習段階で中途半端な妥協をしてしまうと十分な訓練になりません。
コメントなしで理解できるコードが書けるようになってからコメントを付けるようにすれば、自ずと必要最小限になりますし、内容も適切なものになりやすいかと思います。
    • good
    • 0

> コメントを一切書かず、コードだけで理解できるように記述する



確かに理想ではあるでしょうね。
でも、現実問題不可能な場合もあると思います。

x = 5; // x に 5 を代入

のような意味のないコメントはつけず、必要最小限にとどめる工夫が必要なのだと思います。

以下、私が気をつけていることです。

1. ひとまとまりの処理は関数化する。
2. 関数名、変数名を工夫してわかりやすい名前にする。
# 私は関数名は動詞を中心とした名前、変数名は名詞を中心とした名前に
# しています。
3. 定数にはマクロまたは enum 値を使う。
4. それでも、どうしても誤解を与えそうな場合は、特に注意が必要な処理の場合にだけ、コメントをつける。

あと、関数にポインタを渡す場合に、IN/OUT 等のコメントを良く見ます。
要するに IN は「関数に値を設定する」、OUTは「関数から値を返す」ということです。
でも私は、こんなコメントよりも IN の方を const 宣言した方が良いと思っています。
そうすれば、関数内で値を書替えようとしたときにコンパイラがエラーをはいてくれますし。

コメントは長い時間が経つと、追加・削除・変更等の修正によってウソになることがよくあります。
つまり、コードは修正されているけども、コメントが修正されていないため、逆に混乱を招いてしまう、ということです。

わかりやすいコーディングにコメントが必要でないとは言いませんが、冗長なコメントは逆にわかりにくくしてしまうことがあるということを覚えておいていただければ良いのではないでしょうか。
    • good
    • 0

> コメントを一切書かず、コードだけで理解できるように記述する



私も同感です。
関数の頭に引数や戻り値や機能の説明は必要ですが、コード中のコメントは結構邪魔です。
コードは保守されてもコメントは保守されないことが多いですし。
また、
x = 5; // xに5を代入
なんて無意味なコメントを平気で書く人もいて、結構迷惑です。
    • good
    • 0

> コメントを一切書かず、コードだけで理解できるように記述する



激しく同意。コードに語らせればコメントでは何をしているか/どうやってるかを書く必要はない。
饒舌なコメントは五月蝿いし、嘘をつくことがある。
    • good
    • 0

こんな具合にすればいいかと


/***************************************************
   GetNum
   作成者 : 俺だよ

   処理概要
   5であるか確かめる

   -------------------------------------------
   第1引数  x
   型     int
   内容    元になる数値

   -------------------------------------------
   戻り値
   型     bool
   
   5である  true
   5以外   false

***************************************************/
bool HeClass::GetNum(int x)
{
   // 5であるか?
   if ( x == 5)
   {
      //5である場合、trueを返す
      return true;
   }else{
      //5でない場合、falseを返す
      return false;
   }
}
    • good
    • 0

> 理解しやすいコードを書く練習として、他に「これはやっておけ」


> というのがあれば教えてください。

コメントを一切書かず、コードだけで理解できるように記述する訓練をするのがかなり効果的です。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint型配列の一括初期化

現在、ある配列をfor()でループさせて初期化させていますが、もっと高速に初期化できる方法はないでしょうか?

//配列の初期化
int Xi[256];

for(i = 0; i < 256; i++){
   Xi[i] = 0;
}

今後、配列数を増やす予定なので高速に初期化できるものはないか探しています。
速度重視でよろしくお願いします。

Aベストアンサー

全ての要素が0で初期化された配列を確保したいのであれば、calloc()を使うというのはどうでしょうか? 上記のコードより速いという保証はありませんが。

#include <stdlib.h>
int *Xi = (int *)calloc(256, sizeof(int));

配列が不要になった時点でfree(Xi)するのをお忘れなく。また、初期値が0以外の場合にはこの手は使えません。

Qモジュールとは何ですか

モジュールとは具体的には何を指しているのか、をお聞きします。

手元のカタカナ語辞典では
「プログラムを、それぞれ特有の機能を持ついくつかの基準単位に分割すること。また、その基準単位。」
と書いてありました。

そうすると、1つ1つのソースファイルを指しているように思えてきます。

いままで私が人がしゃべっているのを聞いてきたところでは、Windowsでいうところの、exeファイルやdllファイルを指しているような気がします。

「モジュール」という言葉は gooの新語辞典にも載っています。
また、コンピュータ用語辞典のようなサイトも見てみました。
それらによると、「ソフトウェア・ハードウェアの部品」だそうです。
しかし、例えば何のことをいっているのかが、分からないのです。

#ファイルなら何でもいいのだろうか。

この言葉の用例を教えていただきたいのです。

============================
過去の質問と回答より。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=302590
回答No.1の補足より。
>モジュールはAccessの標準モジュールのことです

わたしはAccessのことをほとんど知らないので、ハテナです。


http://oshiete1.goo.ne.jp/kotaeru.php3?q=293234
こちらのNo.2の回答では、
dllとは「共通モジュール=ライブラリ」である、
という使い方ですので、例えばdllのことを指しているようです。

モジュールとは具体的には何を指しているのか、をお聞きします。

手元のカタカナ語辞典では
「プログラムを、それぞれ特有の機能を持ついくつかの基準単位に分割すること。また、その基準単位。」
と書いてありました。

そうすると、1つ1つのソースファイルを指しているように思えてきます。

いままで私が人がしゃべっているのを聞いてきたところでは、Windowsでいうところの、exeファイルやdllファイルを指しているような気がします。

「モジュール」という言葉は gooの新語辞典にも載ってい...続きを読む

Aベストアンサー

「モジュール」と言う言葉には「ソフトウェアの部品」という以上の共通概念はありません。
よって、使用される文章の前後関係によって微妙に意味合いが変ってきます。

1.関数、手続き
「mainモジュール」など
2.機能単位でまとめられたライブラリのメンバー
「標準関数ライブラリ(UNIXならlibc.a)に含まれるstdio関係の関数群」など
3.実行ファイルを構築するための個々の素材ファイル
「ソースファイル」、「オブジェクトファイル」、「ライブラリファイル」など
4.実行環境を構成する個々の実行可能ファイル
「exeファイル」、「dllファイル」など
5.(オブジェクト指向型言語において)クラス

モジュールは機能で分類されていると言う保証はありません。
「stdioを構成する個々の関数」を関数モジュールと言う場合もあります。

モジュールと言う単語を使い場合、「関数モジュール」とか「ライブラリモジュール」と言うように、モジュールと言う言葉の曖昧さを保管するような単語と組み合わせて使う用に心がけた方が安全です。

Q【Excel VBA】マクロでExcel自体を終了させたい

環境:WindowsXP、Excel2003

マクロでエクセルを終了(ブックを閉じて、アプリケーション自体も終了)させたいのですが、以下のコードではアプリケーションが閉じてくれません。

ThisWorkbook.Close
ExcObj.Quit
Application.Quit

どこか悪いところはありますでしょうか?

よろしくお願いします。

Aベストアンサー

普通に考えれば質問者のコードで上手くいきそうですが
hana-hana3さんの回答にもあるようにThisWorkBook.Closeでコード終了となりますので
Application.QuitをThisWorkBook.Closeの前にもってこないといけません。
Application.Quitはそれがあるプロシージャのコードが全て終わるまで
その実行を保留するちょと特別動作をします。

'-------------------------------------
 Application.Quit
 ThisWorkbook.Close
'-------------------------------------
 
 

Qfree関数で動作が止まる

Cのプログラムを作成しているのですが、どうしても分からないので質問させてください。

以下のように、日本語を含んだテキストファイルから一行読み込み、その行の中のある部分だけ切り取るという関数を作ったのですが、メモリを解放する段階(free関数の部分)で動作が止まってしまいます。
どうすれば良のでしょうか?

使用環境は、windows vista, visual C++ Express Editionです。
よろしくお願いします。

char mid(wchar_t *str, int st, int ed, char result[128])
{
wchar_t *ans = (wchar_t*)malloc(sizeof(wchar_t));

wcscpy(ans,&str[st]);
ans[ed-st+1] = L'\0';

wcstombs(result, ans, 128);
printf("result = %s \n",result);

free(ans);
ans = NULL;
return 0;
}

*str:日本語を含んだ文字列(1行分)
st:切り取りを始端
ed:切り取りの終端
ans:切り取り結果
result:切り取り結果(マルチワイド文字列)

また、何故かワイド文字列で定義した「ans」のままではうまくいかず、マルチワイド文字列「result」だとうまくいきませんでした。
これの理由も、できればお願いいたします。

Cのプログラムを作成しているのですが、どうしても分からないので質問させてください。

以下のように、日本語を含んだテキストファイルから一行読み込み、その行の中のある部分だけ切り取るという関数を作ったのですが、メモリを解放する段階(free関数の部分)で動作が止まってしまいます。
どうすれば良のでしょうか?

使用環境は、windows vista, visual C++ Express Editionです。
よろしくお願いします。

char mid(wchar_t *str, int st, int ed, char result[128])
{
wchar_t *ans = (wchar_t*...続きを読む

Aベストアンサー

や, malloc で確保する量を間違っているのではないかと思われます>#1.
ちゃんと「必要な分」だけ確保していますか?
ちなみに最後から 2行前の文は意味不明.

Q2次元配列を動的に確保する方法

/*ネットの*/
w = (double **)malloc(sizeof(double*) * h);
w[0] = (double *)malloc(sizeof(double) * v * h);
for(i=0; i<h; i++) w[i] = w[0] + i *v;

/*自分の*/
w = (double **)calloc(h, sizeof(double *));
for(i = 0; i < h; i++){
w[i] = (double *)calloc(v, sizeof(double));

自分は初心者です。自分は下のようなコードで書いていたのですが
ネットで見つけたコードで上のようにデータの領域を全部確保してから
2番目以降のポインタを割り当てるようなやり方をしていました。
そのやり方は初めて見たのですが、こっちのほうが一般的なやり方なんでしょうか?
それと何かメリットはあるんでしょうか?
一度に確保した方が確実に連続領域に割り当てられるとかかなぁとか予想してるんですが・・・

Aベストアンサー

私は上の方を使用しています。
その理由は、hが100だったとして、iが30の時にヒープが足りなくなってしまった場合に、エラー処理として既に確保済の30個はfreeで開放しなければなりませんが、上の方であれば、一回のmallocで100個分の全体が確保できるかできないかのどちらかです。従って既に確保済の部分だけを開放するという細かい操作が必要なくなります。

Qバッファとは何ですか

C言語を使用してるとバッファという言葉がよく出てきますがバッファとは何ですか
メモリとは違うものですか
訳をみても緩衝材とか一時的に蓄える場所という意味でよく分かりません
一時的でない使い方も多い気がしますが実際はどういうものですか

Aベストアンサー

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速度の差のための緩衝材的な意味です。

昔はソフトウェアとハードウェア間に使うデータでソフトウェア側がデータを受け取るか、整形して送信するときに使うメモリ領域が基本的にバッファでした。
マルチプロセッサ・マルチタスクの時代になってくると、ソフトウェア間の処理速度の違いを吸収するために使うメモリ領域にもバッファという言葉が使われるようになりました。ソフトウェア間で逐次(FIFO)処理されるデータのためのメモリ領域がこちらの使われ方の主戦場といったところでしょうか。

ソフトウェア間でただ一括転送されるデータならバッファという言葉は誤用ということになるのですが、よく誤用されます。

#1です

寝ぼけて適当に書いたので修正。

すぐ見つけることができたもので正確なものは英語版ですがこちらくらいかも。
Data buffer - Wikipedia (en.)
http://en.wikipedia.org/wiki/Data_buffer

一応簡単なものはこちらです。
バッファとは - e-Wrods
http://e-words.jp/w/E38390E38383E38395E382A1.html

「複数の機器やソフトウェアの間でデータをやり取りするときに、処理速度や転送速度の差を補うためにデータを一時的に保存しておく記憶装置や記憶領域のこと。」
が現在の基本定義です。処理速度・転送速...続きを読む

QC#で配列の戻り値について

プログラミング初心者で、ただいまC#の勉強中です。
bool型(trueまたはfalse)とstring型(関数内で取得した文字列)の値を
配列で関数の戻り値として返したいのですが、どうすれば良いのかわかりません。
true/falseもstringとして呼び出し側で判別するしか方法はないのでしょうか。
アドバイスをお願いいたします。

Aベストアンサー

できなくはありません。bool型をToString()などで文字列に変換すれば全て文字列の配列として返すことはできますが、プログラムの作りとしては良くないプログラムの典型になってしまいます。
複数の値を返したい場合は、他の人が書いているように専用のクラスを作成して、それを使って返すようにする方法が良いと思います。(場合によっては、メソッドの粒度や役割が適切かどうか見直しも必要です。1つのメソッドで複数の処理を行わせようとすると、複雑なコードになりがちです)


専用のクラスを使う方法であれば、boolとstring型を格納するResultItemというクラスを作成し、
public class ResultItem{
 public bool IsSuccess{get;set;}
 public string Message{get;set;}
}

これを、メソッドの中で返すようにします。
public ResultItem YourMethod(){
 ResultItem item = new ResultItem();
 // 処理
 item.IsSuccess = true;
 item.Message = "関数内で取得した文字列など";
 return item;
}

できなくはありません。bool型をToString()などで文字列に変換すれば全て文字列の配列として返すことはできますが、プログラムの作りとしては良くないプログラムの典型になってしまいます。
複数の値を返したい場合は、他の人が書いているように専用のクラスを作成して、それを使って返すようにする方法が良いと思います。(場合によっては、メソッドの粒度や役割が適切かどうか見直しも必要です。1つのメソッドで複数の処理を行わせようとすると、複雑なコードになりがちです)


専用のクラスを使う方法であれば...続きを読む


人気Q&Aランキング