💡
健壮性关注异常处理,而可靠性更关注正确性保障

定义

健壮性(Robustness)

  • 定义:代码在非预期输入、异常环境或错误操作下仍能保持正常运行,避免崩溃或产生灾难性后果的能力。
  • 核心目标:优雅地处理错误,保障基本功能可用。

可靠性(Reliability)

  • 定义:软件在指定条件下持续正确执行预期功能的能力。
  • 核心目标:长期稳定运行,降低故障率。

提升健壮性的五大策略

💡
健壮性不是一次性的任务,而是需要持续优化的过程。从今天开始,让每个方法都思考"如果...会怎样",代码质量将得到质的飞跃!
  • 防御式编程
  • 异常边界管理
  • 资源安全管理
  • 输入验证与过滤
  • 状态一致性维护

防御式编程

三不原则

  • 不信任任何外部输入
  • 不假设调用方行为
  • 不容忍未定义行为

实例:Android组件通信场景

防御式编程三板斧:空对象模式、保护性子句、不可变数据

  • 空对象模式
  • 保护性子句
  • 不可变数据

异常边界管理

实例

  • UI层:捕获未处理异常,防止崩溃
  • 业务层:转换异常为友好错误码
  • 数据层:封装原始异常信息

资源安全管理

四类关键资源

  • 文件流(必须使用use关闭)
  • 数据库连接(使用Room的自动关闭)
  • 网络连接(OkHttp连接池管理)
  • Bitmap资源(及时recycle)

实例

输入验证与过滤

实例——三级验证体系

  • UI层:实时输入校验
  • 业务层:DTO对象校验
  • 服务端:最终一致性校验

状态一致性维护

实例——状态机模式

综合应用实例——图片上传

确保可靠性的三大支柱

💡
让每个功能模块都成为可靠的"黑盒",在满足输入契约的前提下,始终提供符合预期的输出结果。
  • 契约式设计
  • 分层错误处理
  • 自动化质量保障

契约式设计(Design by Contract)

核心三要素

要素
作用
Android典型应用场景
前置条件
调用方必须满足的输入要求
Activity跳转参数校验
后置条件
方法执行后必须满足的输出承诺
网络请求返回数据格式保证
不变式
对象生命周期内始终成立的条件
ViewModel状态一致性维护

实例——安全导航组件

分层错误处理

错误处理层级架构

实例——各层级职责分解

  • 数据层(Data Layer):
  • 领域层(Domain Layer):
  • 表现层(Presentation Layer):

自动化质量保障

Android测试金字塔

单元测试(JUnit 5 + MockK)

集成测试(Hilt + Room)

端到端测试(Espresso + Kakao)

三大支柱协同工作流

常见陷阱类型和规避策略

陷阱类型
表现症状
解决方案
契约过度设计
接口过于僵化,维护成本高
使用Kotlin默认参数+扩展函数
错误分层混乱
UI层处理数据库异常
建立错误类型转换映射表
测试覆盖率虚高
大量无断言测试
引入突变测试(Mutation Test)
契约与实现不一致
文档描述与实际行为不符
使用契约测试工具(Pact)
 
软件工程——常见软件需求风险和分析方法论需求记录——元素组合功能
Loading...