|
この記事は、翔泳社で実施する独習ゼミの研修を紙上で再現したものです。
使用したプログラミング言語はJavaです。プログラミング経験の有無から「初級コース」と「中級コース」に分かれて、それぞれ4問ずつプログラミングの課題に取り組んでいただきました。講師を務めた私の役目は、赤ペンでソースコードを添削することでした。提出されたプログラムは、どれもきちんと動作しましたが、誰にも共通した問題がありました。それは「プロらしくない」ということです。
実際に内定者さん(学生さん)から提出していただいたソースコードと添削結果を掲載しますので、皆さんも一緒にプロらしさとは何かを考えてみてください。また、指導する立場の人は、連載で指摘していく項目を意識しながら、後輩指導に取り組んでみるのもよいでしょう。今回は、初級コース第3回の課題を紹介します。なお、提出者の名前は匿名であり、ソースコードも一部を抜粋したものを掲載しています。
☆ ☆

|
以下の3つの図形と面積を表示するJavaアプレットを作成してください。
・底辺50ドット、高さ80ドットの二等辺三角形
・底辺50ドット、高さ80ドットの長方形
・半径40ドットの円
|



import java.applet.Applet;
import java.awt.*;
public class Kadai3 extends Applet {
Sankaku s;
Shikaku s1;
En e1;
public void init() {
// Sankakuクラスのインスタンスを作成する。
s = new Sankaku();
s.x[0] = 35;
s.y[0] = 10;
s.x[1] = 10;
s.y[1] = 90;
s.x[2] = 60;
s.y[2] = 90;
// Shikakuクラスのインスタンスを作成する。
s1 = new Shikaku();
s1.radius = 110;
s1.x = 50;
s1.y = 80;
// Enクラスのインスタンスを作成する。
e1 = new En();
e1.x = 240;
e1.y = 50;
e1.radius = 40;
}
public void paint(Graphics g) {
double m1, m2, m3;
//三角形を描画する
s.draw(g);
// 四角形を描画する。
s1.draw(g);
// 円を描画する。
e1.draw(g);
// 三角形の面積を求める。
m1 = (( s.x[2] - s.x[1] ) * (s.y[2] - s.y[0] ) )/ 2 ;
// 四角形の面積を求める。
m2 = s1.x * s1.y ;
// 円の面積を求める。
m3 = e1.radius * e1.radius * En.PI;
// 三角形の面積を表示する。
g.drawString("面積:" + m1, 10, 110);
// 四角形の面積を表示する。
g.drawString("面積:" + m2, 100, 110);
// 円の面積を表示する。
g.drawString("円の面積:" + m3, 190, 110);
}
}
class Sankaku {
// フィールドの定義
public int x[];
public int y[];
// メソッドの定義
public void draw(Graphics g) {
g.drawPolygon(x, y, x.length);
}
// コンストラクタの定義
public Sankaku() {
int i;
x = new int [3];
y = new int [3];
for (i = 0; i < x.length; i++) {
x[i] = 0;
y[i] = 0;
}
}
}
class Shikaku {
// 変数のフィールドの定義
public int x;
public int y;
public int radius;
// メソッドの定義
public void draw(Graphics g) {
int left, top, width, height;
left = radius;
top = 10;
width = x;
height = y;
g.drawRect(left, top, width, height);
}
// コンストラクタの定義
public Shikaku() {
x = 0;
y = 0;
radius = 0;
}
}
public class En {
// 定数の静的フィールドの定義
public static final double PI = 3.14;
// 変数のフィールドの定義
public int x;
public int y;
public int radius;
// メソッドの定義
public void draw(Graphics g) {
int left, top, width, height;
left = x - radius;
top = y - radius;
width = radius * 2;
height = width;
g.drawOval(left, top, width, height);
}
// コンストラクタの定義
public En() {
x = 0;
y = 0;
radius = 0;
}
}
|

クラスとメンバにもコメントを付けてください
毎度コメントのことを厳しく言うのは、それだけ重要だからです。プロらしいコードとは、誰が見ても分かりやすいコードのことです。他人が作ったコードは、コメントを頼りに読むしかありません。現状でもメソッドの処理内容には丁寧なコメントがありますが、そのメソッド自体が何を行うのか、クラスが何であるのかを示すコメントも必ず書いてください。以下に例を示します
// 三角形を表すクラス
public class Sankaku
{
// 描画を行う
void draw()
{
// 処理内容
・・・
}
}
|
クラスやメンバのコメントは役割や処理の意味を記述する
Sankakuクラスなどで、drawメソッドのコメントが「// メソッドの定義」とい
うようにJava言語の構文の説明になっています。 このままでも学習段階では
構いませんが、 実用的なプログラムでは「// 描画を行う」のように、メソッ
ドの機能をコメントするようにしてください。
フィールドには長い名前を付けましょう
Kadai3クラスの先頭にある3つのフィールドは短い名前であり、それらが何を表しているのかがわかり難くなります。
Sankaku s;
Shikaku s1;
En e1;
|
1〜2文字の短い名前は、メソッドの中で使う変数(ローカル変数)だけに使ってください。
フィールドには、以下のように意味を表す長い名前を付けてください
Sankaku sankaku1;
Shikaku shikaku1;
En en1;
|
面積計算するメソッドを個々の図形に装備しましょう
オブジェクト指向プログラミングは、オブジェクトにメッセージを送ることでプログラムの処理が進んでいきます……と説明すると難しそうですが「オブジェクトにメッセージを送る」とは「メソッドを呼び出す」ということです。メソッドを呼び出すことが、オブジェクトに問い合わせを行っているようなイメージなのです。したがって、面積を計算する処理はSankakuクラス、Shikakuクラス、Enクラスに、それぞれメソッドとして装備したほうがよいでしょう。「おい、三角くん。君の面積はいくつだい?」と問い合わせるのです。
3つの図形のスーパークラスを定義してみましょう
Sankakuクラス、Shikakuクラス、Enクラスの共通点を汎化したZukeiクラスを定義してみましょう。 3つの図形をZukeiクラスで一元管理したわかりやすいプログラムが記述できます。
具体的な方法は、教材(『プログラミング学習シリーズJava(2)』翔泳社刊)の中で詳しく説明していますので、 ぜひチャレンジしてください。このテクニックは、オブジェクト指向プログラミングの学習で最後に学ぶ重要なものです。
このテクニックが理解できれば、オブジェクト指向プログラミングは合格だと言えるでしょう。
私からのアドバイスは以上です。アドバイスの内容が高度になってきました。 それだけプログラミング技術が向上したわけですから、どうぞ自信を持ってください。
|