wordpress 数据库填写,梅州百度seo公司,济南网站建设市场,上海展览设计搭建公司原文地址#xff1a;https://read.engineerscodex.com/p/good-programmers-worry-about-data 我最近在这篇很棒的 Stack Overflow 文章中看到了 Linus Torvalds#xff08;Linux 和 Git 的创建者#xff09;的一句话。#xff08;这篇文章回顾了那篇文章中的许多引述。
它…原文地址https://read.engineerscodex.com/p/good-programmers-worry-about-data 我最近在这篇很棒的 Stack Overflow 文章中看到了 Linus TorvaldsLinux 和 Git 的创建者的一句话。这篇文章回顾了那篇文章中的许多引述。
它简洁地描述了我最近一直在研究的一个问题 “糟糕的程序员担心代码。优秀的程序员思考数据结构及其关系。 就在上述引述之前Linus 说 Git 基于稳定且文档齐全的数据结构其本身的设计实际上非常简单。 事实上我非常支持围绕数据设计代码而不是相反我认为这是 git 相当成功的原因之一 … 事实上我会声称一个坏程序员和一个好程序员之间的区别在于他认为代码更重要还是数据结构更重要。 良好的数据结构使代码更易于设计和维护。 它使软件更可靠系统更易于理解代码更具可读性。 在设计任何软件时应用程序逻辑通常遵循数据模型的设计。 将数据模型视为事后的想法会导致更多的工作。 反之亦然 —— 拥有经过深思熟虑的数据模型可以更轻松地在复杂系统上进行迁移和构建。
当我读到这句话时我实际上能回忆起过去无数的例子。 我曾经参与过一个项目我们花了相当长的时间优化复杂的算法结果才意识到通过重组我们的数据我们可以消除所有的问题。 我们将 500 行代码的函数替换为 50 行代码和精心设计的数据结构。 新代码不仅速度更快而且更容易理解和维护。当然问题也转移到了“堆栈下游”即大部分工作都变成了重组已有的数据
另一个相关的引述是在 “The Art of Unix Programming” 中 表示法则Rule of Representation将知识融入数据中这样程序逻辑就可以既 “愚蠢” 又健壮。 即使是最简单的过程逻辑人类也很难验证其正确性但及其复杂的数据结构相当容易建模和追根溯源。 要了解这一点请将 50 个节点的树的图表与 50 行程序的流程图的表达力和解释力进行比较。 或者将表示转换表的数组初始值设定项与等效的 switch 语句进行比较。其理解表达力和清晰度的差异是巨大的。 /* 将数字转换为英文单词 */// 使用数据结构建模复杂度
const char* number_to_word(int num) {const char* words[] {one, two, three, four, five};if(num 1 num 5) {return words[num - 1]; // 减1是因为数组索引从0开始} else {return invalid number; // 超出范围的数字}
}// 使用代码逻辑建模复杂度当值相当多时例如 100 个这种写法将变得相当复杂
// 这种写法经常还会诱导我们在特定的 case 条件中加入特定的处理逻辑整个代码变得难以和维护
const char* number_to_word_switch(int num) {switch(num) {case 1: return one;case 2: return two;case 3: return three;case 4: return four;case 5: return five;default: return invalid number; // 超出范围的数字}
}数据比程序逻辑更容易处理。 因此当您看到数据结构复杂性和代码复杂性之间的选择时请选择前者。 更进一步在改进设计时您应该积极寻求将复杂性从代码转移到数据。 这个观点并不是Unix社区首创的但许多Unix代码都受到了它的影响。特别是C语言在处理指针上的强大能力促使开发者从内核层面起到更高编码层级都采用了可以动态修改的引用结构。在这些结构中简单的指针追踪常常承担起了在其他语言中需要通过更复杂的程序代码来实现的工作。 这里的实用建议是从数据入手。尽量通过对你的接口或数据库使用更严格的类型定义来减少代码的复杂性。额外花一些时间提前深入思考数据结构的设计。
这并不是说代码不重要。显然一切都很重要 —— 但在深入研究与代码相关的细节之前有一个强大的高级方法来了解数据的流动方式以及不同组件如何交互是非常有帮助的。
一些 “接口或数据库使用更严格的类型定义” 的例子
使用枚举代替魔法字符串
通过枚举确保只有预定义的值被接受这样可以避免无效值的出现并在编译时就捕捉到错误。 public enum Status {OPEN, IN_PROGRESS, CLOSED;}public void updateStatus(Status newStatus) {// 只接受Status枚举的值}采用明确的数据结构而非泛型容器
使用明确的类或结构体来代替如 Map 或 Dictionary 等通用容器可以提供更强的类型检查。 public class User {private String name;private int age;// 使用构造函数和明确的字段类型public User(String name, int age) {this.name name;this.age age;}// 相应的getter和setter方法...}// 应该使用具体的类型public User getUserInfo(...)...// 而不是使用容器public MapString, Object getUserInfo(...)...在数据库中使用严格的模式
定义数据库模式时使用严格的字段类型和约束条件如非空、唯一性约束或外键约束。 CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100) NOT NULL,age INT NOT NULL CHECK (age 0));利用类型系统进行验证
在编程中利用类型系统来强制数据的结构和预期的使用方式。
例如在弱类型语言 python 中使用 type hint 机制
使用类型转换和校验库
使用类型转换和校验库如Joi或Yup等来确保数据在运行时满足预定义的模式。 const schema Joi.object({name: Joi.string().required(),age: Joi.number().integer().min(0).required(),});// 使用schema来验证数据const { error, value } schema.validate({ name: Alice, age: 25 });if (error) {throw new Error(error.details[0].message);}