软件工程实务一课一得

使用git管理代码

使用 Git 工具主要有以下重要原因:

版本控制
  • 能够精确记录代码的每一次变更,包括谁在什么时间做了什么修改,方便追溯和回滚。
  • 有助于团队协作时协调不同人的代码修改,避免冲突。
分布式特性
  • 每个开发者都可以拥有完整的代码库副本,即使与中央服务器断开连接也能进行本地开发。
  • 提高了系统的可用性和容错性。
分支管理
  • 轻松创建、合并和切换分支,便于进行并行开发、功能测试和新特性开发。
  • 可以隔离不同的开发工作流,互不干扰。
协作便利
  • 方便代码的共享和交流,团队成员可以很容易地获取他人的代码更新。
  • 支持多人同时在不同分支上工作,并能高效地整合成果。
备份与恢复
  • 相当于提供了一种可靠的代码备份机制。
  • 在出现意外情况时,可以快速恢复到之前的版本。
开源社区支持广泛
  • 大多数开源项目都使用 Git,这使得开发者能更好地参与开源贡献。
与持续集成/部署工具集成
  • 能够与各种持续集成和部署工具无缝对接,提升开发流程的自动化程度。

例如,在一个大型团队项目中,Git 可以帮助不同开发者在各自的分支上开发新功能,然后通过合并分支将成果整合到主代码库中。当出现问题时,可以快速回滚到之前的稳定版本。同时,开源项目的开发者可以利用 Git 方便地贡献代码和获取最新的更新。

以下是 Git 的一些基本使用方法:

win加R,输入cmd

使用 cd 命令(Change Directory 的缩写)改变路径为代码存放路径。例如D:\myfolder ,可以输入:

   cd D:\myfolder

如果要返回上一级目录,可以输入:

   cd..
初始化仓库
git init
添加所有文件到暂存区
git add.
提交更改到本地仓库
git commit -m "提交描述"
查看仓库状态
git status
查看提交历史
git log
创建分支
git branch <分支名>
切换分支
git checkout <分支名>
将本地分支推送到远程仓库
git push origin <分支名>
从远程仓库拉取代码
git pull origin <分支名>
合并分支到当前分支
git merge <要合并的分支名>
删除本地分支
git branch -d <分支名>
删除远程分支
git push origin --delete <分支名>

这只是 Git 的一些常见操作,Git 还有很多其他强大的功能和用法。

MyBatis-Plus

MyBatis-Plus是一个基于MyBatis的增强工具,它简化了MyBatis的开发并提供了一些强大的功能,其中包括一些内置的通用Mapper接口。这些通用Mapper接口使得开发者可以使用简单的方法进行数据库的增、删、改、查操作,而无需手动编写对应的SQL语句。

MyBatis-Plus的内置接口具有以下主要特点:

  • 通用CRUD方法:MyBatis-Plus的内置接口提供了通用的增、删、改、查的方法,如insert、deleteById、updateById、selectById等。这些方法封装了对数据库表的基本操作,减少了开发者需要手动编写SQL语句的工作。
  • 无需XML映射文件:MyBatis-Plus采用了约定大于配置的思想,通过接口的命名规范和方法的签名,无需编写繁琐的XML映射文件,即可完成数据库操作。
  • 支持主键策略:MyBatis-Plus提供了对多种主键策略的支持,包括自增主键、UUID、雪花算法生成的主键等。开发者可以通过配置指定主键的生成方式。
  • 条件构造方法:MyBatis-Plus的接口提供了一些条件构造的方法,使得开发者可以通过传入条件对象来动态生成SQL条件,实现动态查询的功能。
  • SQL注入器支持:MyBatis-Plus的接口允许开发者自定义SQL注入的逻辑,以满足一些特殊的需求。这为开发者提供了更大的灵活性。
  • 支持分页查询:MyBatis-Plus内置了分页查询的功能,通过Page对象可以轻松地实现分页查询,无需手动编写分页SQL。
  • 逻辑删除:MyBatis-Plus支持逻辑删除,通过注解或配置可以简单地实现逻辑删除的功能,而无需修改表结构。
  • 自动填充字段:MyBatis-Plus支持通过注解或配置自动填充字段,例如创建时间、更新时间等,减少了对这些字段的手动处理。
  • 支持乐观锁:MyBatis-Plus提供了对乐观锁的支持,通过注解或配置可以启用乐观锁机制,确保数据的一致性。

依赖:

 <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>

以下是一个使用 MyBatis-Plus 的案例:

假设有一个名为User的实体类,对应数据库中的user表,具有idnameage等字段。我们可以通过继承BaseMapper接口来实现对User表的基本增删改查操作。

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

在上述代码中,UserMapper继承了BaseMapper<User>,从而获得了一系列基本的数据库操作方法,如insertdeleteByIdupdateByIdselectById等。

接下来,可以在服务层或控制器中注入UserMapper,并调用其方法进行数据库操作。

例如,进行用户插入操作:

@Autowired
private UserMapper userMapper;

public void insertUser(User user) {
    userMapper.insert(user);
}

或者根据用户 ID 查询用户信息:

public User getUserById(Long id) {
    return userMapper.selectById(id);
}

这只是 MyBatis-Plus 的一个简单使用案例,它还提供了更多强大的功能,如条件查询、分页查询、动态 SQL 等,可以根据具体需求进行进一步的学习和应用。

确保代码的可读性和可维护性

确保代码的可读性和可维护性非常重要,原因如下:

对于开发者自身
  • 方便后续回顾和理解自己写的代码,尤其是经过一段时间后再看。
  • 减少自己在修改和扩展代码时的出错概率。
对于团队协作
  • 使团队成员能够快速理解他人的代码,提高协作效率。
  • 便于知识的传递和共享,新成员能更快上手。
对于项目的长期发展
  • 降低维护成本,当需要进行功能扩展、修复 bug 等操作时,可以更高效地进行。
  • 增强代码的稳定性和可持续性,使项目能够长期稳定运行。
  • 有利于代码的迭代和升级,能够更好地适应不断变化的需求。
对于代码质量
  • 有助于发现潜在的问题和不合理的设计,进而改进代码质量。
  • 良好的可读性和可维护性通常也是高质量代码的重要标志之一。
以下是一些确保代码可读性和可维护性的方法:

清晰的命名:变量、函数、类等都应有具有描述性且易懂的名字。比如,使用 customerName 而不是 cn 这样模糊的命名。

合理的代码结构:采用合适的代码布局,将相关功能的代码放在一起,使用缩进和空白来增强视觉层次。

添加注释:关键代码部分添加必要的注释,解释代码的目的、逻辑和特殊情况。

遵循编码规范:统一团队的编码风格,包括缩进、括号使用等。

分解复杂函数:将复杂的函数拆分成多个较小的、功能单一的函数,提高可理解性。

使用有意义的模块划分:将代码按照功能划分为不同的模块或包,便于管理和维护。

避免魔术数字和字符串:尽量将常量定义为有意义的命名常量。

保持代码简洁:去除不必要的代码冗余。

建立代码审查机制:通过他人的审查来发现可读性和可维护性方面的问题。

定期重构:不断改进代码结构,使其更加清晰合理。

保持一致的缩进和格式:使用统一的缩进风格,比如 4 个空格或一个制表符,并且确保代码的排版整齐。

采用分层架构:将代码分为不同层次,如表现层、业务逻辑层、数据访问层等,使结构清晰。

定义清晰的接口:模块之间通过明确的接口进行交互,让调用关系简洁明了。

使用设计模式:恰当运用设计模式可以使代码更具逻辑性和可扩展性。

为长代码块添加段落注释:解释每一段代码的主要作用。

对复杂算法进行详细解释:在注释中说明算法的思路和关键步骤。

创建代码文档:除了注释,还可以编写专门的文档来阐述整体架构和关键流程。

使用命名空间:避免命名冲突,同时使代码组织更有条理。

限制每行代码的长度:避免出现过长的行,增强可读性。

定期清理无用代码:删除不再使用的代码,防止代码库的混乱。

进行代码走查:团队成员互相检查代码,提出改进建议。

建立代码风格指南:并严格执行,确保所有成员遵循统一标准。

使用合适的代码编辑工具:利用工具的自动格式化、语法高亮等功能辅助提高可读性。

创建代码示例和演示:对于一些复杂的功能模块,提供简单的示例代码来展示其用法。

使用语义化的版本控制:让其他人清楚代码的变更程度和兼容性。

例如,在一个大型项目中,可以定义明确的代码规范文档,要求所有开发人员遵守。对于复杂的业务逻辑,通过将其分解为多个清晰的函数来降低理解难度。在代码中对一些复杂算法或特殊处理添加详细的注释,以便后续开发者能够快速理解。定期组织代码审查会议,共同探讨如何提高代码的可读性和可维护性。

可靠性编程

在软件工程实务中,可靠性编程具有至关重要的意义。

可靠性编程旨在确保软件在各种情况下都能稳定、正确地运行。以下是一些可靠性编程的关键方面:

错误处理:包括对可能出现的各种异常情况进行捕获和恰当处理。例如,当遇到文件读取错误时,要提供合理的错误提示信息而不是导致程序崩溃。

代码审查:通过仔细检查代码,发现潜在的逻辑错误、边界情况处理不当等问题,提前消除隐患。

测试:进行充分的单元测试、集成测试和系统测试,以验证软件在不同场景下的行为是否符合预期。

容错设计:考虑系统可能面临的故障情况,并设计相应的容错机制。比如在网络通信中,处理短暂的网络中断。

数据验证:确保输入数据的合法性和正确性,防止因无效数据导致程序出现异常。

以下是一些可靠性编程的最佳实践:

使用断言:在代码中合理使用断言来检查关键的假设和前提条件,有助于在开发阶段尽早发现问题。

防御性编程:对可能的错误输入或异常情况进行预先防范,例如检查参数的有效性。

日志记录:详细记录程序运行过程中的关键信息,以便在出现问题时进行分析和排查。

资源管理:确保正确地分配和释放资源,如内存、文件句柄等,避免资源泄漏。

设置超时机制:对于可能长时间运行的操作,设置合理的超时时间,防止程序无限等待。

代码重构:定期对代码进行重构,以提高代码的可读性、可维护性和可靠性。

备份与恢复:对于重要的数据和状态,设计备份和恢复机制,以应对意外情况。

遵循编码规范:保持一致的编码风格和规范,减少潜在的错误。

进行压力测试:模拟高并发等极端情况,确保软件在压力下的可靠性。

监控与报警:建立监控系统,实时监测软件的运行状态,当出现异常时及时报警。

例如,在开发一个数据库应用程序时,要对输入的 SQL 语句进行严格检查(防御性编程),同时记录数据库操作的日志(日志记录),并确保连接数据库时正确处理异常和释放资源(资源管理)。在压力测试中,可以模拟大量用户同时访问来验证系统的稳定性。

总之,可靠性编程是软件工程中保障软件质量和稳定性的重要手段,需要在软件开发的各个阶段予以重视和实践。

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值