防御性编程(Defensive Programming)

什么是Defensive Programming[1]

原文:Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circumstances.
_
翻译:防御性编程是防御性设计的一种形式,它能够保证软件产品在不可预测的环境中持续运行。

我们可以看到,防御性编程只是防御性设计的分支,对于防御性设计,可以布满我们生活的任何角落,尤其是设计行业和制造业,因此,理解和应用防御性编程,让我们更好地懂得“防御”,也能将其应用于自己的生活。

防御性编程的重要思想[2]

所有的外部因素(输入参数、环境变量、上下文)都是“邪恶”的,都存在着企图摧毁程序的罪恶本源,为了抵制它,我们要在程序中处处检验,满地设卡,不满足条件就不再执行后续程序,以保护主程序的正确性

简单来说就是,不管别人如何使用程序,它都能做出相应的处理,因此我们需要预测可能出现的错误并阻止它。

注意,不要滥用Defensive Programming,这可能让你的程序消耗过多资源,牺牲本不必牺牲的性能(可以在文章最底部的参考资料中进一步学习)。

JDBC代码示例

防御性编程在Java异常中的应用情况

  1. 当程序产生异常,对后面的影响不大(视情况,看模块独立性),则只需抛出异常并继续执行
  2. 若程序产生异常,导致后面都不能执行,那就只能回滚重新执行,或者退出程序了

例如使用JDBC连接云端Mysql的时候,可能会断网导致无法连接,这个时候,连登录账户都不行,就需要用户

  1. 要么尝试重新连接
  2. 要么退出程序

给出示例代码,注释已经足够清楚,不再过多解释(代码是基于简单的控制台程序)

package FinancialSystem.UsualFunction;import com.mysql.cj.jdbc.exceptions.CommunicationsException;import javax.xml.crypto.Data;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Scanner;/*** 执行连接数据库操作的类** <p>* 创建日期:2020-08-04 20:44** @author 作者* @version 1.0.0* @since 1.0.0*/public class DatabaseOperating {/*** 供其他程序连接数据库使用** <p>*     方法保证了返回值一定是非空的 Connection对象* </p>** @return Connection Object* @throws InterruptedException*/public static Connection createDatabaseLink() throws InterruptedException {Connection connection;int i = 0;for (; i < 5; i++) {connection = DatabaseOperating.createDatabase();if (connection != null) {if(i != 0){System.out.println("恭喜您,网络连接成功!");}return connection;}System.out.println("是否尝试重新连接?");System.out.println("1. 是   2. 否");Scanner scanner = new Scanner(System.in);System.out.print("请输入序号:");int choose = scanner.nextInt();if(choose != 1){break;}}if (i == 5) {System.err.println("超过重连次数,请联系相关运营商检查您的网络!");}for (int j = 5; j > 0; j--) {System.err.print("\r" + j + "秒后将自动退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);return null;}/*** 连接本地(或云端)的Mysql数据库** @return Connection实例*/private static Connection createDatabase() throws InterruptedException {try {String url = "jdbc:mysql://主机:端口/数据库";String user = "用户名";String password = "密码";return DriverManager.getConnection(url, user, password);} catch (CommunicationsException communicationsException) {System.err.println("网络连接错误!");return null;} catch (SQLException throwable) {// throwable.printStackTrace();System.err.println("远程服务器连接失败");for (int i = 5; i > 0; i--) {System.err.print("\r" + i + "秒后将自动退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);}return null;}
}

方法的调用,能够保证,connection一定不是null,也就能够保证后面的一些步骤避免一些问题,例如NullPointerException

举例如下(部分代码):

String sql = "sql语句";try (Connection connection = DatabaseOperating.createDatabaseLink();PreparedStatement preparedStatement = connection.prepareStatement(sql)
) {// <代码部分>
} catch (SQLException | InterruptedException throwable) {throwable.printStackTrace();
}

思考点

以下是我的思考,对于初学者,我想暂时我暂时没有必要花精力于此处,目前这些也没有搜集专业资料,仅供思考,这一小节可以忽略掉

  1. JDBC不应该使用一个具备大量的MySQL账户,这是危险的,我们应该分配多个具备专门权限的账户,去处理不同的信息。
  2. 不应该使用明码表示MySQL账户,如果那样的话,使用逆向工程,很容易被找到和破解,这样不太安全,例如,可以将账户存在隐秘的地方以密码传输,在程序中解码;又或者使用低等权限账户登录数据库,从数据库获取具备操作权限的账户信息,再用该账户登录数据库。

参考资料

[1] Wikipedia: Defensive Programming

[2] 防御性编程的核心思想

JDBC 防御性编程相关推荐

  1. 追求代码质量: 用 AOP 进行防御性编程

    原文出处: IBM中国 开发人员测试的主要缺点是:绝大部分测试都是在理想的场景中进行的.在这些情况下并不会出现缺陷 -- 能导致出现问题的往往是那些边界情况. 什么是边界情况呢?比方说,把 null  ...

  2. 常见的8个前端防御性编程方案

    大家好,我是若川.欢迎加我微信 ruochuan12,长期交流学习.今天分享几个常见的前端防御性编程方案.点击下方卡片关注我,或者查看源码等系列文章.学习源码整体架构系列.年度总结.JS基础系列 关于 ...

  3. java防御性编程_代码防御性编程的十条技巧

    1 什么是防御性编程? 顾名思义,防御性编程是一种细致.谨慎的编程方法.为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能的"保护"自己.我们通过明确地在代码中对设想进行 ...

  4. 为什么使用JDBC数据库编程

    为什么使用JDBC数据库编程 本文节选自<21天学通JAVA>一书 在JDBC数据库编程中经常要使用ODBC.所以,在讲述JDBC的驱动程序分类之前,首先介绍什么是ODBC.ODBC是指O ...

  5. 细节决定成败,聊聊防御性编程

    点击上方"小麦大叔",选择"置顶/星标公众号" 福利干货,第一时间送达 什么是防御性编程? 防御性编程是一种细致.谨慎的编程方法.为了开发可靠的软件,我们要设计 ...

  6. 代码防御性编程的十条技巧

    关注.星标公众号,不错过精彩内容 转自:C语言与CPP编程 1 什么是防御性编程? 顾名思义,防御性编程是一种细致.谨慎的编程方法.为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能的&qu ...

  7. JDBC 数据库编程基础

    JDBC 数据库编程基础 安装MySQL 进入官网下载页面:https://www.mysql.com/cn/downloads/ 以下红色横线标记的为mysql社区版,是免费的mysql版本: 接下 ...

  8. 8个常见的相亲交友源码前端防御性编程方案

    关于前端防御性编程 我们大多数情况可能遇到过,相亲交友源码后端由于同时请求人数过多,或者数据量过大,又或者是因为异常导致服务异常,接口请求失败,然后前端出现白屏或者报错. 还有一种情况,是相亲交友源码 ...

  9. 防御性编程(Defensive Programming)

    什么是防御性编程?(What is Defensive Programming?) garbage in ,garbage out (GIGO),作为一条计算机界的"俗语",一条相 ...

最新文章

  1. VS 多进程调试(C#和C )
  2. thymeleaf 获取yml中的值_Thymeleaf模板引擎学习
  3. 计算机硬件专业知识西瓜视频,2019年中电脑硬件榜单,空调西瓜+电脑助你当个快乐肥宅...
  4. spring boot 中文文档地址
  5. Azkaban工作流调度器(1)--azkaban的安装
  6. condition_variable的怪事
  7. ABP框架 - 多租户
  8. Hadoop的map阶段流程
  9. dpkg:处理 xxx (--configure)时出错解决办法,也可用于卸载软件出错的情况
  10. Aiseesoft Data Recovery for mac(专业数据恢复软件)
  11. 130242014034(2)-“电商系统某功能模块”需求分析与设计实验课小结
  12. linux下启动jboss脚本,Linux下配置JBoss自动启动
  13. UE4开发六:人物动画
  14. Winlogon、LSASS、Userinit
  15. 程序员面试必看32道经典逻辑推理题
  16. 数据科学之 如何找到指标的最 佳分裂点的几个想法
  17. 电气simulink常用模块_FANUC 各IO模块保险丝位置
  18. python学习小报4--python的数据类型
  19. 【BZOJ3872】Ant colony(二分,动态规划)
  20. Java中间件之介绍

热门文章

  1. 关于数据库表的“记录”与“字段”
  2. Canvas动画 位图缓存提高效率和对应的内存问题
  3. POJ 1944 Fiber Communications (枚举 + 并查集 OR 线段树)
  4. 理解关联容器“map”的关键点
  5. C#使用Dotfuscator混淆代码以及加密
  6. 转载:glut.h 与 stdlib.h中 的exit()重定义问题的解决
  7. ForeignKey和ManyToManyField的限制关系
  8. 移动端实现元素拖拽效果插件_基于自然流布局的可视化拖拽搭建平台设计方案...
  9. php获取网页js中的json,从php获取json数据使用js读取显示到网页笔记
  10. linux vfs open函数,Linux VFS中open系统调用实现原理