当前位置:首页 > 软件设计 > 正文内容

面向对象程序设计

邻居的猫1个月前 (12-09)软件设计778

第2次博客作业

一、前语

榜首次作业

榜首次作业有三道题,前两道道为入门的小题,最终一题在之前的答题判别程序上进行了第四次迭代,在标题方面增加了多选题以及填空题,试卷方面增加了多张试卷多个同学答题的输入状况,判题方面增加了部分正确这一得分等级,全体难度较大。

第2次作业

第2次作业有三道题,后两道为入门及简略的小题,榜首题为难度较大的家居电路模仿程序。首要调查对类的特点和办法的规划与运用,以及在规则格局下对程序用户的输入进行解析然后获取电器设备以及操作等信息,并给与相应的输出。

第三次作业

第三次作业只要一道题,即在前一次家居电路模仿程序的基础上进行迭代。增加了并联电路类,改变了输入格局,难度较大。

二、规划与剖析

榜首次作业

SourceMontor报表

image
image
image
3.7% 的代码行包括注释,2 个类中没有特别指出类和接口的注释份额。

均匀每个类有 4 个办法,每个办法均匀有 7.62 条句子,办法的均匀杂乱度方针没有特别指出。最大块深度为 2(指代码块嵌套的层数);均匀块深度为 1.08;均匀杂乱度为 1.00(指办法中不同途径的数量,较高的杂乱度或许意味着办法难以测验和保护)标明代码的杂乱度操控得相对较好。

最杂乱的办法是 Question.Question(),坐落第 11 行。这或许标明 Question.Question() 办法过于杂乱,需求进一步的分化或重构或许需求拆分;其杂乱度为 1,包括 11 条句子,最大深度为 2,调用了 0 次办法调用。这标明 Question.Question() 办法或许需求进一步的优化。

类图

image
Question 类:
包括四个成员变量 id、content、answer 和 isDeleted,标明一个标题的基本信息、答案和删去状况。
包括一个结构办法,用于初始化标题的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 Question 方针。
包括一个笼统办法 grade,用于依据学生答案和满分核算得分,由子类完结具体的判分逻辑。

Paper 类:
包括三个成员变量 id、questionIdToScore 和 sequenceToQuestionId,标明一个试卷的基本信息、标题分值映射和标题次序。
包括一个结构办法,用于初始化试卷的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 Paper 方针。
包括一个办法 getTotalScore,用于核算试卷的总分。

Student 类:
包括两个成员变量 id 和 name,标明学生的基本信息。
包括一个结构办法,用于初始化学生的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 Student 方针列表。

AnswerSheet 类:
运用了 Paper 和 Student 方针来标明答卷信息。包括三个成员变量 paperId、studentId 和 sequenceToAnswer,标明一个答卷的基本信息、学生答案和标题次序。
包括一个结构办法,用于初始化答卷的基本信息。
包括一个静态工厂办法 parseFromInput,用于从输入字符串解析并创立 AnswerSheet 方针。

Main 类:
包括 main 办法,是程序的进口点,包括数据存储结构和事务逻辑。
运用 HashMap、LinkedHashMap 和 ArrayList 来存储 Question、Paper、Student 和 AnswerSheet 方针。
处理输入数据,包括标题、试卷、学生和答卷信息,并进行相应的事务逻辑处理,如判分、输出过错信息和正告信息。

第2次作业

SourceMontor报表

image
image
image
12.9% 的代码行包括注释,没有特别指出类和接口的注释份额。

均匀每个类有 3.67 个办法,每个办法均匀有 6.03 条句子,办法的均匀杂乱度方针没有特别指出。最大块深度为 7(指代码块嵌套的层数);均匀块深度为 2.85;均匀杂乱度为 1.82(指办法中不同途径的数量,较高的杂乱度或许意味着办法难以测验和保护)标明代码的杂乱度操控得相对较好。

最杂乱的办法是 Circuit.calculateVoltages(),坐落第 210 行。这或许标明 Circuit.calculateVoltages() 办法过于杂乱,需求进一步的分化或重构或许需求拆分;其杂乱度为 9,包括 16 条句子,最大深度为 7,调用了 14 次办法调用。这标明 Circuit.calculateVoltages() 办法或许需求进一步的优化。

类图

image
ControlDevice 类:
包括两个成员变量 id、inputVoltage 和 outputVoltage,标明操控设备的标识符、输入电压和输出电压。
包括一个结构办法,用于初始化操控设备的标识符。
包括一个笼统办法 updateOutputVoltage,用于更新设备的输出电压。
包括一个笼统办法 getStatus,用于获取设备的当时状况。

Switch 类:
包括一个成员变量 isClosed,标明开关的当时状况。
包括一个结构办法,用于初始化开关的标识符。
包括一个办法 toggle,用于切换开关的状况。
承继并完结 updateOutputVoltage 办法,依据开关状况更新输出电压。
承继并完结 getStatus 办法,回来开关的当时状况。

StepSpeedController 类:
包括一个成员变量 level,标明分档调速器的当时档位。
包括一个结构办法,用于初始化调速器的标识符。
包括两个办法 incrementLevel 和 decrementLevel,用于调整档位。
承继并完结 updateOutputVoltage 办法,依据档位更新输出电压。
承继并完结 getStatus 办法,回来调速器的当时档位。

ContinuousSpeedController 类:
包括一个成员变量 position,标明接连调速器的当时方位参数。
包括一个结构办法,用于初始化调速器的标识符。
包括一个办法 setPosition,用于设置调速器的方位参数。
承继并完结 updateOutputVoltage 办法,依据方位参数更新输出电压。
承继并完结 getStatus 办法,回来调速器的当时方位参数。

ControlledDevice 类:
包括两个成员变量 id、inputVoltage 和 outputVoltage,标明受控设备的标识符、输入电压和输出电压。
包括一个结构办法,用于初始化受控设备的标识符。
包括一个笼统办法 updateOutputVoltage,用于更新设备的输出电压。
包括一个笼统办法 getStatus,用于获取设备的当时状况。

IncandescentLamp 类:
包括一个结构办法,用于初始化白炽灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
承继并完结 updateOutputVoltage 办法,白炽灯不需求更新输出电压。
承继并完结 getStatus 办法,回来灯具的亮度。

FluorescentLamp 类:
包括一个结构办法,用于初始化日光灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
承继并完结 updateOutputVoltage 办法,日光灯不需求更新输出电压。
承继并完结 getStatus 办法,回来灯具的亮度。

CeilingFan 类:
包括一个结构办法,用于初始化吊扇的标识符。
包括一个办法 calculateSpeed,用于核算电扇的转速。
承继并完结 updateOutputVoltage 办法,吊扇不需求更新输出电压。
承继并完结 getStatus 办法,回来电扇的转速。

Circuit 类:
包括三个成员变量 controlDevices、controlledDevices 和 connections,别离存储操控设备、受控设备和设备间的衔接联系。
包括三个办法 addControlDevice、addControlledDevice 和 connectDevices,用于增加操控设备、受控设备和衔接设备。
包括一个办法 processCommand,用于处理操控指令。
包括一个办法 calculateVoltages,用于核算电路中一切设备的电压。
包括一个办法 outputStates,用于输出一切设备的状况。

Main 类:
包括 main 办法,是程序的进口点,担任读取输入并模仿电路系统的操作。
在 main 办法中,运用 Circuit 方针来办理电路中的一切设备和衔接。
处理输入数据,创立相应的设备方针,衔接设备,并处理操控指令。
最终,核算电路中的电压并输出一切设备的状况。

第三次作业

SourceMontor报表

image
image
image
13.1% 的代码行包括注释,没有特别指出类和接口的注释份额。

均匀每个类有 4.78 个办法,每个办法均匀有 5.42 条句子,办法的均匀杂乱度方针没有特别指出。最大块深度为 7(指代码块嵌套的层数);均匀块深度为 2.23;均匀杂乱度为 1.57(指办法中不同途径的数量,较高的杂乱度或许意味着办法难以测验和保护)标明代码的杂乱度操控得相对较好。

最杂乱的办法是 Circuit.processCommand(),坐落第 282 行。这或许标明 Circuit.processCommand() 办法过于杂乱,需求进一步的分化或重构或许需求拆分;其杂乱度为 9,包括 23 条句子,最大深度为 4,调用了 19 次办法调用。这标明 Circuit.processCommand() 办法或许需求进一步的优化。

类图

image
ControlDevice 类:
包括三个成员变量:设备标识符 id,输入电压 inputVoltage,输出电压 outputVoltage。
包括一个结构办法,用于初始化设备标识符。
包括两个笼统办法:updateOutputVoltage 用于更新设备的输出电压,getStatus 用于获取设备的当时状况。

点击查看代码
// 操控设备的父类
abstract class ControlDevice {
    String id; // 设备标识符
    double inputVoltage = 0; // 输入电压
    double outputVoltage = 0; // 输出电压

    ControlDevice(String id) {
        this.id = id;
    }

    // 更新输出电压的笼统办法,具体完结由子类完结
    abstract void updateOutputVoltage();

    // 获取设备状况的笼统办法,具体完结由子类完结
    abstract String getStatus();
}

Switch 类:
包括一个成员变量 isClosed,标明开关的开闭状况。
包括一个结构办法,用于初始化开关的标识符。
包括一个办法 toggle,用于切换开关的状况。
重写 updateOutputVoltage 办法,依据开关状况更新输出电压。
重写 getStatus 办法,回来开关的当时状况。

点击查看代码
// 开关类,承继自 ControlDevice
class Switch extends ControlDevice {
    boolean isClosed = false; // 初始状况为翻开

    Switch(String id) {
        super(id);
    }

    // 切换开关状况
    void toggle() {
        isClosed = !isClosed;
    }

    @Override
    void updateOutputVoltage() {
        // 开关闭合时输出电压等于输入电压,否则为0
        outputVoltage = isClosed ? inputVoltage : 0;
    }

    @Override
    String getStatus() {
        return "@" + id + ":" + (isClosed ? "closed" : "turned on");
    }
}

StepSpeedController 类:
包括一个成员变量 level,标明分档调速器的档位。
包括一个结构办法,用于初始化调速器的标识符。
包括两个办法 incrementLevel 和 decrementLevel,用于调整档位。
重写 updateOutputVoltage 办法,依据档位更新输出电压。
重写 getStatus 办法,回来调速器的当时档位。

点击查看代码
// 分档调速器类,承继自 ControlDevice
class StepSpeedController extends ControlDevice {
    int level = 0; // 初始档位为0

    StepSpeedController(String id) {
        super(id);
    }

    // 增加档位
    void incrementLevel() {
        if (level < 3) level++;
    }

    // 削减档位
    void decrementLevel() {
        if (level > 0) level--;
    }

    @Override
    void updateOutputVoltage() {
        // 依据档位调整输出电压
        double[] factors = {0, 0.3, 0.6, 0.9};
        outputVoltage = inputVoltage * factors[level];
    }

    @Override
    String getStatus() {
        return "@" + id + ":" + level;
    }
}

ContinuousSpeedController 类:
包括一个成员变量 position,标明接连调速器的方位参数。
包括一个结构办法,用于初始化调速器的标识符。
包括一个办法 setPosition,用于设置调速器的方位参数。
重写 updateOutputVoltage 办法,依据方位参数更新输出电压。
重写 getStatus 办法,回来调速器的当时方位参数。

点击查看代码
// 接连调速器类,承继自 ControlDevice
class ContinuousSpeedController extends ControlDevice {
    double position = 0.00; // 初始档位参数为0.00

    ContinuousSpeedController(String id) {
        super(id);
    }

    // 设置档位参数
    void setPosition(double position) {
        this.position = position;
    }

    @Override
    void updateOutputVoltage() {
        outputVoltage = inputVoltage * position;
    }

    @Override
    String getStatus() {
        return String.format("@%s:%.2f", id, position);
    }
}

ControlledDevice 类:
包括三个成员变量:设备标识符 id,输入电压 inputVoltage,输出电压 outputVoltage。
包括一个结构办法,用于初始化设备标识符。
包括两个笼统办法:updateOutputVoltage 用于更新设备的输出电压,getStatus 用于获取设备的当时状况。

点击查看代码
// 受控设备父类
abstract class ControlledDevice {
    String id; // 设备标识符
    double inputVoltage = 0; // 输入电压
    double outputVoltage = 0; // 输出电压

    ControlledDevice(String id) {
        this.id = id;
    }

    // 更新输出电压的办法,具体完结由子类完结
    abstract void updateOutputVoltage();

    // 获取设备状况的办法,具体完结由子类完结
    abstract String getStatus();
}

IncandescentLamp 类:
包括一个结构办法,用于初始化白炽灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
重写 updateOutputVoltage 办法,白炽灯不需求更新输出电压。
重写 getStatus 办法,回来灯具的亮度。

点击查看代码
// 白炽灯类,承继自 ControlledDevice
class IncandescentLamp extends ControlledDevice {
    IncandescentLamp(String id) {
        super(id);
    }

    // 核算亮度
    int calculateBrightness(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 灯具不需求更新输出电压,依靠电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateBrightness(voltageDifference);
    }
}

FluorescentLamp 类:
包括一个结构办法,用于初始化日光灯的标识符。
包括一个办法 calculateBrightness,用于核算灯具的亮度。
重写 updateOutputVoltage 办法,日光灯不需求更新输出电压。
重写 getStatus 办法,回来灯具的亮度。

点击查看代码
// 日光灯类,承继自 ControlledDevice
class FluorescentLamp extends ControlledDevice {
    FluorescentLamp(String id) {
        super(id);
    }

    // 核算亮度
    int calculateBrightness(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 灯具不需求更新输出电压,依靠电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateBrightness(voltageDifference);
    }
}

CeilingFan 类:
包括一个结构办法,用于初始化吊扇的标识符。
包括一个办法 calculateSpeed,用于核算电扇的转速。
重写 updateOutputVoltage 办法,吊扇不需求更新输出电压。
重写 getStatus 办法,回来电扇的转速。

点击查看代码
// 吊扇类,承继自 ControlledDevice
class CeilingFan extends ControlledDevice {
    CeilingFan(String id) {
        super(id);
    }

    // 核算转速
    int calculateSpeed(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 电扇不需求更新输出电压,依靠电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateSpeed(voltageDifference);
    }
}

FloorFan 类:
包括一个结构办法,用于初始化落地扇的标识符。
包括一个办法 calculateSpeed,用于核算电扇的转速。
重写 updateOutputVoltage 办法,落地扇不需求更新输出电压。
重写 getStatus 办法,回来电扇的转速。

点击查看代码
// 落地扇类,承继自 ControlledDevice
class FloorFan extends ControlledDevice  {
    FloorFan(String id) {
        super(id);
    }

    // 核算转速
    int calculateSpeed(double voltageDifference) {
		//略
    }

    @Override
    void updateOutputVoltage() {
        // 落地扇不需求更新输出电压,依靠电压差
    }

    @Override
    String getStatus() {
        double voltageDifference = Math.abs(inputVoltage - outputVoltage);
        return "@" + id + ":" + calculateSpeed(voltageDifference);
    }
}

SeriesCircuit 类:
包括两个成员变量:电路标识符 id 和衔接列表 connections。
包括一个结构办法,用于初始化电路标识符。
包括一个办法 addConnection,用于增加电路衔接。

点击查看代码
// 串联电路类
class SeriesCircuit {
    String id;
    List<String[]> connections = new ArrayList<>();

    SeriesCircuit(String id) {
        this.id = id;
    }

    void addConnection(String[] connection) {
        connections.add(connection);
    }
}

ParallelCircuit 类:
包括两个成员变量:电路标识符 id 和串联电路列表 seriesCircuits。
包括一个结构办法,用于初始化电路标识符。
包括一个办法 addSeriesCircuit,用于增加串联电路。

点击查看代码
// 并联电路类
class ParallelCircuit {
    String id;
    List<SeriesCircuit> seriesCircuits = new ArrayList<>();

    ParallelCircuit(String id) {
        this.id = id;
    }

    void addSeriesCircuit(SeriesCircuit seriesCircuit) {
        seriesCircuits.add(seriesCircuit);
    }
}

Circuit 类:
包括四个成员变量:操控设备映射 controlDevices,受控设备映射 controlledDevices,串联电路映射 seriesCircuits,和并联电路映射 parallelCircuits。
包括四个办法:addControlDevice 增加操控设备,addControlledDevice 增加受控设备,addSeriesCircuit 增加串联电路,addParallelCircuit 增加并联电路。
包括两个办法:processSeriesCircuit 处理串联电路,processParallelCircuit 处理并联电路。
包括一个办法 processCommand,用于处理操控指令。
包括一个办法 calculateVoltages,用于核算电路中一切设备的电压。
包括一个办法 outputStates,用于输出一切设备的状况。

点击查看代码
// 电路类,办理一切设备及衔接
class Circuit {
    //增加设备,电路

	//处理指令
    void processSeriesCircuit(String line) {
		//略
    }

    // 核算电压
    void calculateVoltages() {
		//略
    }

    // 输出设备状况
    void outputStates() {
		//略
    }

    // 获取设备类型的排序优先级
    private int getOrder(ControlDevice device) {
		//略
    }
}

Main 类:
包括 main 办法,是程序的进口点,担任读取输入并模仿电路系统的操作。
在 main 办法中,运用 Circuit 方针来办理电路中的一切设备和衔接。
处理输入数据,创立相应的设备方针,衔接设备,并处理操控指令。
最终,核算电路中的电压并输出一切设备的状况。

三、踩坑与心得

1.答案过错

答案过错往往是核算逻辑过错或许输出的格局有误。需求用到测验用例进行运转测验,经过比对估计输出以及实践输出的不同找出格局过错,比如说榜首次作业有不全对的标题,要求给一半的分,可是事例测验时答案过错,经过实践输出发现是得分与估计输出不同,所以我查看判分部分的代码,才发现是判别不全对的条件写错了。

点击查看代码
if (hasAllCorrect && !hasError) {
            return fullScore;
        } else if (hasError || userAnswers.isEmpty()) {
            return 0;
        } else {
            return fullScore / 2; // 部分正确,给一半分
        }

2.非零回来

非零回来这一问题困扰了我良久良久,导致前两次作业不太抱负,首要是不理解非零回来究竟指什么,所以我查找材料,究竟什么对错零回来,得到的答案是这样的:

在PTA平台上提交代码时,呈现“非零回来”过错一般意味着程序在运转过程中遇到了反常状况,导致回来状况码不是零。

然并卵:)仍是没说清楚什么是"回来状况码不是零",接着我持续查导致的原因,总结了以下几点:

一、逻辑过错:
描绘:程序中的逻辑过错或许导致某些条件未被满意,成果抛出未捕获的反常或进入死循环。
解决办法:仔细查看代码逻辑,保证一切条件都被正确处理。运用调试器逐渐履行代码,调查变量的改变,确认导致反常的具体方位和原因。
二、数组或列表越界:
描绘:拜访数组或列表时,索引超出范围。
解决办法:在拜访数组或列表之前,查看索引是否在合法范围内。
三、非零回来值:
描绘:程序中调用了System.exit()并传递了非零值。
解办法:防止直接调用System.exit(),让程序天然完毕以保证回来值为0。
四、输入输出过错:
描绘:如测验读取不存在的文件或将数据写入只读的文件。
解决办法:对输入数据进行有效性查看,保证在处理之前数据的合法性。

我一条一条比对时发现,基本上都是第四种状况,说人话即输入的格局过错导致用户输入为空或不符合预期格局,但是,PTA检测时的输入是固定的,所以仍是代码在解析用户输入时有的整理没有考虑到。

四、改善主张及总结

改善主张:尽管老师说测验样例少是为了让我们自己考虑到各个状况,但我仍是觉得至少能够再把测验的提示写具体一点,或许说在提交时刻完毕之后公布出来,这样也能够在时分总结有哪些状况没有考虑到,下一次编写程序的时分就会有前进,这样到达一个学习的意图。而不是不知道就一直是懵的状况,前一次作业有没考虑进去的状况后边迭代的时分就更难了。
image
总结:经过本阶段三次标题集的编写以及提交,我在面向方针的思维上有了进一步的了解,学会了许多JAVA的语法函数。但关于一些相关办法还需求进一步学习及研讨,期望上课时能更多的了解这方面的内容。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=305

分享给朋友:

“面向对象程序设计” 的相关文章

面向对象需求分析,面向对象需求分析概述

面向对象需求分析,面向对象需求分析概述

面向对象需求分析(ObjectOriented Requirement Analysis, OORA)是一种软件工程方法,用于在软件开发过程中识别、理解和表达用户的需求。这种方法强调将系统视为由对象组成的集合,这些对象具有属性(数据)和行为(方法或函数)。面向对象需求分析通常包括以下几个步骤:1....

软件设计方案模板,瘨虹値鍜岀殑鍖哄埆

软件设计方案模板,瘨虹値鍜岀殑鍖哄埆

软件设计方案模板通常包括以下几个部分:1. 项目概述 项目名称 项目背景 项目目标 项目范围 项目周期 项目预算2. 需求分析 用户需求 功能需求 性能需求 安全需求 兼容性需求3. 系统设计 系统架构 模块划分 数...

创建型设计模式,封装对象的创建过程

创建型设计模式,封装对象的创建过程

创建型设计模式是一类设计模式,它们专注于对象创建的过程。这类模式提供了创建对象的最佳实践,使得对象的创建与使用分离,从而提高系统的灵活性和可扩展性。创建型模式包括以下几种:1. 工厂方法模式(Factory Method): 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个...

ios 架构设计,提升应用性能与可维护性的关键

iOS 架构设计是一个复杂的过程,涉及到多个方面,包括但不限于:1. 架构模式:选择合适的架构模式,如 MVC、MVVM、VIPER、Clean Architecture 等。每种模式都有其优缺点,需要根据项目需求进行选择。2. 模块化:将应用拆分成多个模块,每个模块负责不同的功能。这有助于提高代码...

软件设计师高级,职业发展新篇章

职责1. 项目管理和设计:高级软件设计师需要根据项目需求进行系统总体设计,编写程序设计规格说明书,并组织和指导程序员进行编码、调试和测试。2. 技术领导:负责关键模块的设计和开发,解决复杂的技术问题,指导团队成员,提升团队整体技术水平。3. 沟通与协调:与客户、项目经理和其他团队成员进行有效沟通,...

java架构设计,Java架构设计概述

java架构设计,Java架构设计概述

1. 需求分析:首先,需要明确系统的需求,包括功能需求、性能需求、安全性需求等。这有助于确定系统的核心功能和关键性能指标。2. 技术选型:根据需求分析的结果,选择合适的技术栈。这包括选择合适的Java版本、数据库、缓存、消息队列、框架等。3. 系统设计:在技术选型的基础上,进行系统设计。这包括确定系...