【本サイトではGoogleアドセンス、または、アフィリエイト広告を利用しています。】
プログラムを処理単位に分ける意味とは?
プログラムのファイルには、上から1行1行命令文を書いて処理が完成します。
では、もしそのプログラムを修正したいとなった時、
学習用に書いた100行程度のものであれば、
上から眺めていっても修正箇所を見つけることができますが、
システム開発となると、何百、何千というファイルの中に、
何百、何千という行数の命令文が書かれています。
それが1ファイルの中にすべて書かれていたらどうでしょう?
それはもう、辞書に「あいうえお」の索引がないのと同じです。
毎回、1ページ目の1行目から順に、目で追っていく必要があります。
修正の度にとんでもない時間がかかるだけでなく、見落としも出ます。
修正が漏れることで、バグ(プログラムの不具合)が頻発することでしょう。
こういった問題を解決する為に、
変数や処理をうまく整理できるような定義ルールが設けられています。
ルールに従わず、1ファイルにすべての処理を順番に書いても動くのは動きます。
ただ、それでは人間の脳で把握しきれる限界があるのです。
また、システム開発の多くは1人で行うわけではありません。
たとえ1人で作りあげたとしても、そのシステムを後で引き継ぐ人間がいます。
作った人しか触れないプログラムは、永続性がなくいずれ無意味なものになります。
プログラムを見やすく、そして、効率的に書くことを心掛け、
メンテナンス性を意識しながらプログラミングすることはとても大切です。
プログラムを整理する為に作られた共通の定義ルールを使って、
みんながいつまでも使えるプログラムを書くことを目指していきましょう!
今からプログラムを始めるという人は、
前回の内容とあわせて読んでいただくと、より理解が深まると思います!
型|変数に入れる値の種類
プログラムで処理を書く時に必要になる変数ですが、
例えば、足し算の処理と、メッセージを画面に出す処理
の2つのプログラムがあるとします。
足し算する場合は、変数に数値を入れます。
メッセージを画面に出す場合は、変数に文字を入れます。
単純に我々人間側から考えれば、
計算なら数値、会話なら文字と簡単なように見えますが、
プログラムを解析するコンピューターには、
変数に数値を入れたいのか、文字を入れたいのか
人間が頭に描いている意図まで読み取って判断することが難しいのです。
スクリプト言語と呼ばれるものには、変数に入っているデータの種類を
処理の内容によって暗黙的に解析してくれるものもありますが、
あなたが意図したとおりに変換してくれるのかは、
実際に動かして確認しないとわからなかったりします。
そういった、動作確認が必要となる不確実な状況や、
処理を見てから変数を解析するような非効率な状況をなくすために、
JavaやC#といった言語では、事前に変数の種類を決めておいて、
あなたがこの変数を使ってどんな処理をしたいのかを
コンピューターに伝えておくルールになっています。
この変数は、数字として使いますよ!これは文字として使いますよ!
と先に宣言しておくわけです。
変数の型には主に以下のような種類があります。
この時点ですべて理解しておく必要はありません。
また、言語によって種類も少し違ってきます。
今は、こんなものがあるんだなぐらいで覚えておいてください。
型 | 説明 |
---|---|
short | 小さな桁数の整数 |
int | 整数 |
long | 大きな桁数の整数 |
float | 小数 |
double | 大きな桁数の小数 |
char | 1つの文字 |
String | 文字列 |
boolean | true, falseのどちらかの値 |
整数だけ見ても、型になぜこんなに種類があるのかは、
データ領域の確保というお話になってくるのですが、今は気にしなくて大丈夫です。
例えば、整数の変数a、文字列の変数bをそれぞれ定義する時はこのように書きます。
(文字列を値として扱う時は、ダブルクォーテーション「”」で囲います。)
int a = 1; String b = "あいうえお";
関数(メソッド)|一連の手続きをまとめたもの
プログラムを書いていると、同じ処理が何度も出てきます。
例えば、「100を足して2倍する」処理がある時に、
int a = 1; a = a + 100; a = a * 2; … ← いろいろな命令文があって a = a + 100; a = a * 2; … ← いろいろな命令文があって a = a + 100; a = a * 2;
こんな感じで、プログラムのいろんな場所で、3回同じことをする必要があったとします。
ここで、部長に、
あ、やっぱり150を足して4倍する処理にしてくれるかね?
よろしく!
なんて言われたら、さあ大変!
この例は3か所の修正で済みますが、これが1000か所あったらどうでしょう?
よろしくじゃねーよ!
こうなってしまわないように、関数を使いましょう!
関数とは、一連の命令文のまとまりを1つの処理として扱う為の定義です。
関数の定義方法は言語ごとのルールに従うので、ここでは詳しく説明しませんが、
「150足して4倍する関数」の名前を、keisanとすると、
int keisan(int a) { a = a + 150; a = a * 4; return a; ← 計算した結果の入った変数aの値を返す命令文 }
このように関数「keisan」を定義しておくことで、メイン側のプログラムは、
int a = 1; a = keisan(a); … ← いろいろな命令文があって a = keisan(a); … ← いろいろな命令文があって a = keisan(a);
このように書き換えることができます!
これで急にこんなこと言われても、
考えたんだが、8倍する処理の方がいいと思ってね。
よろしく!
関数「keisan」の中身を1行書き換えるだけで作業が済むわけです。
また、こうして同じ処理を1つの場所にまとめることによって、
修正の手間が減るだけでなく、修正漏れも減らすことができます。
クラス|複数の処理をグループにまとめたもの
クラスとは、複数の処理を1つのグループにまとめる定義方法で、
JavaやC#などのオブジェクト指向と呼ばれる言語で使われます。
例えば、1つのプログラムファイルに、以下のような関数があるとします。
- 足し算をする関数「tashizan」
- “おはよう”というメッセージを返す関数「goodmorning」
- 引き算をする関数「hikizan」
- “こんにちは”というメッセージを返す関数「hello」
なんだか、計算する処理と、あいさつする処理がごちゃごちゃになってます。
このまま思いつく順に関数を定義していくと、
とんでもないことになりそうな。。ここから必要な処理を探すのは大変です。
そこで登場するのがクラスです!
これを、「計算クラス」と「挨拶クラス」に分類すれば、
すごくきれいになると思いませんか?
クラスの定義方法は言語によって違うので詳しく説明しませんが、
コードで書くとこのように2つのファイルに分けることができます。
class Keisan { int tashizan(int a, int b) { return a + b; } int hikizan(int a, int b) { return a - b; } }
class Aisatu { String goodmorning() { return "おはよう"; } String hello() { return "こんにちは"; } }
もし、ここで、掛け算をする関数「kakezan」を追加したい時は、
計算クラスに追加すればいいわけです。
“おやすみ”というメッセージを出す関数「goodnight」は、挨拶クラスですね!
このように、クラスを使って、ジャンルごとに似たような分類して整理することで、
関連する処理を見つけやすくしたり、
同じ処理を重複して作ったりすることを防ぐことができます。
コメントアウト|プログラムを読み飛ばす
最後に、プログラムを整理する方法の1つとして、
コメントアウトをご紹介します。
先ほどの計算クラスのプログラムですが、全く説明が入ってない状態です。
class Keisan { int tashizan(int a, int b) { return a + b; } int hikizan(int a, int b) { return a - b; } }
もっと複雑な処理になってくると、何を意図しているのか、
この関数は何をするものなのか、1目見てわかるようにしておきたいものです。
ここで使えるのがコメントアウトです。
コメントアウトとは、プログラムに書き込まれた命令文を読み飛ばす方法です。
言語によって少し異なりますが、例えば、Javaでは、
「//」や「/*」を命令文の前に書き加えることで、
その行のプログラムを処理に含めないようにできます。
これを使うことで、先ほどの計算クラスに、
コメントアウトを使って説明文を書き込むことができます。
// 計算クラス class Keisan { // 足し算をする関数 int tashizan(int a, int b) { return a + b; } // 引き算をする関数 int hikizan(int a, int b) { return a - b; } }
また、処理自体を読み飛ばすという性質を使って、関数全体をコメントアウトすることで、
関数の定義をしていないという状態にもできます。
// 計算クラス class Keisan { // 足し算をする関数 int tashizan(int a, int b) { return a + b; } /* 引き算をする関数 int hikizan(int a, int b) { return a - b; } */ }
このように、「/*」と「*/」で囲われた部分は、すべてコメントアウトという扱いになって、
「引き算をする関数」はプログラムとして認識されないようになります。
まとめ
プログラムを書くということは、処理を動かすということだけではありません。
もちろんコンピューターが処理を正しく解析し、正しく動くことが第一ですが、
プログラムを書くのは我々人間です。
こんな感じで、みんな猫背で書きます。
そして、プログラムは一度書いて終わりではなく、
処理が変更になる度に何度も書き直され、時には人から人へ渡されます。
この記事を通して、そこまで見据えてプログラミングをすることの大切さを
まずは少しでも理解してもらることができれば幸いです。
次も、引き続きプログラミングの基礎文法についてお話します!