教育サーバーのページ
オンラインテキスト目次
ソフトウエア入門演習
次の仕様
ガソリン残量 = 0.0 L. 全走行距離 = 0.0 Km.
この車は 20.0 Km 走るために 2.5 L のガソリンが必要。 この車はガソリン 15.0 L 使って 120.0 Km 走る。
ガソリン残量 = 60.0 L. 全走行距離 = 0.0 Km.
ガソリン残量 = 55.0 L. 全走行距離 = 40.0 Km.
ガソリン残量 = 40.0 L. 全走行距離 = 160.0 Km.
ガス欠! 320.0 Km 走りました。 ガソリン残量 = 0.0 L. 全走行距離 = 480.0 Km.
プログラミング,特にオブジェクト指向プログラミング設計において、最初からいきなりソースコードレベルで設計することはあまり意味がない。 ソフトウエア設計の全体を効率よく設計するためにUML(統一モデリング言語:Unified Modeling Language)が使われる。 UMLによって、プログラミング開発者だけでなく、システム仕様策定者やシステムを利用する顧客もが共通の『言葉』にとってシステムの詳細を詰めることが可能になる。
下の図はクラス Engine と クラス Car の依存関係を示している。 クラス Car はクラス Engine を継承している。 クラス Engine にはクラス変数 efficient, capacity, remain が、クラス Car にはクラス変数 tdistance があり、それぞれ次の意味がある:
クラス Engine のメソッドは以下のようである:
double getEfficiency()
燃費の取得
double getRemain()
残量の取得
double getCapacity()
タンク容量の取得
void charge(double gas)
燃料 gas を補給
double needFuel(double amount)
量 amount(距離/電力)の達成に必要な燃料
double runAmount(double fuel)
燃料 fuel によって達成される量(距離/電力)
void getInfo()
情報表示
クラス Engine を継承しているクラス Car のメソッドは以下のようである:
void move(double distance)
距離 distandce だけ進む。燃料残量を更新し、ガス欠になってときは、
そこまでの走行距離を表示し、燃料残量をゼロに。全走行距離を更新。
void getInfo()
全走行距離も表示するようにスーパークラスのメソッドをオーバーライド
┏━━━━━━━━━ Engine.java ━━━━━━
public class Engine {
private double efficiency; // 燃費 (Km/L) / 発電効率 (KW/L)
private double capacity; // タンク容量 (L)
double remain; // ガソリン残量 (L)
Engine(){
efficiency = 10.0;
capacity = 30.0;
remain = 0.0;
}
Engine(double efficient){
this.efficiency = efficient;
capacity = 30.0;
remain = 0.0;
}
Engine(double efficient, double capa){
this.efficiency = efficient;
this.capacity = capa;
remain = 0.0;
}
public double getEfficiency(){ // 燃費の取得
return efficiency;
}
public double getRemain(){ // 残量の取得
return remain;
}
public double getCapacity(){ // タンク容量の取得
return capacity;
}
public void charge(double gas){ // 燃料 gas を補給
if(gas >= this.getCapacity())
remain = this.getCapacity();
else
remain = gas;
}
public double needFuel(double amount){ // 量 amount(距離/電力) の達成に必要な燃料
return (amount / this.getEfficiency());
}
public double runAmount(double fuel){ // 燃料 fuel によって達成される量(距離/電力)
return (fuel * this.getEfficiency());
}
public void getInfo(){ // 情報表示
System.out.println("燃費 = " + this.getEfficiency() + " Km/L.");
System.out.println("タンク容量 = " + this.getCapacity() + " L.");
System.out.println("ガソリン残量 = " + getRemain() + " L.");
}
/*
public static void main(String[] args){
Engine tk1 = new Engine();
Engine tk2 = new Engine(9.0);
Engine tk3 = new Engine(7.0, 50.0);
tk1.getInfo();
tk2.getInfo();
tk3.getInfo();
}
*/
}
注意:このプログラムを単体で動作させるにはmainメソッドの部分をコメント解除(/* */を削除)する必要がある。
┏━━━━━━━━━ Car.java ━━━━━━
public class Car extends Engine {
double tdistance = 0; // 全走行距離
Car(){
super();
}
Car(double efficient){
super(efficient);
}
Car(double efficient, double capa){
super(efficient, capa);
}
public void move(double distance){ // 距離 distandce だけ進もうとする
double nf = this.needFuel(distance);
if(nf > this.remain){
double randist = this.runAmount(this.remain);
System.out.println("ガス欠! " + randist + " Km 走りました。");
this.remain = 0;
tdistance += randist;
} else {
this.remain = this.remain - nf;
tdistance += distance;
}
}
public void getInfo(){
super.getInfo();
System.out.println("全走行距離 = " + tdistance + " Km.");
}
}
getInfo()
needFuel(dist)
runAmount(fuel)
charge(60.0)
getInfo()
move(40.0)
getInfo()
move(120.0)
getInfo()
move(400.0)
getInfo()
% java runCar ---情報---- 燃費 = 8.0 Km/L. タンク容量 = 80.0 L. ガソリン残量 = 0.0 L. 全走行距離 = 0.0 Km. ---------- この車は 20.0 Km 走るために 2.5 L のガソリンが必要。 この車はガソリン 15.0 L 使って 120.0 Km 走る。 ---情報---- 燃費 = 8.0 Km/L. タンク容量 = 80.0 L. ガソリン残量 = 60.0 L. 全走行距離 = 0.0 Km. ---------- ---情報---- 燃費 = 8.0 Km/L. タンク容量 = 80.0 L. ガソリン残量 = 55.0 L. 全走行距離 = 40.0 Km. ---------- ---情報---- 燃費 = 8.0 Km/L. タンク容量 = 80.0 L. ガソリン残量 = 40.0 L. 全走行距離 = 160.0 Km. ---------- ガス欠! 320.0 Km 走りました。 ---情報---- 燃費 = 8.0 Km/L. タンク容量 = 80.0 L. ガソリン残量 = 0.0 L. 全走行距離 = 480.0 Km. ----------