首页 > 编程语言 >论术:浅谈防御性编程

论术:浅谈防御性编程

时间:2024-04-30 15:38:14浏览次数:28  
标签:防御性 论术 浅谈 是否 代码 编程 组件 输入

WHAT

在防御式驾驶中拥有这样一种思维,那就是你永远也不能确定另一位老司机将要做什么。为了防止在其他人做出危险动作时你也不会受到伤害,你要承担起保护自己的责任,哪怕是其他司机犯的错误,这就是所谓防御性编程的意义所在。
防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能地“保护”自己。 我们通过明确地预见在什么地方可能会出现问题,然后创建相对应的处理方式来完成防御性编程
防御性编程更是一种态度,一种提前包容他人错误的态度(做类型转换后使用全等),一种对项目负责的态度(功能编写时兼顾用户体验)。

防御性编程是提高程序鲁棒性(Robust)的手段

WHY

  • 防御性编程可以增强程序的健壮性,在不正常的输入或不正常的外部环境下仍能表现正常的程度,具体表现在我猜到了,所以我做到了
  • 防御性编程可以节省大量调试时间。
  • 防御性编程可以使生产环境崩溃的概率变小,我们预见并处理了部分可能会导致崩溃的问题
  • 防御性编程写的好,闲气生的少
  • 在某些高并发场景,任何微小的错误都可能会因为巨大的访问量而被放大无数倍。编写防御性编程是一个求稳的过程。
    ...

HOW

不信任所有输入

输入端用户是不值得信任的!

作为数据注入的第一道防线,我们要抱着最大的恶意对待输入端用户,对于某些重要的表单场景时,多一些精密校验是必要的,有时可能用户本身也不知道自己输入的问题,总而言之:过程无法阻止,不过我们可以通过强校验的方式告知用户输入正确的合法的数据。

要相信需求会变

在写代码时,要时常询问自己:目前代码的实现方式是否方便需求更改

相信经历过的人会懂:

毕竟,代码是死的,人是活的,但是人是可以被气死的

多重校验下优先退出

略略

考虑UI稿的极端情况

作为设计岗,某些图总是会按照设计师心目中最好的样子实现,但在生产场景下作为前端则要考虑的更多,我们并不能保证事态一定向我们(fe+ui)期望的方向发展,基于此我们同样要向UI传递这种可能,也就是极端场景

不要仓促的编写代码

在你完全理解需求之前,永远不要开始编码,一定要先考虑清楚:

  • 功能的实现
    1.要先对功能需求深入了解,可以在产品/甲方将需求描述完毕后,将自己对需求的理解复述一次给对方,以确保不会出现认知偏差。这有点像战争开发前各个将领在首脑面前校准时间,抹平差异
  1. 与后端约定的接口的数据格式
    这一点好处多多,我们在约定大致的数据结构后就可以据此mock属于该模块的数据,在此掏出一段用以快速mock的代码:
 new Array(6).fill(null).map((_, i) => ({
    i,
    status: i % 3,
    applicant: ['贾明', '张三', '王芳'][i % 3],
    channel: ['电子签署', '纸质签署', '纸质签署'][i % 3],
    type: ['审批通过', '已过期', '审批失败', '审批中'][i % 4],
    detail: {
      email: [
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]',
        '[email protected]'
      ][i % 5]
    },
    needed: ['Y', 'N'][i % 1],
    description: ['宣传物料制作费用', 'algolia 服务报销', '相关周边制作费', '激励奖品快递费'][
      i % 4
    ],
    createTime: '2021-11-01'
  }))

当与后端对接后,就可以以此将后端的数据格式再进行map一遍后进行重组,这样则避免了从页面进行大幅改动
3. 项目内是否有可用的公共组件、工具

  • 组件的拆分
  1. 组件拆分的合理性,数据、状态的存放是否符合最小知识原则。
  2. 组件的可复用性如何,是否需要可复用性。
  3. 数据状态的传递方式是否合理。
  • 工具/插件的使用是否合理
    xx插件是否有必要使用,是否可能满足未来项目的预期,为什么

  • 其他

  1. 异常处理边界行为
  2. 处理弱网络处理
  3. 用户体验优化
    ...

几点提示

当然 凡事有利有弊,提高健壮性也可能会有以下弊端:

  1. 代码臃肿,可能会有更多不必要的判断
  2. 过度设计
  3. 降低代码模块效率
    ...

约定大于配置,防御性编程不代表我们认可有人可以破坏大家的约定,也不代表我们需要编写大量丑陋的防御性代码。一定要小心设计过度带来的代码臃肿性。健壮性与便利性总是可以讨论的,关键在于如何取舍,而这几点则需开发者认真考量。

以上。

标签:防御性,论术,浅谈,是否,代码,编程,组件,输入
From: https://www.cnblogs.com/hjk1124/p/18168084

相关文章

  • JavaScript运算符及优先级全攻略,点击立刻升级你的编程水平!
    在编程的世界里,运算符是构建逻辑、实现功能的重要工具。它能帮助我们完成各种复杂的计算和操作。今天,我们就来深入探索JavaScript中运算符的奥秘,掌握它们的种类和优先级,让你的代码更加高效、简洁!一、什么是运算符运算符,顾名思义,就是用于执行特定操作的符号。在JavaScript中,运......
  • Java面向对象编程
    什么是面向对象:以类的方式组织代码,以对象的来组织(封装)数据三大特性:封装,继承,多态构造器:和类名相同,没有返回值;作用:new本质就是在调用构造方法,默认使用无参构造;还可以初始化对象的值;注意:定以有参构造之后,若还想使用无参构造的话必须要显示的定义;封装:数据的隐藏;通常应禁止......
  • Python 编程
    第1章什么是Python?#Python——编程新手最好的选择第2章为Python做好准备#单行注释打印出单词"HelloWorld"print("HelloWorld")'''多行注释这是一条注释这也是一条注释'''print("HelloPython")第3章变量和操作符的世界3.......
  • java 数据库编程(一)JDBC连接Sql Server数据库
    java数据库编程(一)JDBC连接SqlServer数据库一、JDBC简介java数据库连接技术(JavaDatabaseConnection,JDBC)是由java提供的一组与平台无关的数据库的操作标准,其本身由一类与接口组成,并且在操作中将按照严格的顺序执行。由于数据库属于资源操作,所以所有的数据库操作的最后必......
  • 8种编程范式
    1.命令式编程(Imperative):详细的命令机器怎么(How)去处理一件事情以达到你想要的结果(What);JAVAC++......2.声明式编程(Declarative):只告诉你想要的结果(What),机器自己摸索过程(How)SQL3.面向对象编程4.面向切面编程5.函数式编程6.反应式编程7.范式编程8.并发编程......
  • 21-Shell编程
    21.1正则表达式21.1.4字符集和单词“单词”指的是两侧由非单词字符分隔的字符串。非单词字符指的是字母、数字、下划线以外的任何字符。21.1.5字符类POSIX正则表达式中的字符类类匹配字符[[:alnum:]]文字、数字字符[[:alpha:]]字母字符[[:lower:]]小写......
  • 实验3 C语言函数应用编程
    1#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);//函数声明voidprint_spaces(intn);//函数声明voidprint_blank_lines(intn);//函数声明......
  • 实验3 C语言函数应用编程
    task1#include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);//函数声明voidprint_spaces(intn);//函数声明voidprint_blank_lines(intn);//函数声明......
  • Python多线程编程深度探索:从入门到实战
    title:Python多线程编程深度探索:从入门到实战date:2024/4/2818:57:17updated:2024/4/2818:57:17categories:后端开发tags:多线程并发编程线程安全Python异步IO性能优化实战项目第1章:Python基础知识与多线程概念Python简介:Python是一种高级、通用、解释......
  • 为啥在编程的世界里,日期时间处理这么难?
    做过开发的同学都有体会,日期时间的处理很麻烦,稍不注意就会出现日期格式不一样,或者时间差8小时。那为何日期时间这么难处理呢?今天我们就来梳理一下在编程的世界里,为啥日期时间这么难处理。我们先来熟悉几个概念1、时区(Timezone)由于各地的日出日落时间不同,所以把全球所有地区共......