From: リスキルテクノロジー 高坂一城
新宿本校にて
「プログラムの正しい書き方ってあるのでしょうか?」
プログラミングを
学び始めて間もない方から
先日このような質問を受けました。
さて、
そもそもプログラムに...
「正しい書き方」
...はあるのでしょうか?
目次
プログラムって動けばいいの?
プログラムの
正しい書き方というのは
もちろんありますが...
「これが絶対的に正しい!」
...という
明確なものがあるかというと
ちょっと悩んでしまいますね。
エンジニアとして
活躍されておられる方なら
誰もが一度は...
「動けばいいから」
...という言葉を
聞いたことがあるかと思います。
これはプログラムの中身はどうあれ、
システムとして期待している
機能や結果が出ていれば
問題ないよという意味で使われます。
決してシステムの中身が
どうでもいいという訳ではありません。
じゃあ何が「正しい」ってことなの?
いきなりたとえですが...
例えばあなたが
小説を読み始めたとします。
せっかくの休日。
ゆっくりとした時間を取ろうと考えて、
本屋に行って買ってきました。
しかし、
読んでみると、、、
全然理解できない。
前後の文脈が合っているような、あっていないような、、、
「ああ、それが言いたかったのね」
...と後半になってやっと理解できるような
文章だったりすると疲れてしまいます。
ポイントはここです。
正しいプログラムの書き方のポイントも
小説などの文章と同じくここにあります。
まずひとつめは...
1.理解しやすい書き方かどうか
...ですね。
小説でも新聞記事でもそうですが、
文章は読みやすい方がいいです。
プログラムも
文章みたいなものです。
処理そのものはコンピュータがしますが、
人が書いて人が読むものです。
意図が伝わりにくいよりも
伝わりやすい方がいいのです。
システム開発は多くの場合
1人だけでするものではありません。
多くのエンジニアが
集まってシステムを作り上げます。
あるエンジニアが書いたプログラムが
非常に分かりにくいコードで、
そのエンジニアから
「設計書ないから、ソース読んで理解してね」
...と言われても、
言われた方が困りまってしまいますし、
効率の良い開発が行えなくなります。
そしてもうひとつのポイントは...
2.適切な書き方かどうか
...ということです。
処理結果が同じであっても
書かなくても良いことを書いていたり…
書かない方が良い
内容を書いたりしている場合、
そのときは動いていても、
何らかのバグの原因になりかねません。
プログラム言語は
書き方によってはどんな処理もできますが、
プログラム的には
あまり使わない方がいい書き方もあるのです。
javaの例を見てみましょう
簡単な内容ですが、
javaのコード例を少し見てみましょう。
例えばこちらは
雑貨、医薬品、衣類の売り上げを合計し、
平均売上高を出すロジックです。
int a,b,c,t,v;
a = 320000;
b = 200000;
c = 130000;
t = a+b+c;
v = t/3;
コードは短いですが
変数名がa,b,c,t,vとなっています。
これだとぱっと見ただけでは、
変数か何の値を扱うかが分かりにくいですね。
これをこのように書き換えます。
int salesItem = 0;
int salesDrug = 0;
int salesWear = 0;
int total = 0;
double salesAvl = 0.0;
salesItem = 320000;
salesDrug = 200000;
salesWear = 130000;
total = salesItem + salesDrug + salesWear;
salesAvl = total / 3;
変数名をしっかり設定するだけで
何の値を扱う変数か、
どんな処理をしているかがよくわかります。
続いてはこちら、乱数の計算です。
double totalValue = ((Math.random() * 10 )+(Math.random() * 20)-(Math.random() * 5)+(Math.random() * 15));
4つの乱数を加減算していますが、
1行でまとめてしまうと
ちょっと長くて読みにくいです。
これくらいならまだ読めますが、
もっと長い処理を1行で書こうとする
エンジニアもいらっしゃいますね。
double firstValue = Math.random() * 10;
double secondValue = Math.random() * 20;
double thirdValue = Math.random() * 5;
double fourthValue = Math.random() * 15;
double totalValue = firstValue + secondValue - thirdValue + fourthValue;
こちらはこのように書き換えると
乱数との積を求める値もわかりますし、
パッと見て理解できるかと思います。
続いては条件文です。
public boolean checkTarget(int targetValue){
if (checkValue1(targetValue) == 0){
if(checkValue2(targetValue) == 0){
if(checkValue3(targetValue) == 0){
if(checkValue4(targetValue) == 0){
if(checkValue5(targetValue) == 0){
return true;
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}else{
return false;
}
}
checkValue1~5の
5つのチェック全てにおいて
値が0かどうかをチェックしていますが、
ネスト(入れ子)が多すぎて
わかりにくいですね。
同じ処理をこのように書き換えると
見づらさは解消されます。
public boolean checkTarget(int targetValue){
boolean ret = false;
if(checkValue1(targetValue) == 0 &&
checkValue2(targetValue) == 0 &&
checkValue3(targetValue) == 0 &&
checkValue4(targetValue) == 0 &&
checkValue5(targetValue) == 0 ){
ret = true;
}
return ret;
}
最後にもうひとつ、
こちらはオブジェクト指向的な話です。
public class classA(){
public int ValueA = 0;
public int ValueB = 0;
...
}
このようなクラスがあります。
public変数はどのクラスからでも
参照できるものですが、
クラスの依存性が明確になりませんし、
カプセル化の観点からもあまり良いとは言えません。
public変数は
そのクラス内からのみ参照できる
private変数に変更して...
setter、getterと呼ばれる
値の設定と取得を行うメソッドを設定しましょう。
public class classA(){
private int valueA = 0;
private int valueB = 0;
public void setValueA(int _valueA){
valueA = _valueA;
}
public int getValueA(){
return valueA;
}
...
}
...こんな感じですね。
エンジニアとしての質を高める
このように
書き方ひとつで読みやすさが
段違いに変わってきます。
読みやすさが向上すると
メンテナンス性が高まりますので、
長い目でシステムを見た時に
バグが発生する可能性が低くなるのです。
このような
プログラムの取決めは
「コーディング規約」
にまとめられています。
javaの場合は
いくつかの団体が
コーディング規約を公表しています。
日本の企業でも
公表している企業がありますが、
開発経験が長い企業だと
独自のコーディング規約を作っている企業もあります。
プログラムをプロダクトして考えると
プロダクトの質を高めることが大切です。
その質を高めるためには
コーディング規約などによって
読みやすさや適切な処理などを
高める必要があります。
もちろんコーディング規約だけが
質を高める要素ではありません。
システムとして総合的な質を高めるには
プロジェクトの進め方や設計手法など
さまざまな要素の質を高めなければなりません。
全ての質を高めるには
多くの時間と経験が必要になりますが、
まずは基本となる...
「プログラムの質」
...を高めることから
エンジニアとしての意識を高めてゆきましょう。
PS