SEの現場2004
SE shop.com SEの現場を購入する
SEの現場2004
   
過去記事
第9回 「Javaコース中級編(その4)」
第8回 「Javaコース中級編(その3)」
第7回 「Javaコース中級編(その2)」
第6回 「Javaコース中級編(その1)」
第5回 「Javaコース初級編(Q&A)」
第4回 「Javaコース初級編(その4)」
第3回 「Javaコース初級編(その3)」
第2回 「Javaコース初級編(その2)」
第1回 「Javaコース初級編(その1)」

誌面記事
マンガでわかる
会社・業界図鑑2004
気になる会社の状況と、業界でのポジションが一目でわかる。転職者・新入社員必見!!
SEの職場を拝見
日本オラクル、サイバードなど、「こんな会社で働きたい」職場を持つ企業に突撃取材。本誌未収録写真もアップ。
データベースのセキュリティを考える
今、重要な課題として挙げられるセキュリティの強化。なかでもデータの保護は最も重要です。データは通常データベースに格納されていますが、データベースの中にあれば大丈夫とは言い切れません。この連載ではデータベースのセキュリティについて皆さんと一緒に考えていきたいと思います。
クイズで実践
成功するSEの交渉術
この連載では、SEが獲得すべき交渉のスキルについて、会話形式の例題にそって解説していきます。現場での交渉は毎日が真剣勝負です。ここでは会話に沿って示される選択肢のなかから「これだ」と思うものを選ぶことにより、あなたの交渉スキルをチェックできます。では、さっそく始めましょう。
矢澤久雄の「プロのコード、アマのコード」
「プロらしいコードとは何か?」って聞かれたら、あなたは、何と答えますか? 『プログラムはなぜ動くのか』の著者矢澤久雄がプロのプログラミングを懇切丁寧に教えます。
新人PMに贈る、53通の手紙
え、今日から、プロジェクトマネージャー?期待と不安に満ちた新人PMに贈る現場感が満ちたエールです。
あなたは「もの作り派?」
「マネジメント派?」
 
あなたはどちらの道を選びますか? 自分のキャリアを、限りなくシンプルに考えるためのガイド。
トム・デマルコ インタビュー
プロジェクトマネジメントの神様 トム・デマルコに聞く「PMに必要なもの」。本誌未収録部分も掲載。
SEのための情報源
〜ユーザーグループ・雑誌・書籍〜
『SEの現場 2002〜2004』に掲載した、SEが読むべき雑誌、書籍、ユーザーグループを一挙紹介!
登録記事  
  第3回 Javaコース初級編(その3) 著者顔写真
グレープシティ株式会社 アドバイザリースタッフ
矢澤久雄
2004/4/22

 この記事は、翔泳社で実施する独習ゼミの研修を紙上で再現したものです。

使用したプログラミング言語は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)』翔泳社刊)の中で詳しく説明していますので、 ぜひチャレンジしてください。このテクニックは、オブジェクト指向プログラミングの学習で最後に学ぶ重要なものです。 このテクニックが理解できれば、オブジェクト指向プログラミングは合格だと言えるでしょう。

私からのアドバイスは以上です。アドバイスの内容が高度になってきました。 それだけプログラミング技術が向上したわけですから、どうぞ自信を持ってください。

トップページ
(c) 2004 Shoeisha Co., Ltd. All rights reserved.