软件工程:数据流图,智能汽车代码功能实现(Java)

这篇具有很好参考价值的文章主要介绍了软件工程:数据流图,智能汽车代码功能实现(Java)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

软件工程:数据流图,智能汽车代码功能实现

软件工程

简介

软件工程:数据流图,智能汽车代码功能实现(Java)
软件工程:数据流图,智能汽车代码功能实现(Java)

开闭原则

软件实现应该对扩展开放,对修改关闭,其含义是说一个软件实体应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化的

智能汽车中,确定汽车的加速/减速

软件工程:数据流图,智能汽车代码功能实现(Java)

速度接口

//速度接口
public interface MphInter {
    String getMph(int rpm);
}

速度实现抽象为父类

//1.速度实现类,抽象为父类
public abstract class Mph implements MphInter {
    //2.将转速转化为速度
    @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.通过传入参数rpm,
       经过一系列计算得到了速度mph
       ...
       ...
       */
        //4.比如最后获得到的速度mgh为90迈
        mph = 90;
        //5.这里为了简化逻辑,直接设为加速装填,本来应该和前一个速度相比来判断加速还是减速
        boolean control_speed = true;
        if (control_speed == true) {
            return "+" + mph;
        } else {
            return "-" + mph;
        }
    }
    
    public int getMph() {
        return mph;
    }
}

如果不使用开闭原则,将速度控制方法写于速度实现类中

public class Mph implements MphInter {
    //1.定义速度mph
    private int mph;

    //2.将转速转化为速度
    @Override
    public int getMph(int rpm) {
        /*4.通过传入参数rpm,
        经过一系列计算得到了速度mph
        ...
        ...
        */
        //5.比如最后获得到的速度mgh为90迈
        mph = 90;
        return mph;
    }
    public ControlRpm() {
    }
    public String controlRpm(boolean control_speed){
        if(control_speed == true){
            return "+";
        }else{
            return "-";
        }
    }
    
}

那么后续,如果出现其他需求,比如将速度控制换成 ↑和↓的箭头,或者其他情况

  • 修改接口

    接口MphInter新增方法后,他的实现类Mph也需要重写接口方法,同时接口应该是比较稳定可靠的,不应该随意修改。

  • 修改实现类

    修改Mph类的方法,新增了一个getContrlolRpm的方法,那么将出现两个读取速度的方法,可以实现需求但不是最优解

  • 通过扩展实现变化

    我们可以增加一个子类ControlRpm,来继承父类Mph类,覆写getMph方法(为了简化速度控制逻辑,重新写了一个方法controlRpm进行替代)

后续有新的要求后,可以直接新建子类,继承父类
既可以保证新需求可以实现,又可以保证先有功能的稳定

里氏替换原则

在上述开闭原则中,同时也实现类里氏替换原则,将父类Mph设计为抽象类,让子类ControlRpm继承父类并实现在父类中声明的方法getMph(int rpm)
可以很方便地扩展系统的功能,无需修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

单一职责原则

一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

  • 接受传感信号

    拆分成了两个类:SpsTranslateRpm类 和 FuelConsumption类

    sps转化成rpm实现类
    public class SpsTranslateRpm implements SpsTranslateRpmInter

    油耗量实现对象

    public class FuelConsumption implements FuelConsumptionInter

  • 数据转化控制

    拆分为两个类:Mile类 、 Mph类 、ControlRpm类

    英里实现类
    public class Mile implements MileInter

​ 速度实现类,抽象为父类
public abstract class Mph implements MphInter

​ //速度控制类,Mph的子类

public class ControlRpm extends Mph

  • 驱动仪表板

    拆分为两个类:LedShow类 、RingAlarm类

​ 发光二极管显示实现类
public class LedShow implements LedShowInter

​ 响铃接口实现类,实现超速响铃
public class RingAlarm implements RingAlarmInter

提高类的可维护性和可读写性 一个类的职责少了,复杂度降低了,代码就少了,可读性也就好了,可维护性自然就高了。

降低变更的风险 一个类的职责越多,变更的可能性就越大,变更带来的风险也就越大

接口隔离原则

客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

软件工程:数据流图,智能汽车代码功能实现(Java)

//油耗量接口
public interface FuelConsumptionInter {
    double getMpg(int gph,int mph);
}
//发光二极管显示接口
public interface LedShowInter {
    void ledShow(String something);
}
//行使英里接口
public interface MileInter {
    //得到行使的英里   (rpm转速)
    int getMile(int rpm, int time);
}
//速度接口
public interface MphInter {
    String getMph(int rpm);
}
//超速响铃接口
public interface RingAlarmInter {
    void ring(int mph);
}
//将Sps转化成rpm的接口
public interface SpsTranslateRpmInter {
    int getRpm(int sps);

}

迪米特法则

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

在对其他类的引用上,将引用其他对象的次数降到最低,降低类的耦合

在数字控制面板中,对于对象与对象之间,只能通过get之类的方法来获得其中的对象值,对象并不能直接调用另一个对象的变量。
限制另一个类对本类成员的访问权限

        //1.计算rpm  转速    mph结果为设置的2500
        int rpm = STR.getRpm(125);
        //2.计算英里
        int total_mile = mile.getMile(rpm, 3);
        //3.计算速度     speed为设置的90迈
        String speed = control.getMph(rpm);
        //4.计算油耗量        结果计算为450/90=50
        double fuel_loss = fuelConsumption.getMpg(450, control.getMph());

油耗的计算中也定义了参数mph,避免了直接调用ControlRpm类的成员变量mph

    public double getMpg(int gph, int mph) {
        mpg = mph*1.0 / gph;
        return mpg;
    }

对于ControlRpm类,也是只能通过getMph()来获取成员变量mph

    public int getMph() {
        return mph;
    }

完整代码实现

补充:数字仪表盘设置为抽象类,以适应不同类型的车

接口

分别建立接口文件
FuelConsumptionInter
LedShowInter
MileInter
MphInter
RingAlarmInter
SpsTranslateRpmInter

//油耗量接口
public interface FuelConsumptionInter {
    double getMpg(int gph,int mph);
}
//发光二极管显示接口
public interface LedShowInter {
    void ledShow(String something);
}
//行使英里接口
public interface MileInter {
    //得到行使的英里   (rpm转速)
    int getMile(int rpm, int time);
}
//速度接口
public interface MphInter {
    String getMph(int rpm);
}
//超速响铃接口
public interface RingAlarmInter {
    void ring(int mph);
}
//将Sps转化成rpm的接口
public interface SpsTranslateRpmInter {
    int getRpm(int sps);

}

接口实现类

建立文件

FuelConsumption
LedShow
Mile
Mph
RingAlarm
SpsTranslateRpm
ControlRpm

//油耗量实现对象
public class FuelConsumption implements FuelConsumptionInter {
    //定义mpg为:一加仑能够行驶的英里
    private double mpg;


    //计算mpg的值并返回(gph为油耗量)
    @Override
    public double getMpg(int gph, int mph) {
        mpg = mph*1.0 / gph;
        return mpg;
    }
}
//发光二极管显示实现类
public class LedShow implements LedShowInter {
    //传入需要显示的内容
    @Override
    public void ledShow(String something) {
        System.out.println(something);
    }

}
//英里实现类
public class Mile implements MileInter {
    private int totalMile;

    //计算总的英里数(rpm转速)
    @Override
    public int getMile(int rpm, int time) {
        totalMile = rpm * time;
        return totalMile;
    }
}
//速度实现类,抽象为父类
public abstract class Mph implements MphInter {

    //2.将转速转化为速度
    @Override
    public abstract String getMph(int rpm);
}

//响铃接口实现类,实现超速响铃
public class RingAlarm implements RingAlarmInter{
    //1.定义常量最高速度   和  响铃
    private static final int SPEED_LIMIT = 80;
    //2.默认不响铃
    private boolean ring_alarm = false;


    @Override
    public void ring(int mph) {
        if(mph>=80){
            System.out.println("超速");
            //把响铃设置为true
            ring_alarm = true;
        }
    }

    public boolean isRing_alarm() {
        return ring_alarm;
    }
}
//sps转化成rpm实现类
public class SpsTranslateRpm implements SpsTranslateRpmInter {

    @Override
    //通过sps来计算rpm(转速),并返回
    public int getRpm(int sps) {
        /*通过一系列计算,
        将sps转换成了rpm
        */
        //假设得到最终转化结果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.通过传入参数rpm,
       经过一系列计算得到了速度mph
       ...
       ...
       */
        //5.比如最后获得到的速度mgh为90迈
        mph = 90;
        boolean control_speed = true;
        if (control_speed == true) {
            return "+" + mph;
        } else {
            return "-" + mph;
        }
    }

    public int getMph() {
        return mph;
    }
}

仪表盘数字控制类

//数字仪表板控制
public abstract class DigitalDashboardControl {
    //1.创建油耗量对象
    private FuelConsumption fuelConsumption;
    //2.创建sps转化rpm对象
    private SpsTranslateRpm STR;
    //3.创建速度对象
    private Mph mph;
    //4.创建行使英里对象
    private Mile mile;
    //5.创建发光二极管显示对象
    private LedShow ledShow;
    //6.创建超速警告对象
    private RingAlarm ringAlarm;
    //7.创建速度控制对象
    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.计算rpm  转速    mph结果为设置的2500
        int rpm = STR.getRpm(125);
        //2.计算英里
        int total_mile = mile.getMile(rpm, 3);
        //3.计算速度     speed为设置的90迈
        String speed = control.getMph(rpm);
        //4.计算油耗量        结果计算为450/90=50
        double fuel_loss = fuelConsumption.getMpg(450, control.getMph());

        //5.二极管显示油耗量和里程
        ledShow.ledShow("油耗量:" + fuel_loss);
        ledShow.ledShow("里程:" + total_mile);

//        //6.1获取加速或者减速状态 ,flag  为当前加速+  减速- 状态
//        String flag = control.controlRpm(true);
        //6.2二极管显示速度
        ledShow.ledShow("速度:"+control.getMph(rpm));

        //7.获取响铃状态如果铃声打开中,则在响铃
        //  当前速度为90,  限制的速度为80
        ringAlarm.ring(control.getMph());
        if(ringAlarm.isRing_alarm()==true){
            System.out.println("正在响铃");
        }

    }
}

汽车类

Bus

public class Bus extends DigitalDashboardControl{
    public Bus() {
    }
}

测试类

Test

public class Test {
    public static void main(String[] args) {

        Bus bus = new Bus();
        bus.control();

    }
}

程序运行

软件工程:数据流图,智能汽车代码功能实现(Java)文章来源地址https://www.toymoban.com/news/detail-421917.html

到了这里,关于软件工程:数据流图,智能汽车代码功能实现(Java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ❀工信工实验参考——《VHDL实验1——Quartus软件入门及双(单)向数据流总线的设计》

    一般来说,我贴上来的代码都是能直接跑的,如果不行可以邮箱交流1902946954@qq.com 仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。 免责声明,本人菜只因一只,内容仅供参考,错了不负责哈 地           点:      31  楼   312房; 实验台号: 实验日期与

    2024年02月06日
    浏览(37)
  • 软件工程中的人工智能:如何提高开发效率

    随着人工智能技术的发展,人工智能在软件工程领域的应用也越来越广泛。人工智能可以帮助软件工程师更高效地进行软件开发,提高开发效率。在这篇文章中,我们将讨论人工智能在软件工程中的应用,以及如何利用人工智能提高开发效率。 软件工程是一项复杂的技术,涉

    2024年02月21日
    浏览(85)
  • 什么是Vue的数据流(单向数据流)?如何进行数据流管理

    在Vue中,数据流是指数据的传递和管理方式。Vue采用的是单向数据流,也就是说,数据是从父组件流向子组件,子组件不能直接修改父组件的数据。本文将介绍Vue的数据流机制,以及如何进行数据流管理。 Vue的数据流机制可以分为两类:props和events。 Props 在Vue中,父组件可以

    2024年02月08日
    浏览(62)
  • 人工智能时代,软件工程师们将会被取代?

    作者 :明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐 : (1)《人工智能时代,软件工程师们将会被取代?》 (2)

    2024年01月25日
    浏览(58)
  • 软件工程中的人工智能与机器学习:未来研发效能的驱动力

    人工智能(Artificial Intelligence, AI)和机器学习(Machine Learning, ML)在过去的几年里已经成为软件工程中最热门的话题之一。随着数据量的增加,计算能力的提升以及算法的创新,人工智能和机器学习技术已经成为软件开发过程中不可或缺的一部分。 在软件工程中,人工智能和机器学

    2024年02月21日
    浏览(50)
  • 银行储蓄系统的顶层数据流图及细化数据流图

    绘制出银行储蓄系统的顶层数据流图及细化数据流图; 银行储蓄系统存、取款流程如下: 1)业务员事先录入利率信息; 2)如果是存款,储户填写存款单,业务员将存款单键入系统,系统更新储户存款信息(存款人姓名、存款人账号、电话号码、身份证号码、存款金额、存

    2024年01月17日
    浏览(48)
  • Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

    警告 :此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中,我们将了解如何将现有数据流(data stream)从索引生命周期管理 (ILM) 迁移到数据

    2024年04月29日
    浏览(46)
  • 【研究生复试】计算机&软件工程&人工智能研究生复试——资料整理(速记版)——计算机网络

    1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 序列号:TCP所传送的每段数据都有标有序列号,避免乱序问题 发送端确认应答、超时重传:解决丢包问题 滑动窗口:避免速度过快或多慢丢包和乱序问题 HTTP是无

    2024年02月19日
    浏览(69)
  • 数据流图(DFD)

    数据流图是用于表示系统逻辑模型的一种工具。从数据 传递和加工 的角度,以图形的方式描述数据在系统中流动和处理的过程 数据字典是指对数据的数据项、数据结构、数据流、数据存储、处理逻辑等进行定义和描述,其目的是 对数据流图中的各个元素做出详细的说明 ,

    2024年02月04日
    浏览(51)
  • postman 数据流请求

    备注: Postman version : Version 9.21.3 Windows 版本 1.修改headers 2.Body 部分 选择raw 格式数据 3.最后执行请求

    2024年02月11日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包