教育サーバーのページ
オンラインテキスト目次
ソフトウエア入門演習
次の仕様
ガソリン残量 = 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 があり、それぞれ次の意味がある:
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. ----------