軟件工程:數(shù)據(jù)流圖,智能汽車代碼功能實(shí)現(xiàn)
軟件工程
簡(jiǎn)介
開閉原則
軟件實(shí)現(xiàn)應(yīng)該對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉,其含義是說一個(gè)軟件實(shí)體應(yīng)該通過擴(kuò)展來實(shí)現(xiàn)變化,而不是通過修改已有的代碼來實(shí)現(xiàn)變化的
智能汽車中,確定汽車的加速/減速
速度接口
//速度接口
public interface MphInter {
String getMph(int rpm);
}
速度實(shí)現(xiàn)抽象為父類
//1.速度實(shí)現(xiàn)類,抽象為父類
public abstract class Mph implements MphInter {
//2.將轉(zhuǎn)速轉(zhuǎn)化為速度
@Override
public abstract String getMph(int rpm);
}
速度控制,子類ControlRpm繼承抽象父類
public class ControlRpm extends Mph {
//1.定義速度mph
private int mph;
//2.重寫父類方法
@Override
public String getMph(int rpm) {
/*3.通過傳入?yún)?shù)rpm,
經(jīng)過一系列計(jì)算得到了速度mph
...
...
*/
//4.比如最后獲得到的速度mgh為90邁
mph = 90;
//5.這里為了簡(jiǎn)化邏輯,直接設(shè)為加速裝填,本來應(yīng)該和前一個(gè)速度相比來判斷加速還是減速
boolean control_speed = true;
if (control_speed == true) {
return "+" + mph;
} else {
return "-" + mph;
}
}
public int getMph() {
return mph;
}
}
如果不使用開閉原則,將速度控制方法寫于速度實(shí)現(xiàn)類中
public class Mph implements MphInter {
//1.定義速度mph
private int mph;
//2.將轉(zhuǎn)速轉(zhuǎn)化為速度
@Override
public int getMph(int rpm) {
/*4.通過傳入?yún)?shù)rpm,
經(jīng)過一系列計(jì)算得到了速度mph
...
...
*/
//5.比如最后獲得到的速度mgh為90邁
mph = 90;
return mph;
}
public ControlRpm() {
}
public String controlRpm(boolean control_speed){
if(control_speed == true){
return "+";
}else{
return "-";
}
}
}
那么后續(xù),如果出現(xiàn)其他需求,比如將速度控制換成 ↑和↓的箭頭,或者其他情況
-
修改接口
接口MphInter新增方法后,他的實(shí)現(xiàn)類Mph也需要重寫接口方法,同時(shí)接口應(yīng)該是比較穩(wěn)定可靠的,不應(yīng)該隨意修改。
-
修改實(shí)現(xiàn)類
修改Mph類的方法,新增了一個(gè)getContrlolRpm的方法,那么將出現(xiàn)兩個(gè)讀取速度的方法,可以實(shí)現(xiàn)需求但不是最優(yōu)解
-
通過擴(kuò)展實(shí)現(xiàn)變化
我們可以增加一個(gè)子類ControlRpm,來繼承父類Mph類,覆寫getMph方法(為了簡(jiǎn)化速度控制邏輯,重新寫了一個(gè)方法controlRpm進(jìn)行替代)
后續(xù)有新的要求后,可以直接新建子類,繼承父類
既可以保證新需求可以實(shí)現(xiàn),又可以保證先有功能的穩(wěn)定
里氏替換原則
在上述開閉原則中,同時(shí)也實(shí)現(xiàn)類里氏替換原則,將父類Mph設(shè)計(jì)為抽象類,讓子類ControlRpm繼承父類并實(shí)現(xiàn)在父類中聲明的方法getMph(int rpm)
可以很方便地?cái)U(kuò)展系統(tǒng)的功能,無需修改原有子類的代碼,增加新的功能可以通過增加一個(gè)新的子類來實(shí)現(xiàn)。
單一職責(zé)原則
一個(gè)對(duì)象應(yīng)該只包含單一的職責(zé),并且該職責(zé)被完整地封裝在一個(gè)類中。
-
接受傳感信號(hào)
拆分成了兩個(gè)類:SpsTranslateRpm類 和 FuelConsumption類
sps轉(zhuǎn)化成rpm實(shí)現(xiàn)類
public class SpsTranslateRpm implements SpsTranslateRpmInter
油耗量實(shí)現(xiàn)對(duì)象
public class FuelConsumption implements FuelConsumptionInter
-
數(shù)據(jù)轉(zhuǎn)化控制
拆分為兩個(gè)類:Mile類 、 Mph類 、ControlRpm類
英里實(shí)現(xiàn)類
public class Mile implements MileInter
? 速度實(shí)現(xiàn)類,抽象為父類
? public abstract class Mph implements MphInter
? //速度控制類,Mph的子類
? public class ControlRpm extends Mph
-
驅(qū)動(dòng)儀表板
拆分為兩個(gè)類:LedShow類 、RingAlarm類
? 發(fā)光二極管顯示實(shí)現(xiàn)類
? public class LedShow implements LedShowInter
? 響鈴接口實(shí)現(xiàn)類,實(shí)現(xiàn)超速響鈴
? public class RingAlarm implements RingAlarmInter
提高類的可維護(hù)性和可讀寫性 一個(gè)類的職責(zé)少了,復(fù)雜度降低了,代碼就少了,可讀性也就好了,可維護(hù)性自然就高了。
降低變更的風(fēng)險(xiǎn) 一個(gè)類的職責(zé)越多,變更的可能性就越大,變更帶來的風(fēng)險(xiǎn)也就越大
接口隔離原則
客戶端不應(yīng)該依賴它不需要的接口;一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上。
//油耗量接口
public interface FuelConsumptionInter {
double getMpg(int gph,int mph);
}
//發(fā)光二極管顯示接口
public interface LedShowInter {
void ledShow(String something);
}
//行使英里接口
public interface MileInter {
//得到行使的英里 (rpm轉(zhuǎn)速)
int getMile(int rpm, int time);
}
//速度接口
public interface MphInter {
String getMph(int rpm);
}
//超速響鈴接口
public interface RingAlarmInter {
void ring(int mph);
}
//將Sps轉(zhuǎn)化成rpm的接口
public interface SpsTranslateRpmInter {
int getRpm(int sps);
}
迪米特法則
如果兩個(gè)類不必彼此直接通信,那么這兩個(gè)類就不應(yīng)當(dāng)發(fā)生直接的相互作用。如果其中的一個(gè)類需要調(diào)用另一個(gè)類的某一個(gè)方法的話,可以通過第三者轉(zhuǎn)發(fā)這個(gè)調(diào)用。
在對(duì)其他類的引用上,將引用其他對(duì)象的次數(shù)降到最低,降低類的耦合
在數(shù)字控制面板中,對(duì)于對(duì)象與對(duì)象之間,只能通過get之類的方法來獲得其中的對(duì)象值,對(duì)象并不能直接調(diào)用另一個(gè)對(duì)象的變量。
限制另一個(gè)類對(duì)本類成員的訪問權(quán)限
//1.計(jì)算rpm 轉(zhuǎn)速 mph結(jié)果為設(shè)置的2500
int rpm = STR.getRpm(125);
//2.計(jì)算英里
int total_mile = mile.getMile(rpm, 3);
//3.計(jì)算速度 speed為設(shè)置的90邁
String speed = control.getMph(rpm);
//4.計(jì)算油耗量 結(jié)果計(jì)算為450/90=50
double fuel_loss = fuelConsumption.getMpg(450, control.getMph());
油耗的計(jì)算中也定義了參數(shù)mph,避免了直接調(diào)用ControlRpm類的成員變量mph
public double getMpg(int gph, int mph) {
mpg = mph*1.0 / gph;
return mpg;
}
對(duì)于ControlRpm類,也是只能通過getMph()來獲取成員變量mph
public int getMph() {
return mph;
}
完整代碼實(shí)現(xiàn)
補(bǔ)充:數(shù)字儀表盤設(shè)置為抽象類,以適應(yīng)不同類型的車
接口
分別建立接口文件
FuelConsumptionInter
LedShowInter
MileInter
MphInter
RingAlarmInter
SpsTranslateRpmInter
//油耗量接口
public interface FuelConsumptionInter {
double getMpg(int gph,int mph);
}
//發(fā)光二極管顯示接口
public interface LedShowInter {
void ledShow(String something);
}
//行使英里接口
public interface MileInter {
//得到行使的英里 (rpm轉(zhuǎn)速)
int getMile(int rpm, int time);
}
//速度接口
public interface MphInter {
String getMph(int rpm);
}
//超速響鈴接口
public interface RingAlarmInter {
void ring(int mph);
}
//將Sps轉(zhuǎn)化成rpm的接口
public interface SpsTranslateRpmInter {
int getRpm(int sps);
}
接口實(shí)現(xiàn)類
建立文件
FuelConsumption
LedShow
Mile
Mph
RingAlarm
SpsTranslateRpm
ControlRpm
//油耗量實(shí)現(xiàn)對(duì)象
public class FuelConsumption implements FuelConsumptionInter {
//定義mpg為:一加侖能夠行駛的英里
private double mpg;
//計(jì)算mpg的值并返回(gph為油耗量)
@Override
public double getMpg(int gph, int mph) {
mpg = mph*1.0 / gph;
return mpg;
}
}
//發(fā)光二極管顯示實(shí)現(xiàn)類
public class LedShow implements LedShowInter {
//傳入需要顯示的內(nèi)容
@Override
public void ledShow(String something) {
System.out.println(something);
}
}
//英里實(shí)現(xiàn)類
public class Mile implements MileInter {
private int totalMile;
//計(jì)算總的英里數(shù)(rpm轉(zhuǎn)速)
@Override
public int getMile(int rpm, int time) {
totalMile = rpm * time;
return totalMile;
}
}
//速度實(shí)現(xiàn)類,抽象為父類
public abstract class Mph implements MphInter {
//2.將轉(zhuǎn)速轉(zhuǎn)化為速度
@Override
public abstract String getMph(int rpm);
}
//響鈴接口實(shí)現(xiàn)類,實(shí)現(xiàn)超速響鈴
public class RingAlarm implements RingAlarmInter{
//1.定義常量最高速度 和 響鈴
private static final int SPEED_LIMIT = 80;
//2.默認(rèn)不響鈴
private boolean ring_alarm = false;
@Override
public void ring(int mph) {
if(mph>=80){
System.out.println("超速");
//把響鈴設(shè)置為true
ring_alarm = true;
}
}
public boolean isRing_alarm() {
return ring_alarm;
}
}
//sps轉(zhuǎn)化成rpm實(shí)現(xiàn)類
public class SpsTranslateRpm implements SpsTranslateRpmInter {
@Override
//通過sps來計(jì)算rpm(轉(zhuǎn)速),并返回
public int getRpm(int sps) {
/*通過一系列計(jì)算,
將sps轉(zhuǎn)換成了rpm
*/
//假設(shè)得到最終轉(zhuǎn)化結(jié)果rpm為2500
int rpm = 2500;
return rpm;
}
}
//速度控制類,Mph的子類
public class ControlRpm extends Mph {
//1.定義速度mph
private int mph;
@Override
public String getMph(int rpm) {
/*4.通過傳入?yún)?shù)rpm,
經(jīng)過一系列計(jì)算得到了速度mph
...
...
*/
//5.比如最后獲得到的速度mgh為90邁
mph = 90;
boolean control_speed = true;
if (control_speed == true) {
return "+" + mph;
} else {
return "-" + mph;
}
}
public int getMph() {
return mph;
}
}
儀表盤數(shù)字控制類
//數(shù)字儀表板控制
public abstract class DigitalDashboardControl {
//1.創(chuàng)建油耗量對(duì)象
private FuelConsumption fuelConsumption;
//2.創(chuàng)建sps轉(zhuǎn)化rpm對(duì)象
private SpsTranslateRpm STR;
//3.創(chuàng)建速度對(duì)象
private Mph mph;
//4.創(chuàng)建行使英里對(duì)象
private Mile mile;
//5.創(chuàng)建發(fā)光二極管顯示對(duì)象
private LedShow ledShow;
//6.創(chuàng)建超速警告對(duì)象
private RingAlarm ringAlarm;
//7.創(chuàng)建速度控制對(duì)象
private ControlRpm control;
public DigitalDashboardControl() {
fuelConsumption = new FuelConsumption();
STR = new SpsTranslateRpm();
mile = new Mile();
ledShow = new LedShow();
ringAlarm = new RingAlarm();
control = new ControlRpm();
}
public void control() {
//1.計(jì)算rpm 轉(zhuǎn)速 mph結(jié)果為設(shè)置的2500
int rpm = STR.getRpm(125);
//2.計(jì)算英里
int total_mile = mile.getMile(rpm, 3);
//3.計(jì)算速度 speed為設(shè)置的90邁
String speed = control.getMph(rpm);
//4.計(jì)算油耗量 結(jié)果計(jì)算為450/90=50
double fuel_loss = fuelConsumption.getMpg(450, control.getMph());
//5.二極管顯示油耗量和里程
ledShow.ledShow("油耗量:" + fuel_loss);
ledShow.ledShow("里程:" + total_mile);
// //6.1獲取加速或者減速狀態(tài) ,flag 為當(dāng)前加速+ 減速- 狀態(tài)
// String flag = control.controlRpm(true);
//6.2二極管顯示速度
ledShow.ledShow("速度:"+control.getMph(rpm));
//7.獲取響鈴狀態(tài)如果鈴聲打開中,則在響鈴
// 當(dāng)前速度為90, 限制的速度為80
ringAlarm.ring(control.getMph());
if(ringAlarm.isRing_alarm()==true){
System.out.println("正在響鈴");
}
}
}
汽車類
Bus
public class Bus extends DigitalDashboardControl{
public Bus() {
}
}
測(cè)試類
Test文章來源:http://www.zghlxwxcb.cn/news/detail-421917.html
public class Test {
public static void main(String[] args) {
Bus bus = new Bus();
bus.control();
}
}
程序運(yùn)行
文章來源地址http://www.zghlxwxcb.cn/news/detail-421917.html
到了這里,關(guān)于軟件工程:數(shù)據(jù)流圖,智能汽車代碼功能實(shí)現(xiàn)(Java)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!