• ベストアンサー
  • 困ってます

良いプログラムを書くためには

今回、プログラミングの上達方法に関してアドバイス頂きたく質問しました。 現在、ソフトウェア開発の仕事に就いていてCやJavaなどでプログラムを書いたりしています。主にCで書くことが多いです。与えられた課題に対して動くプログラムは作れるのですが、先輩などからプログラムが汚いとよく指摘されます。 指摘される事柄は色々ありますが、何点か挙げるとまずモジュール分割が上手く出来ていない。1000行位の動くプログラムを書き始められた頃は、共通の処理などの関数が分割されておらず、同じ処理がやたら多いなど、余計な処理が多くコードに無駄が多いと指摘されました。それを改善したところ、今度は無駄に関数の分割が多くなり、読みにくいなどの指摘を受けました。 その他にも、例えば関数の中で、for(条件式)の条件式を上手く工夫すれば、for()の中で、余計な条件分岐などが減るなどの、細かい記述に関しても指摘を受けます。 質問はプログラムを作成する上で、大きな観点からだと、どのようにすれば綺麗にモジュール化などが出来るのか、モジュール化だけではなく、ソフトウェアの設計全般に関してです。また細かいことで、いえば先ほどのfor()の様に、文法を上手く使いこなすためにはどうすればよいか。本などのサンプルコードでは、forならfor、ifならifの説明など、主に単独の説明が多いように思えます。関数の中で、各文法同士を上手く使いこなし、他人が見ても読みやすいコードなどを書きたいです。 先輩からは、他人のソースコードを見ることなどと言われますが、何か他人のソースコードを見る上でも、上で挙げた指摘を改善するための見方とか、他にも自分でプログラムを作る場合に、こういう事に注意しながら作るといいなど何か改善するアドバイスがあれば宜しくお願いします。また参考になる書籍やサイトなどもあったら教えて頂くと助かります。 長くなりましたが宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数6
  • 閲覧数645
  • ありがとう数7

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.6
noname#88772
noname#88772

こんにちは。 問題の解決についてプログラミングを行うにあたって以下の流れを通ります。 [読解] → [処理の分解] → [コーディング] 質問者さんはコーディングについての上達を目標とされているようですが、 プログラミング自体の上達にあたり、 上の流れの [読解]→[処理の分解] を鍛えることをお勧めします。 これはプログラム設計にあたります。 コーディング自体を鍛えると小手先のテクニックに凝ってしまいがちになります。 プログラムの全体を捉えることが重要です。 各流れは以下のようになります。 読解: 以下のことをハッキリさせる  ・問題を解決するために必要とされるアウトプットは何か  ・問題を解決するにはどのようなもの(データ等)が必要か 処理の分解: 以下の順序で処理を細かくしていきます。  1.問題解決の大まかな処理の流れを考える  2.処理を実現するにはどのような処理の流れに分解すればいいか考える  3.分解した処理について2.の処理を繰り返し、他人でも簡単に解るレベルまで噛み砕く この段階で同じ処理が出てきたりしますので一つの関数にまとめたりできます。 コーディング:  ・分解した処理を各言語に変換する 後参考に、コーディングについて私の場合はこうします ・各関数は100行程度に収めます ・main() では処理の項目の一覧を書く程度、または一関数のみにしています ・必要と思われるコメントは必ず入れます ・各関数の先頭コメントには用途、入力、出力、返り値を書きます ・他の人が見ても解るよう、可読性を重視して書きます ・各関数は他のプログラムにも応用できるように書きます ご参考までに。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

コーディングを行う前の設計が重要だということは解っていま したが、ではどういう風に考えていけばよいのか。という点が 曖昧でした。 よってyuji_syamiさんが教えて頂いた段取りの方法はとても参 考になります。この方法で設計を仕上げて、コーディングに入 る。 そういうプログラム作りに変えてみます。 ありがとうございました。

関連するQ&A

  • どういうプログラムを関数化をしたほうがいいのか しないほうがいいのか

    phpで、使いまわす可能性が高いコードを関数化しようか 迷っているんですが、関数化するとソースがどんどんカオス化していき 後から見て、ちゃんと管理ができるのかなあと不安になります。 他の人からみても分かるかどうかというのも問題です。 プログラムで、こういうソースコードを関数化したほうがいい 逆に、こういうコードは、直書きしたほうがいいというのがあれば アドバイスお願いします。

    • ベストアンサー
    • PHP
  • シートのコード部を後からプログラムで作成可能?

    エクセル2003で、シートにプログラム(コード)がありシートを削除すると当然プログラムがなくなります。 シートはシートの挿入で新規に作成できますが、プログラム(コード)部を後から自動的に(標準モジュールの関数からソートのコード)を追加することは可能でしょうか? シートのコード部は主にイベントですが、詳しい方教えて下さい。

  • C等のプログラム例を見ていると、

    C等のプログラム例を見ていると、 たまにifのあとに{}を使わない事がありますけど、あれって一つだけを処理する場合なら省略できるって事ですか? あとこれはforやwhileでも出来ますか?

その他の回答 (5)

  • 回答No.5

Javaなどのオブジェクト指向系で言ったら、「デザインパターン」ですね。クラス名、メソッド名などの命名規則なども含めて、デザインパターンの本に記載されているコードを参考にしていけば、まず外れることはないでしょう。もっとも、「デザインパターン」もまた万能のツールではないのですが、それを否定する人は余程のベテラン設計者でもない限りいないはずです。(それこそ、オブジェクト指向設計者さん達の試行錯誤による集大成とも言うべき代物ですから。) >関数の中で、各文法同士を上手く使いこなし、他人が見ても読みやすいコードなどを書きたいです。 ただ、上記のようにもおっしゃっていることから、「データ構造とアルゴリズム」に関しても一通り体系的に理解しておくことが必要であるように思われます。 >先輩からは、他人のソースコードを見ることなどと言われますが、何か他人のソースコードを見る上でも、上で挙げた指摘を改善するための見方とか、他にも自分でプログラムを作る場合に、こういう事に注意しながら作るといいなど何か改善するアドバイスがあれば宜しくお願いします。 Cなどで言ったら、Linuxカーネルとか、ネット上に転がっている大規模のオープンソースソフトウェアでしょうか?(ブラウザとか。) ただ、質問者さんの場合はもう既に実務に入られているわけですから、一番に参考にすべきは「同じ開発チーム内の先輩方のソースコード」だと思います。ちなみに、どの先輩方を参考にするかは以下を元にしてください。 ・よく指摘を受ける先輩(→自分を否定することになるので、あまりとやかくは言われなくなると思います。) ・その業務に長年携わっている先輩(→ベテランの方ですから、なぜそのようなコードにしているのかなど、ちゃんと理由を持っているはずです。) ・机の上がいつも綺麗な先輩(→几帳面さは、ソースコードにも現れます。)

共感・感謝の気持ちを伝えよう!

質問者からのお礼

Javaでプログラムを組むこともあるのですが、胸を張って オブジェクト指向を使いこなせているとは言えません。 アドバイスの通り、オブジェクト指向も勉強し直します。 社内で、先輩のソースコードを参考にする際のアドバイス も参考になります。 ありがとうございました。

  • 回答No.4
  • don_go
  • ベストアンサー率31% (336/1059)

質問の文章はgusu123さんの先輩の方々から指摘されている のと全く同じ理由で、とても読みづらい印象を受けます。 改行が少ない文章は、区切れがどこに有るかを解り難くし それだけでも読みづらい印象を与えます。 同じ語句の繰り返しと論点のまとまりのなさは、理解を 妨げると共に、読む気を失わせる原因にもなります。 自分が質問を受ける立場になった時に、読みやすいと感じる かどうか? もしも、自身が読みづらいと感じるようであれば、他の人に とってもやはり読みづらいと思って下さい。 単に、思い付くまま単語を並べるだけではなく、何度も読み 返し推敲する事を日常的に試みる様にして下さい。 やがては読み易い文章を短時間で書ける様になります。 #プログラムを作成する場合も同様です。 先輩からいろいろ指摘を受けていて、改善してみても別の事を 指摘されるとの事ですが、不具合の方向が真逆の両端をいったり きたりして、改悪を繰り返しているだけです。 本や他人のソース等を見て、多すぎたり少なすぎたりしない 様にいろいろと試行錯誤をして適当な所を探し出して下さい。 人間が楽に認識できるのは画面上で上下に1画面分スクロール するぐらいの範囲内といった話もあります。 モジュールの大きさを決める際の参考の1つにしてみては? また、数年後の自分は他人と同じという気持ちでプログラム を書く事が必要です。 #自分自身で数年前に作成したプログラムであっても、他人 #が書いた物の様に感じる事は良くあります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご指摘ありがとうございます。 確かに、私の文章と比べて、don_goさんの文章は、一瞬見ただけで、 読みやすいと思わせてくれます。 文章、プログラムともに人に見せる前に、自分自身が本当に読みに くくないか。 何度も推敲する様に心掛けます。 指摘して頂いた当り前の事が、プログラムや文章を上達させるコツ でもあると感じました。 当り前のことが、まず出来ていない点も指摘して頂き、参考になり ました。 ありがとうございました。

  • 回答No.3
  • R32C
  • ベストアンサー率39% (115/290)

古い本ですが、Myers本のひとつですが、「ソフトウエアの複合・構造化設計」 を入手可能ならお勧めします。 オブジェクト指向どころかC言語すらメジャーでなかったころの本ですが、 モジュール分割に関して、強度、結合度というものさしを用いてモジュールの 分割方法について、説明しています。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

モジュールを分割することは、プログラムのロジックを考える過程でもかなり大きな悩みとなっています。 紹介してもらった本で、モジュールの分割を体系的に学べそうなので読んでみようと思います。 ありがとうございました。

  • 回答No.2
  • edp3142
  • ベストアンサー率60% (226/373)

とりあえず「Cプログラミング診断室」という書籍を推奨しておきます。 http://www.pro.or.jp/~fuji/mybooks/cdiag/ 頑張ってください。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

紹介してもらったサイトを一部見させてもらいました。ソースコードがあり、悪い点を修正して学習する形態となっているようですね。 人のソースコードをあまり見たことが無かったのですが、こういう書き方だと汚いソースコードになるのかと思いました。 さらに改善策も紹介されているようなので、大変参考になります。 さらに読んでいきます。ありがとうございました。

  • 回答No.1
  • tgook
  • ベストアンサー率48% (96/198)

一応、ソフトウェア設計を仕事やプライベートでやっている者です。 参考になるかは分かりませんが、 私はソフトウェアを作成する時、いきなりコードを書くのではなく、 最初は紙に以下のようなことを箇条書きに書きます。 (1)どういう動きをするものを作るのか? (2)インプットは何? (3)アウトプットは何? (4) (2)から(3)を得るにはどういう処理が必要? -> その処理の中に共通の動きをするものはある? (あればリユース可能にする) -> 関数化を検討 (関数は処理の内容ごとに分類。関数内の処理も一連の流れを決めて、その流れを守って作る。) (5)デバッグ あとは、コーディングやって、単体テストや結合テストなどをします。 コーディング作業は、やっぱり見易さを重要視して作業します。 (特にTabキーによるインデントや一行空けるなど。コメントも分かりやすく簡単に1行にまとめる。) こんな感じです。 何が正解かはやってみないと分かりません。 ただし、私でも1つだけ言えるのは、どんなソフトウェアを作るときでも、それは仕様書で決められている通りの、正しい動作をするものでなければならないということです。 納期やコストも大切ですが、上記に関しては手を抜いてはいけません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

プログラムを書く前に、大まかにプログラムの構成などは紙に書きますが、tgookさんが行っているような手順は踏んでいませんでした。 これからプログラムを書く前には、アドバイスを頂いた手順も参考にして作っていきます。ありがとうございました。

関連するQ&A

  • EXCELでプログラム処理をしたいです。

    下記の条件で プログラム処理をしたいです。  (1)出題文章どおりにIPさせてその時間を測る。  (2)出題通りのIPでなければ先には進めない。  (3)10問完了した時点の分秒をタイマー表記。   昔ベーシックでは可能でした。 Excelの IF 関数でプログラム 出来そうなんですが??  識者様教えて頂けませんでしょうか?

  • JavaScriptを使ってCSSをプログラムする

    お世話になります。 JavaScriptのプログラムを利用して、CSSを操作することは可能でしょうか? 具体的にやりたいことは、 JavaScriptの再帰関数を用いて、CSSによる配色を自動的に描きたい。 ということです。 単純なソースコードがもしありましたら参考にさせて下さい。 また、無理な場合には、ご指摘頂けると助かります。 宜しくお願い致します。

  • C言語の二分法のプログラムについて

    二分法によりルート2の近似値を求めるプログラム、ってどうやって作ったらいいんですか? ちなみに初期値は2で、収束条件は10^-5です。 収束までの回数も求めなきゃいけません(ニュートン法と比較するため。ちなみにニュートン法はできました。) 似たような質問を見つけたのですが、どれも、難しいプログラムばかりで解読ができません。 関数とかif else文とかwhile文とかfor文とか、そういう簡単なのしか習ってないので、それで作れる範囲で教えてくださる方、 いらっしゃいましたら、よろしくお願いします。

  • フォームプログラムでのファイル分割

    先日よりお世話になっています。VC++フォームプログラムのスコープに関する質問です。 フォームプログラムではデザイナモードでGUIで作成したデザインや割り込み、プロパティなどが、自動的にソースとして全てForm1.hに作成されます。さらに自分で処理を追加していくわけですが、Form1.hが膨大になってしまうこともあり、デザインに関する部分以外を別のファイルanother.cppで書きたいのですがうまくいきません。どうか知恵をお貸しください。 まず、現在のForm1.hの構成は、 --Form1.h----------------------------------------------------- namespace namForm1{ class Form1{ private: void func(); //プロトタイプ ・・・・・・・・ } ・・・・・ } void namForm1::Form1::func(){・・・} //関数定義 --------------------------------------------------------------- のようになっており、ここでフォームプログラムの処理が全て記載され、実質のメインともいえるような作りになっています。 ですが、Form1.hのコード量が増えて見辛くなることを嫌って、Form1.hで書いてある関数func()などを内容をanother.cppに出したいのです。another.cppからnamForm1の名前空間を使おうとしても、当然「識別子がクラス名でも名前空間名でもありません。」怒られますし、another.cppにForm1.hをインクルードしてもやはり、「識別子がクラス名でも名前空間名でもありません。」となります。このプログラムをスマートにファイル分割する方法を教えてください。お願いします。

  • VB For-Next文でのExitではなく中断は可能?

    初歩的な質問で申し訳ありません・・・ ループで処理しているものがあるのですが、ExitForでループを抜けることはできますが、途中で処理を中断して次のカウンタの処理へ移ることはできるのでしょうか? 例えば For i = 1 to 10   if 関数1() = False then     ■ループ処理を終了するのではなく次のカウンタ[i]に移りたい■   else     Call 関数2()   end if Next i という事をしたいと思っています。 今は For i = 1 to 10   ret = 関数1()   if ret = True then     Call 関数2()   end if Next i という方法で記述していますが、上記のような条件文が10や20もあると、IF文の入れ子入れ子でかなりコードが見にくいです・・・。 どなたかよろしくお願いします!

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

  • プログラム構造化設計の問題について

    プログラム構造化設計の問題がどうしてもわからなくて困っています…ずっと考えているのですが…。 願書データ入力→応募ファイル更新→応募登録確認処理 という一連の流れを、モジュール分割してプログラム構造図・IPO図を作成するという問題なのですが、 応募登録という全体の作業の、どこをどう分割すればいいのかわかりません。入力と参照以外に何があるのでしょうか… 無知ですみません、よろしければヒント等お願いいたします。

  • プログラム終了方法

    こんにちは。プログラム終了方法についてお教え下さい。 下記のような処理を書いています。 if(A!=B)の場合、処理を抜けてプログラムを終了させたいと思っています。 下記のコードだとテキストボックスにエラー表示をさせた後に、プログラムを終了させたいです。 ただ、現状だと~~~処理3、処理4が実行されてしまいます。 どのようにすれば、if(A!=B)でテキストボックスにエラーを出力した後にプログラムを終了できるでしょうか? gotoを使用し、真ん中の処理を飛ばす方法しか有りませんでしょうか? よろしくお願いします。 try{ ~~~処理1 ~~~処理2 if(A!=B) { textbox.text = "エラー"; //goto endfinish; } ~~~処理3 ~~~処理4 } catch { textbox.text = "エラー"; } //endfinish:;

  • 自然数の和のプログラム

    if-else文とwhile文とfor文と1次元配列、このすべての条件を使って自然数の和を求めるプログラムを作りたいんですけど、これらの条件全てを使ってプログラムを作ることができません。 よろしければ教えてください。

  • 作っているプログラムが分かりません・・・

    プログラムが… 以下のプログラムを作っているのですが、よく分かりません・・・ A監督が 77,B走塁コーチは 78 です.さて,77 と 78の素因数の和は等しくなっています. つまり,77=7×11,78=2×3×13,7+11=18,2+3+13=18 となっています. このように,素因数の和が互いに等しいという条件を満たすような, 差が 1 の自然数の組を 20000 以下でできるだけ多く探索しましょう. ここで,20000 以下には 26 組しかないことがわかっています. #include<stdio.h> #difine MAX 20000 int main(){ int sum[MAX+1]; int i,j,n; for(i = 2;i <= MAX;i++){ j = 2; while(j*j <= i){ if(i % j == 0){ _________________; break; } else j++; } if(j*j > i) ___________________; } n = 0; for(i = 2;i < MAX;i++) if(sum[i] == sum[i+1]){ n++; printf("%3d (%d,%d)\n",n,i,i+1); } return 0; } 補足 分からないのはプログラムの書き方で _________________;の部分だけでも答えていただけるとありがたいです。