为什么学习设计模式

一、由着性子写代码
之前,初入职场,很简单的一个功能,花了好久才写完,但是令我崩溃的是,经过领
导的code-review后直接将我的代码推翻,来来回回,不停修改,知道“领导他”满意
才行。很多时候,我甚至开始骂领导全家,代码能用不就行了,跑起来不就行了?
但是后来,公司派我带几个外包程序员干活,由于缺乏管理经验,项目进度有卡的很
严,很多程序员都是“由着性子写代码”,属于管理,降低了对代码的审核要求。有时
候,这并不是坏事,有些“交差性”的项目,这样做确实很快,很舒服。但是一旦一个
项目是一个认真的、需要迭代的项目,这样做简直就是给自己挖坑,所谓的【屎山】
项目就逐渐出来了。
我痛定思痛,决定只要我负责的项目,一定要严格规范,合理设计,然而完成这些,
不仅仅需要我们扎实了解基础的计算机编程知识,设计模式也是不可或缺的一部分。
二、什么样的代码才是好的代码
好的代码应该具有以下特点:可读性、可扩展性、可复用性、可维护性、低耦合、高
内聚和遵循设计原则。现在我们来详细说明这些特点,并通过举例进行解释。
好的代码具有以下特点:
1、可读性强
好的代码应该易于理解。变量和函数名称应清晰表达它们的作用,避免使用含糊不清
或过于简短的命名。注释也是提高代码可读性的重要手段,应适时地为关键部分和复
杂逻辑添加注释。
例如:
// 计算两点之间的距离
public double calculateDistance(Point point1, Point point2) {
double deltaX = point2.getX() - point1.getX();
double deltaY = point2.getY() - point1.getY();
return Math.sqrt(deltaX * deltaX + deltaY * deltaY);
}

2、高性能
好的代码应该具有高性能,避免不必要的计算和资源浪费。在编写代码时,应考虑算
法的时间和空间复杂度,并在适当时候优化,这个需要我们对数据结构和算法有所了
解。
例如,使用HashSet而非List来查找某个元素,以提高性能:
3、遵循编程规范
好的代码应遵循相应的编程规范,包括命名规范、代码格式规范等。这有助于保持代
码的一致性,使其他开发者更容易阅读和理解代码。
例如,在Java中,类名应使用大驼峰命名法,方法和变量名应使用小驼峰命名法:
4、易于测试
好的代码应该易于测试,以确保代码的正确性和稳定性。编写可测试的代码,并编写
单元测试来覆盖关键功能。
易于测试是指代码易于编写单元测试以验证其功能。为了使代码易于测试,我们需要
关注以下几点:
1. 保持代码简洁,避免过长的方法和类。
2. 遵循单一职责原则,使每个类和方法只负责一个功能。
Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Alice");
uniqueNames.add("Bob");
if (uniqueNames.contains("Alice")) {
System.out.println("Alice is in the set.");
}
class UserDaository {
public User findUserByName(String userName) {
// ...
}
}

3. 使用依赖注入和接口,降低组件间的耦合,以便于替换和模拟依赖。
这次我们以一个计算器程序为例,对比易于测试和不易于测试的代码实现。
首先,我们创建一个 Calculator 类,它包含一个 add 方法用于求和。在不易测
试的实现中,我们将输入验证逻辑直接放在 add 方法内,如下所示:
这个实现的问题在于,输入验证逻辑与实际计算逻辑耦合在一起,使得我们无法分别
测试它们。为了使代码易于测试,我们需要将这两部分逻辑解耦。可以通过将输入验
证逻辑移到一个单独的方法 validateInput 中来实现。
现在我们来编写测试用例。对于不易测试的实现,我们需要同时测试输入验证和计算
逻辑:
public class Calculator {
public int add(int a, int b) {
if (a < 0 || b < 0) {
throw new IllegalArgumentException("Negative numbers are not
allowed");
}
return a + b;
}
}
public class Calculator {
public int add(int a, int b) {
validateInput(a, b);
return a + b;
}
private void validateInput(int a, int b) {
if (a < 0 || b < 0) {
throw new IllegalArgumentException("Negative numbers are not
allowed");
}
}
}

对于易于测试的实现,我们可以分别测试输入验证和计算逻辑:
在易于测试的实现中,我们将输入验证和计算逻辑分离,使得测试更加简单和清晰。
此外,这种解耦还有助于提高代码的可维护性和可读性。以上的代码十分简单,可能
大家觉得有点矫枉过正,但是一旦代码变得复杂,很多的逻辑耦合在一起,对于测试
而言会变得极难。
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
// 测试正常输入
assertEquals(5, calculator.add(2, 3));
// 测试非法输入
assertThrows(IllegalArgumentException.class, () -> calculator.add(-1, 3));
}
}
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
// 测试正常输入
assertEquals(5, calculator.add(2, 3));
}
@Test
public void testValidateInput() {
Calculator calculator = new Calculator();
// 测试非法输入
assertThrows(IllegalArgumentException.class, () -> calculator.add(-1, 3));
}
}

5、异常处理
好的代码应具备良好的异常处理机制。在可能出现异常的地方,使用try-catch语句捕
获异常,并在适当的情况下记录错误信息或抛出新的异常,当然还要建立合适的异常
全局捕获机制。
例如:
6、文档和注释
为关键部分和复杂逻辑编写详细的文档和注释,以帮助其他开发者更容易地理解和维
护代码。同时,保持文档和注释的更新,以反映代码的最新状态。
例如:
public void readFile(String filePath) {
try {
// 尝试打开文件
} catch (FileNotFoundException e) {
// 记录错误信息,并抛出新的异常
logger.error("File not found: " + filePath, e);
throw new CustomException("File not found", e);
}
}
/**
* 这是一个用于处理字符串的工具类。
*/
class StringUtils {
/**
* 判断一个字符串是否为空或空白。
*
* @param str 需要判断的字符串
* @return 如果字符串为空或空白,返回true,否则返回false
*/
public static boolean isBlank(String str) {
// ...
}
}

通过遵循这些原则和实践,我们可以编写出具有高质量的代码,从而提高软件的可维
护性、可扩展性和可靠性。同时,我们也应不断学习和积累经验,以便更好地掌握编
程技巧,编写出更优秀的代码。
7、可复用性
好的代码应该具有可复用性,避免重复编写相同的代码。将通用功能抽取成独立的模
块或库,以便在多个项目或模块中使用。
例如,创建一个日期工具类来处理日期相关的操作:
8、易于维护
好的代码应该具有良好的模块化和低耦合度,使其易于修改和扩展。遵循单一职责原
则,确保每个类和方法只负责一项任务。
例如:
class DateUtils {
// 将日期字符串转换为Date对象
public static Date parseDate(String dateString, String format) {
// ...
}
// 将Date对象格式化为字符串
public static String formatDate(Date date, String format) {
// ...
}
}

9、可扩展性
好的代码应该具有良好的可扩展性,即当需求变更或新增功能时,能够方便地进行扩
展,而不需要大规模地改动现有代码。。
我们要记住,永远不变的就是变。鬼才知道甲方爸爸或者产品什么时候要修改需求,
好的设计一定是在面对变化的需求可以少量修改代码,甚至不修改代码。这个内容是
我们学习设计模式的重点之一,这里就不举例子了,在课程中有很多案例。
三、为什么要学习设计模式
1、为了不写烂代码
学习设计模式有助于提高我们编写高质量代码的能力。设计模式是一套经过验证的、
面向对象的编程解决方案,可以帮助我们处理软件开发过程中的常见问题。通过学习
和应用设计模式,我们可以编写出更加清晰、易于理解和维护的代码,从而避免编写
糟糕的代码。
2、为了面试
在软件工程师的面试过程中,设计模式通常是一个重要的考察点。面试官可能会要求
你解释和应用某个特定的设计模式,或者询问你如何解决某个特定的编程问题。掌握
设计模式不仅可以帮助你在面试中展示出扎实的编程基础,还能让你在解决问题时更
加游刃有余。
3、为了提高设计和开发能力
// 文件操作类
class FileOperations {
// 读取文件内容
public String readFile(String filePath) {
// ...
}
// 写入文件内容
public void writeFile(String filePath, String content) {
// ...
}
}

学习设计模式可以帮助我们提高软件设计和开发能力。通过学习设计模式,我们可以
更好地理解面向对象的设计原则,掌握如何将这些原则应用于实际问题。此外,设计
模式还有助于提高我们解决问题的效率,因为我们可以直接应用经过验证的最佳实
践,而无需从头开始尝试和错误。
4、为了更好的学习框架,阅读源码
许多流行的软件框架和库都是基于设计模式构建的,因此掌握设计模式有助于我们更
好地理解和学习这些框架。当我们阅读框架或库的源代码时,了解设计模式可以帮助
我们更快地理解代码的结构和逻辑,从而提高我们学习新技术的速度。同时,了解设
计模式也有助于我们在自己的项目中更好地应用这些框架和库,从而提高我们的开发
效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值