(MIT-6.031)软件编写要求

0. 课程目标

概念

6.005课程的主要目标是学习如何编写具有以下属性的软件:

安全性

  1. 代码无Bug,防御性编程:

    • 使用输入验证:验证所有输入的数据,防止注入攻击和非法输入。
    • 错误处理:使用try-catch块捕获异常并处理错误,防止程序崩溃。
    • 边界检查:检查数组和集合的边界,避免越界错误。
  2. 静态检查、动态检查:

    • 静态检查工具:使用Lint工具(如ESLint, Pylint)和静态代码分析工具(如SonarQube)进行代码检查,发现潜在的错误和代码异味。
    • 单元测试:编写单元测试(如JUnit, pytest),确保代码在各种情况下都能正确运行。
    • 动态分析工具:使用动态分析工具(如Valgrind)检测运行时错误和内存泄漏。

易读性

  1. 代码易于理解和修改:

    • 命名规范:使用有意义的变量名、函数名和类名,遵循命名约定(如camelCase, snake_case)。
    • 代码风格一致性:使用代码格式化工具(如Prettier, Black)保持代码风格一致。
    • 注释:在复杂或关键的代码块添加注释,解释代码逻辑和意图。
  2. 文档化假设、使用final关键字:

    • 文档化假设:在代码中使用注释或文档工具(如Javadoc, Sphinx)说明代码的假设和前提条件。
    • 使用final关键字:在Java中,对不希望被修改的变量、方法和类使用final关键字,增加代码的可读性和稳定性。

可修改性

  1. 代码易于更新和扩展:

    • 模块化设计:将代码拆分为独立的模块或组件,减少耦合,增加代码的可复用性和可维护性。
    • 接口和抽象类:使用接口和抽象类定义代码的契约,方便以后替换或扩展实现。
  2. 文档化假设、静态检查:

    • 文档化假设:在代码中记录假设和设计决策,帮助后续的开发人员理解和维护代码。
    • 静态检查工具:使用静态分析工具检查代码的结构和依赖,确保代码符合设计规范,容易扩展。

1. 数组和集合

数组是定长的类型序列,而列表是变长的类型序列。
// 使用列表
List<Integer> list = new ArrayList<Integer>();
list.add(n);

// 使用数组
int[] a = new int[100];
a[i] = n;

2. 迭代 

使用for循环遍历数组或列表中的元素。
// 找到冰雹序列中的最大值
int max = 0;
for (int x : list) {
    max = Math.max(x, max);
}

3. 方法

在Java中,所有语句必须在方法中,每个方法必须在类中。
public class Hailstone {
    public static List<Integer> hailstoneSequence(int n) {
        List<Integer> list = new ArrayList<Integer>();
        while (n != 1) {
            list.add(n);
            if (n % 2 == 0) {
                n = n / 2;
            } else {
                n = 3 * n + 1;
            }
        }
        list.add(n);
        return list;
    }
}

 4. 不变性与变化

不变性是指对象一旦创建,其状态就不能改变。final关键字用于创建不可变引用。

辩析:

  • 在Java中,final可以用来修饰对象引用,表示该引用不可更改,但对象的内容仍然可以更改。
  • 在C++中,const可以修饰指针,表示指针本身不可变,或指向的对象不可变,或者两者都不可变。
public static List<Integer> hailstoneSequence(final int n) { 
    final List<Integer> list = new ArrayList<Integer>();
    // 生成序列的代码
}

5.文档化假设

记录代码中的假设,例如变量类型、方法参数要求等,有助于提高代码的可读性和可靠性。
/**
 * 计算冰雹序列。
 * @param n  序列起始数。假设n > 0。
 * @return 以n开头并以1结尾的冰雹序列。
 */
public static List<Integer> hailstoneSequence(int n) {
    // 方法实现
}

6.黑客派与工程派

黑客派编写大量代码而不测试,工程派逐步编写并测试代码,记录假设并进行防御性编程。
class BankAccount {
    private double balance;

    // 记录假设:initialBalance不能为负数
    public BankAccount(double initialBalance) {
        if (initialBalance < 0) {
            throw new IllegalArgumentException("Initial balance cannot be negative");
        }
        this.balance = initialBalance;
    }

    // 防御性编程:deposit金额必须为正数
    public void deposit(double amount) {
        if (amount <= 0) {
            throw new IllegalArgumentException("Deposit amount must be positive");
        }
        balance += amount;
    }

    // 防御性编程:withdraw金额必须为正数,且不能超过当前余额
    public void withdraw(double amount) {
        if (amount <= 0 || amount > balance) {
            throw new IllegalArgumentException("Invalid withdrawal amount");
        }
        balance -= amount;
    }

    public double getBalance() {
        return balance;
    }
}

public class BankAccountTest {
    public static void main(String[] args) {
        // 测试初始余额
        BankAccount account = new BankAccount(1000);
        assert account.getBalance() == 1000;

        // 测试存款
        account.deposit(500);
        assert account.getBalance() == 1500;

        // 测试取款
        account.withdraw(200);
        assert account.getBalance() == 1300;

        // 测试无效存款
        try {
            account.deposit(-100);
        } catch (IllegalArgumentException e) {
            assert e.getMessage().equals("Deposit amount must be positive");
        }

        // 测试无效取款
        try {
            account.withdraw(2000);
        } catch (IllegalArgumentException e) {
            assert e.getMessage().equals("Invalid withdrawal amount");
        }
    }
}
  1. 记录假设:在构造函数中记录并验证初始余额不能为负数。
  2. 防御性编程:在存款和取款方法中进行输入验证。
  3. 逐步测试:在主方法中逐步测试每个功能点,包括正常情况和异常情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/649502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

信息安全基础(补充)

&#xff09;的内容主要有数据备份、数据修复、系统恢复等。响应&#xff08;Respons&#xff09;的内容主要有应急策略、应急机制、应急手段、入侵过程分析及安全状态评估等。 面向数据挖掘的隐私保护技术主要解决高层应用中的隐私保护问题&#xff0c;致力于研究如何根据不同…

html5各行各业官网模板源码下载(2)

文章目录 1.来源2.源码模板2.1 HTML5好看的旅行网站模板源码2.2 HTML5自适应医院叫号大屏模板源码2.3 HTML5好看的高科技登录页面模板源码2.4 HTML5宠物美容服务公司网站模板源码2.5 HTML5创意品牌广告设计公司网站模板源码2.6 HTML5实现室内设计模板源码2.7 HTML5黄金首饰网站…

PL5358A 单芯锂离子/聚合物电池保护IC芯片

一般说明 PL5358A系列产品是锂离子/聚合物电池保护的高集成解决方案。PL5358A包含先进 的功率MOSFET&#xff0c;高精度电压检测电路和延迟电路。5358A被放入一个超小的SOT23-5封装&#xff0c;只有一个外部元件&#xff0c;使其成为理想的解决方案&#xff0c;在有限的…

美业SaaS收银系统源码-已过期卡项需要延期怎么操作?美业系统实操

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1.询问会员手机号和需要延期的卡项 2.PC运营后端-数据导入-修改已售卡项&#xff0c;搜索手机号 3.把需要卡项选…

D - Permutation Subsequence(AtCoder Beginner Contest 352)

题目链接: D - Permutation Subsequence (atcoder.jp) 题目大意&#xff1a; 分析&#xff1a; 相对于是记录一下每个数的位置 然后再长度为k的区间进行移动 然后看最大的pos和最小的pos的最小值是多少 有点类似于滑动窗口 用到了java里面的 TreeSet和Map TreeSet存的是数…

Vue3中如何自定义消息总线

前言 在 Vue 开发中&#xff0c;组件之间的通信是一个常见的需求&#xff0c;无论是父组件向子组件传递数据&#xff0c;还是子组件向父组件传递数据&#xff0c;甚至是兄弟组件之间的数据交换。这些通信需求在构建复杂的 Vue 应用时尤为关键。 Vue 提供了多种组件通信的方式…

Linux系统安装AMH服务器管理面板并实现远程访问管理维护

目录 前言 1. Linux 安装AMH 面板 2. 本地访问AMH 面板 3. Linux安装Cpolar 4. 配置AMH面板公网地址 5. 远程访问AMH面板 6. 固定AMH面板公网地址 1. 部署Docker Registry 2. 本地测试推送镜像 3. Linux 安装cpolar 4. 配置Docker Registry公网访问地址 5. 公网远程…

如何被谷歌收录?

最简单的方法就是提交网站给谷歌&#xff0c;但这种方法可操作空间不大&#xff0c;一天一般也就只有十条左右的链接可以提交&#xff0c;对于一些大网站来说&#xff0c;这种方法显然不适用&#xff0c;这时候GPC爬虫池的好处就体现了&#xff0c;GPC爬虫池对希望提升Google搜…

re:记录下正则的使用方法

1、match pattern r(\d{4})[-\/](\d{1,2})[-\/](\d{1,2}) match re.search(pattern, text) if match:year, month, day match.groups()

SolidWorks教育版 学生使用的优势

在工程技术领域的学习中&#xff0c;计算机辅助设计软件&#xff08;CAD&#xff09;如SolidWorks已经成为学生掌握专业知识和技能的必要工具。SolidWorks教育版作为专为教育机构和学生设计的版本&#xff0c;不仅提供了与商业版相同的强大功能&#xff0c;还为学生带来了诸多独…

TypeScript 语言在不改变算法复杂度前提下,细节上性能优化,运行时性能提升效果明显吗?

有经验的专家写的代码&#xff0c;和无经验的新手写的代码&#xff0c;在运行时性能上大概会有多少差异&#xff1f; 个人感觉&#xff0c;常规业务逻辑代码通常可以差 1 倍&#xff1b;如果算上框架的影响&#xff0c;可以差 2~4 倍。 仅考虑业务代码的话&#xff0c;新手容易…

科普:水冷负载的工作原理

水冷负载是一种利用水作为冷却介质&#xff0c;将电子设备产生的热量传递到外部环境的散热方式。它广泛应用于各种电子设备&#xff0c;如服务器、数据中心、电力设备等&#xff0c;以提高设备的运行效率和稳定性。本文将对水冷负载的工作原理进行简要科普。 水冷负载的工作原理…

我被恐吓了,对方扬言要压测我的网站

大家好我是聪&#xff0c;昨天真是水逆&#xff0c;在技术群里交流问题&#xff0c;竟然被人身攻击了&#xff01;骂的话太难听具体就不加讨论了&#xff0c;人身攻击我可以接受&#xff0c;我接受不了他竟然说要刷我接口&#xff01;&#xff01;&#xff01;&#xff01;这下…

C#多维数组不同读取方式的性能差异

背景 近来在优化一个图像显示程序&#xff0c;图像数据存储于一个3维数组data[x,y,z]中&#xff0c;三维数组为一张张图片数据的叠加而来&#xff0c;其中x为图片的张数&#xff0c;y为图片行&#xff0c;Z为图片的列&#xff0c;也就是说这个三维数组存储的为一系列图片的数据…

记录下所遇到远程桌面连接方法winSCP跟mstsc

之前公司使用过连接远程桌面&#xff0c;今天又遇到要使用远程桌面问题&#xff0c;来记录下。 之前公司使用的是winR 然后回车弹出 后面按照用户名密码就能登陆了 今天后台给了我一张图片准备接着用这个方法&#xff0c;后台就说这个东西要下载winSCP 后台发给我图片 然后去…

mfc140u.dll丢失的解决方法有哪些?怎么全面修复mfc140u.dll文件

mfc140u.dll丢失其实相对来说不太常见到&#xff0c;因为这个文件一般是不丢失的&#xff0c;不过既然有人遇到这种问题&#xff0c;那么小编一定满足各位&#xff0c;给大家详细的唠叨一下mfc140u.dll丢失的各种解决方法&#xff0c;教大家以最快最有效率的方法去解决mfc140u.…

python文件IO基础知识

目录 1.open函数打开文件 2.文件对象读写数据和关闭 3.文本文件和二进制文件的区别 4.编码和解码 读写文本文件时 读写二进制文件时 5.文件指针位置 6.文件缓存区与flush()方法 1.open函数打开文件 使用 open 函数创建一个文件对象&#xff0c;read 方法来读取数据&…

CentOS7 部署单机版 ElasticSearch + Logstash

一、部署ElasticSearch Elasticsearch部署参考下面文章&#xff1a; CentOS7 部署单机版 elasticsearch-CSDN博客文章浏览阅读285次&#xff0c;点赞6次&#xff0c;收藏3次。ElasticSearch&#xff0c;用于检索、聚合分析和大数据存储https://blog.csdn.net/weixin_44295677…

定个小目标之每天刷LeetCode热题(1)

有两种解决方法&#xff1a; 第一种&#xff1a;利用哈希集合不重复的特性&#xff0c;代码展示如下 public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {Set<ListNode> listNode new HashSet<ListNode>();ListNode…

一招搞定!家里灰尘多?教你如何轻松清理,推荐必备神器

在现代生活中&#xff0c;灰尘无处不在&#xff0c;特别是在大城市&#xff0c;空气中的污染物更多&#xff0c;导致家里的灰尘积聚速度加快。保持家居环境的干净和整洁不仅能提升生活质量&#xff0c;还能保护我们的健康。作为一名家电博主将为你提供详细的家里灰尘清理方法&a…