• 締切済み

良いプログラムとは?

はじめまして 自分はC++の基礎(入門的な)部分 構造体、ポインタ、関数、ファイル入力は 理解したのですが良いプログラム (処理時間、容量の短縮、見やすいプログラムなど) が分からないので (分かることがあるとすれば演算子の処理を少なく するとかポインタを使うとか・・^^;) こんな初心者にできれば具体的な 良いプログラムの基本的な書き方を 教えてください・・ 宜しくお願いします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

初心者向けのアドバイスをしておきます。 プログラミングの学び始めでは、正しく、安定して動かすことを最優先してください。 おそらく、おぞましいほど汚いコードになるかもしれませんが、それでも構いません。汚いコードを書いてしまうと、正しく、安定して動かすことも、機能を追加するなどの修正を行うことも大変です。そのことを、身をもって体験してください。 成功の経験は大して役に立ちませんが、失敗の経験は大いに役に立ちますから。 どんな書き方をすれば、どんな動作になるかもその過程でつかんでください。例えば、例外処理を熟知することは効率の良いコードを書く上で不可欠ですが、効率以前に例外処理を正しく把握していないと、安定性の高いプログラミングは不可能です。 クラスもテンプレートも知らなくてもよいので、早い段階で例外処理だけは押さえることを強くお勧めします。 他には、汎整数昇格など、細かい動作を把握できるようになれば、ソースコードを見るだけで動作が把握できるようになります。 分からない言葉も多いと思いますが、Googleなどで検索してみてください。検索のためのキーワードを盛り込んでアドバイスしたつもりです。 プログラムをまともに動かせないのに、ソースコードの見た目にだけこだわっても無意味です。料理に例えれば、味や衛生面より、盛り付けを重視するようなものです。

  • ency
  • ベストアンサー率39% (93/238)
回答No.6

私が気をつけていることは、こんな感じですかねぇ。 1. 無駄なコメントはつけない。 2. ひとまとまりの処理は、関数にする。 3. 誰が見てもわかるような変数名、関数名をつける。 4. 必要なデータの洗出しをしっかり行う。 1 については、No4 で jacta さんもおっしゃっているように、無駄なコメントはソースを見にくくするだけです。 コードだけで何をやっているのかがわかるようなコーディングをするように心がけてください。 また、無駄なコメントは時間が経つと、たいていウソになります。 # コードの修正後、コメントの修正を後回しにしてしまうことはよくあります。 # ここでいう「ウソ」とはそういう意味です。 2 については、「ここからここまではこんな処理」という「ひとまとまりの処理」が必ずあると思います。 その部分を一つの関数にしてしまうのです。 たとえ、一度しかコールされないような処理でも、関数にしてしまいましょう。 # 関数に分割するメリットはもう一つあります。 # 引数、戻り値を考えることで、その部分の処理内容を再度整理することが # できます。 # あと、必要のない変数を関数内に局所化できるのも大きなメリットです。 3 については、初心者の方はわりと軽視されているように思います。 変数名として安易に「a」とか「bbb」とかつけていませんか。 for ループのカウンタに「i」とか「j」とかつけていませんか。 多少変数名が長くなっても、わかりやすい変数名をつけることで、それまで必要だったコメントが必要なくなることも多いものです。 関数名も同様ですね。 ちなみに、私は、変数→「名詞」、関数→「動詞」という感じで名前をつけるようにしています。 4 については、初心者に限らず軽視している人が不思議と多いことに最近気づきました。 処理の修正よりも、データ構造の修正の方が、後々の修正インパクトは大きいです。 [データ構造]  C なら構造体、C++ ならクラスにまとめてしまうことが多いですよね。 あと、マジックナンバーは使わずマクロ or ENUM 値を使う、といったところは、あえて言う必要はないと思います。 # No4 jacta さんは、マクロすら使わないほうが良いということですが、 # C++ ならそれも可能だと聞いたことがあります。 # ただ、C だと使わざるを得ないことが。。。 少々長くなってしまいましたが、こんなところでしょうか。

noname#183335
noname#183335
回答No.5

あくまで初心者向けのアドバイスですが、 >構造体、ポインタ、関数、ファイル入力は >理解したのですが このレベルであれば、ずばり「見やすいプログラム」に専念していいと思います。早くて小さくても読みづらいプログラムは改良しにくいですが、遅くて大きくても読みやすいプログラムは後から問題点の修正がしやすくなります。 プログラムを書く際は、 1、まずはわかりやすく書く 2、パフォーマンス、サイズなどを測定する 3、要求に合うようにチューンアップする という順序で考えるのが良いと思います。 まずは構造化プログラミング、グローバル変数を使わない、変数名、関数名をわかりやすくする、クラス化するなどいろいろありますが、一番いいのは人に見てもらうことです。自分がどんなにわかりやすく書いたつもりでも、ほかの人にわからなければ仕方ないですから。 近くにプログラムを見て意見を言ってくれそうな人がいない場合は、逆にほかの人のプログラムを見ることをオススメします。オープンソースのプログラムはいくらでもありますので、マネするのが(時には反面教師もあるかも)いいと思います。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

まず、見やすいソースコードの書き方ですが、以前にもどこかで回答した記憶があるのですが、コメントを一切使わずに、コードのみで理解できる書き方の訓練をすることが効果的です。十分に訓練が出来た後は、必要にお応じて適切にコメントを入れればよいかと思います。 もう一点挙げると、ソースコードから極力マクロを排除してください。定数値も、マクロではなく、列挙体やconstオブジェクトにしてください。 他にもいろいろありますが、ここに書ききることはできません。 プログラムサイズを小さくする方法ですが、一番効果的なのは、例外処理について深く学習することです。C++において、プログラムサイズを増大させる一番の要因は例外処理に関わるものです。 また、仮想関数を極力排除するようにしてください。仮想関数を使うと、実際に呼び出すかどうかに関わらず、全部の仮想関数がリンクされてしまいます。 さらに、ライブラリを作成する場合、出来るだけ関数ごとにファイルを分割するようにしてください。こうすることで、実際に呼び出されない関数はリンクされなくなります。 速いプログラムを書く方法ですが、まずはアルゴリズムを最適化することを考えてください。ただし、凝ったアルゴリズムを使えば、それだけソースコードは読みにくくなります。 次に、特にアプリケーションの場合には、プログラム全体の足を引っ張っている部分は限られていますので、その部分を見つけ出して最適化を図ってください。 最後に、ライブラリ開発の場合は、出来る限りあらゆる箇所の最適化を試みてください。ライブラリは、アプリケーションとは事情が異なります。 具体的なコードの最適化については、アセンブラを学習するようにしてください。コンパイラの出力結果を把握しないと、効果的な最適化はできません。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

良いソースコードではなく、良いプログラムということでよろしいでしょうか?以下、そう解釈して回答します。 良いプログラムは、正しく動作し、性能が高く(速くて小さい)、安定しているものです。 どんなに美しいソースコードを書いても、どんなにハイセンスな設計技法を用いても、ユーザーには何の関係もありませんから。

dirav_syana
質問者

お礼

お返事有難う御座います^^ 何分独学なもので参考書にも 書かれてないので苦労してます^^; あ、それですみません・・ 今の自分レベルで「見やすい容量の少ない良いプログラム」「見やすい処理の速いプログラム」の2通り を意識してこれから作っていきたいと 思っているのですけどどのような事に 注意していけば宜しいでしょうか・・ 自分が分かる事といえば関数を極力使うとか 見やすいように#defineで定義するとかしか知りませんのでどうかjactaさん教えていただけないでしょうか・・ 宜しくお願いします。

  • 2531kbps
  • ベストアンサー率13% (183/1333)
回答No.2

作成時間・安定性・実行速度・メモリ消費量・バイナリの大きさ・メンテナンス等、なにを重要視するかで決まります。 見やすさも確かに大事ですが、マイクロ秒単位で動作を管理するような厳しい条件の場合、コードをマシン語で書くのでこれは非常に見にくいです。この場合、システムや運用方法によってはパッチを当てるのも大変です。

dirav_syana
質問者

お礼

お返事有難う御座います^^ 自分今独学でなんとか理解したのですけど 良いプログラム悪いプログラムというのが全然 分かりませんでした^^; これからはそういった事を意識して作っていこう と思っているのですけど、すみません・・ 今のレベルで「見やすくて容量の少ないプログラム」 見やすくて処理の速いプログラム」を意識して作っていきたいのですけどどのように意識して作っていけば 宜しいでしょうか・・ 自分が分かる事といえば関数を極力使うとか 見やすいように#defineで定義するとかしか知りませんので・・^^; どうか宜しくお願いします。

  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

よいという基準が人それぞれなので、一概にこうとは言えませんが。 初心者の方でしたら、まず ・コメントを書く ・インデント(字下げ)を適切に ・GOTO文を使わない(構造化プログラミング) あたりから始めて ・メモリ消費量を少なく ・高速化 プロ近くなると ・部品化(クラスライブラリ化)を薦める ->生産性の向上 あたりでしょうか。参考URLのあたりも参考に。

参考URL:
http://www.media.osaka-cu.ac.jp/~k-abe/2001-JS-OSAKA-U/8.html
dirav_syana
質問者

お礼

お返事有難う御座います^^ URL拝見しました^^ 初心者の自分にはとても分かりやすかったです。 あ、それですみません・・ 今まだ自分は初心者なのですけどどうしても 今のレベルで「見やすく処理の速いプログラム」 「見やすい容量の小さいプログラム」の2通りを 意識して作っていきたいのですけど どのように意識して作っていけば宜しいでしょうか・・。自分が分かる事といえば関数を極力使うとか 見やすいように#defineで定義するとかしか知りませんのでどうか教えてください・・ 宜しくお願いします。

関連するQ&A

  • プログラムについて

    プログラムを勉強していてわからないことが3つあります。 1ソースプログラムを編集し、次にコンパイルしてオブジェクト プログラムを作成し、さらに関数を引用した場合などには他の オブジェクトプログラムと結合し、最終的に実行形式の プログラムを得て実行します。 と教科書に書いてあるのですが、関数を引用した場合などには他のオブジェクトプログラムと結合するとはどういうことですか? 2メモリを多く費やせば処理は速くなり、処理速度を犠牲にすればメモリを節約できるとありますがなぜこうなるのですか? メモリを節約するとどんなメリットがありますか? 3プログラムの高速化では 必要な演算回数を少なくする。無駄な繰り返しを省く。 速い演算を多くし、遅い演算を少なくする。 とあるのですが具体的にどういうことですか? プログラム初心者です。 わかりやすく教えていただければ幸いです。 どうぞよろしくお願いいたします。

  • C言語でプログラムを作りたい

    現在、C言語を学習中でして、入出力・制御文・配列・演算子・ポインタ・自作関数・構造体・共用体・ファイル入出力くらいはなんとか使えるくらいになったと思うのですが、そこで、一つ自分でプログラムを作ってみたいと考えています。 しかしながら、これまで学習してきたことを駆使して作れるプログラムが思いつきません。 ですので、なにかいいお題があれば教えていただきたいです。 これまで学習してきたことをしっかりと定着させたいと考えています。 宜しくお願いします。

  • 関数ポインタの利点

    こんにちは。 C言語初心者ですが今勉強中です。 その中でポインタについては理解できたのですが、 関数ポインタの利点、使うべき所などが理解できません。 ポインタの基本は理解しています。 値渡し、アドレス渡しも理解しています。 関数ポインタを使うと何がいい、またはどんなとき使わなければならないのか 教本を読んでいてもさっぱりわかりません。 サンプルプログラムを打っても何のために使ってるのかわからないです。 どなたか教えていただけませんでしょうか? よろしくお願いします。

  • 基本的なことを勉強したあとはどうすればよいのでしょうか。

    基本的なことを勉強したあとはどうすればよいのでしょうか。 入門書などで、ポインタや構造体など一通りのことを勉強しましたが、使っている関数が <stdio.h>の標準関数だけでした。 この標準関数というものを調べてみましたが、どうやらあまり高機能でないというか Windowsで使えるようなアプリケーション開発を行うのは無理があるようです といっても、すぐにアプリケーションが作れるとは思っていないのですが このあとどういう勉強をしたらよいでしょうか。 最終的な目標としては、C言語を通してOSの仕組みやPCの基本的な構造を理解できればと思っています。

  • JAVAプログラムの基本的な書き方

    JAVAを始めて数日の者です。 クラス、メソッド、コンストラクタ、インターフェイスなど初心者にはかなりキツイです! どうも理解できません。 プログラムを書くとき、クラス定義したらその度にnew演算子を使うのでしょうか? メソッドとは処理する内容を記述するものなのでしょうか? メインは最後に記述するのでしょうか? 最初に呼び出されるのはメインですか? プログラムを書くとき、頭の中で流れを考えながら英語みたいに組み立てていくのでしょうか? 訳のわからない質問ですが、プログラムを書くときの基本的な注意点を教えてください!

  • C#で、Cのファイルポインタ(?)のような機能

    プログラムの初心者、かつ、C#の初心者です。  C言語では、ファイルポインタを関数から関数へ渡すことができると思うのですが、C# ではどのようにすれば良いのですか? C#を使っていますが、C言語のような構造でプログラムを書いています。  やりたいことは、ファイルポインタを渡しながら、各関数で、ドカドカと計算結果をファイル内に書いていくということです。  宜しくお願いいたします。

  • C言語で計算機をつくりたい

    大学でC言語の基礎の基礎(入門書レベル)を終了したばかりのものです。 一通りの関数とポインタなどは扱えるようになったので、C言語で実際に使えるプログラムを作りたいのです。 最終的には自分でよく使う統計関係の処理(不偏分散)などを行いたいのですが、いきなりそこまではできないのでまずは電卓を作ろうと思い立ちました。 根本的な考え方(どういった関数を使うか、その流れなど)だけで結構ですので、アドバイスを下さい。 お勧めの本、URL等ございましたら教えていただければ幸いです。

  • C言語のvoid型ポインタを使いたいのですが…

    C言語のvoid型ポインタを使いたいのですが… 関数の引数として、void型ポインタを使おうと思ったのですが、内部でどのように処理すればいいのかわかりません キャストすれば問題なく使えるとのことですが、どの型でキャストするのかをどのように判断するのかがわかりません 具体的には、画像処理で画像の構造体をいくつか作ったのですが、それぞれの構造体ごとに関数を書くと関数が多くなるので、void型ポインタでまとめてつくろうとしています どのように型の判断を行えばいいのかを教えてください

  • 電卓プログラムを作りたい。

    わたしは、プログラムの初心者なのですが、力不足でプログラムが作れないのでご協力おねがいします。 データをすべて整数で演算子は、1個だけ用い、標準入力を受け取り、リターンキーが押されると、その解答を標準出力に表示するような、加減乗除の四則演算と整数剰余の演算を繰り返し行うことが可能な電卓プログラムを作りたいのですが、、、。

  • C言語、初心者が書けそうなプログラムとは?

     はじめにお断りしますが、私はプログラマーになるつもりは全くないです。  それとプログラムの知識もほとんど全くありません。  純粋に興味として質問をさせていただきます。 以下はC言語の入門者用の目次からなのですが、 ---------------------------- if,switch,for,while 2次元配列、自作関数、ポインタ、 関数への・コマンドプロンプトでの引数の渡し方 ファイルへの読み込み・書き出し バイナリファイルの入出力 構造体、共用体と列挙体、マクロ、 複数ファイルのプログラム malloc関数 ---------------------------- (1)以上のもの+α程度を習得して、さらに人の助言などによって発展性をもたらすことができたら、具体的に(※)何のプログラムが自作できますか? (※)カレンダー、オセロゲーム など?? (2)C言語を扱うプログラマーとして会社に入社して、最初の1年目で任せられるようなプログラムとは具体的にどういうものがありますか?  特に(2)の質問は範囲が広すぎて回答が困難だと予想されますが、質問している私自身が何もわからない人間なので、質問の範囲を狭めることができません。申し訳ありませんが上手く答えられる方、お願いします。