系统设计面试总结:1、代码命名、代码重构、单元测试(TDD、敏捷开发、DDD、MVP、框架选择)

本篇仅供自学回顾,请支持javaGuide原版

1.代码命名

1.1.大驼峰

类名需要使用大驼峰命名法,特征如下:

  • 开头大写
  • 使用大小写混合来区别各个单词
  • 单词之间不使用空格隔开或者连接字符。

如:

ServiceDiscoveryServiceInstanceLruCacheFactory

1.2.小驼峰

方法名、参数名、成员变量、局部变量需要使用小驼峰命名法,特征如下:

  • 开头小写
  • 使用大小写混合来区别各个单词
  • 单词之间不使用空格隔开或者连接字符。

如:

getUserInfo()
setNameFormat(String nameFormat)
Uservice userService;

1.3.蛇形命名

测试方法名、常量、枚举名称需要使用蛇形命名法,特征如下:

  • 各个单词之间通过下划线“_”连接。
  • 适用于单词数较多的情况。

如:

@Test
void should_get_200_status_code_when_request_is_valid() {
    
    
  ......
}

1.4.串式命名

项目文件夹名称需要使用串式命名法,特征如下:

  • 各个单词之间通过连接符“-”连接

如:
dubbo官方项目结构
在这里插入图片描述

1.5.其他常见代码命名

  • 包名统一使用小写,尽量使用单个名词作为包名,各个单词通过 “.” 分隔符连接
  • 抽象类命名使用 Abstract 开头。
  • 异常类命名使用 Exception 结尾。
  • POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

2.代码重构

想起了可怕的code review环节……

2.1.常见设计模式

在这里插入图片描述

在这里插入图片描述

3.单元测试(针对java而言)

3.1.一些你可以不看的相关概念(

3.1.1.TDD

TDDTest-Driven Development( 测试驱动开发),这是敏捷开发的一项核心实践和技术,也是一种设计方法论。

TDD 原理是开发功能代码之前,先编写测试用例代码,然后针对测试用例编写功能代码,使其能够通过。

任务分解是做好 TDD 的关键点。只有把任务分解到可以测试的地步,才能够有针对性地写测试。所以这门技术的门槛其实很高。

3.1.2.敏捷开发

在这补充一下敏捷开发的概念。也让本人想起了当时被tx面试官拷打的场景……
(by the way,面试官人是个好大哥

敏捷开发(Agile Development)是一种以人为核心、迭代、循序渐进的开发方法。

在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目成果都经过测试,具备可视、可集成和可运行使用的特征。

在敏捷开发中,从开发者的角度来看,主要的关注点有短平快的会议、小版本发布、较少的文档、合作为重、客户直接参与、自动化测试适应性计划调整和结队编程;
从管理者角度来看,主要的关注点有测试驱动开发、持续集成和重构。

敏捷开发是针对传统的瀑布开发模式的弊端而产生的一种新的开发模式,目标是提高开发效率和响应能力。它强调开发团队与客户之间的紧密合作与沟通,通过迭代和增量的方式来逐步完善产品,以适应快速变化的需求。

瀑布开发模式如下:
在这里插入图片描述

敏捷开发的主要特点包括:

  • 迭代开发:将整个开发过程分解为多个短周期的迭代,每个迭代都产生可工作的软件增量。
  • 增量交付:在每个迭代结束时,交付一部分可用的功能,逐步构建完整的产品。
  • 高度协作:强调开发团队与客户、产品负责人等利益相关者之间的紧密合作与沟通。
  • 响应变化:敏捷开发认为变化是不可避免的,因此要能够快速响应和适应变化
  • 重视个体和互动:强调团队成员之间的互动和合作,认为个体和团队之间的互动比流程和工具更重要。
  • 工作软件胜过详尽的文档:重视可工作的软件,认为它是衡量进展的主要标准,而不是详尽的文档。

3.1.3.DDD

领域驱动设计(Domain Driven Design)又简称 DDD。在领域驱动设计中,很重要的一个概念就是领域(Domain),它就是我们要解决的问题。在领域驱动设计中,我们要做的就是把比较大的领域(问题)拆解为若干的小领域(子域)。

3.1.4.MVP

在软件开发领域,有一个非常重要的概念:MVP(Minimum Viable Product,最小可行产品)。 这个最小可行产品,可以理解为刚好能够满足客户需求的产品。利用最小可行产品,我们可以提早进行市场分析。

3.2.单测框架

主流的JUnit几乎是默认选择,但是其不支持 Mock,因此我们还需要选择一个 Mock 工具。

MockitoSpock 是最主流的两款 Mock工具,一般都是在这两者中选择(一般选前者)。两者的区分如下:

  • Spock 没办法 Mock 静态方法和私有方法 ,Mockito 3.4.0 以后,支持静态方法的 Mock
  • Spock 基于 Groovy,写出来的测试代码更清晰易读,比较规范(自带 given-when-then 的常用测试结构规范)。Mockito 没有具体的结构规范,需要项目组自己约定一个或者遵守比较好的测试代码实践。通常来说,同样的测试用例,Spock 的代码要更简洁。
  • Mockito 使用的人群更广泛,稳定可靠。并且,Mockito 是 SpringBoot Test 默认集成的 Mock 工具。