同步操作将从 deepinwiki/wiki 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
本文是记录一些我认为比较有价值的,关于开发流程,套路这类的东西。语言示例 rust 和 zig。
设计一个程序,除了聪明才智,也需要一些工程思想。
开发实质是测试调试花的时间更多,因此怎么提高我们测试,调试能力甚至比花精力在开发(目标代码)本身要更能提高我们的总体的开发效率。
错误的种类:
函数应该在注释中给出前置条件(断言)。非前置条件的断言,它是当前函数作者应该解决的开发阶段错误。
当善后工作是有意义的,那么应该给出异常处理函数(panic hander),但是任何函数都可能产生异常,没必要说明,因为它不是一个可以处理的错误 ,你针对的是当前系统层面的善后。
能处理且强制客户去处理的是错误。但是因此它也变得有点唠唠叨叨,让人厌烦。因为客户通常并不希望存在那么多需要处理的错误,而只需要理想状态下的一般情况。ub 或者 error,由你选择。
很多时候我们是闭着眼睛编程的。在一个复杂的系统中,视角其实很有限,你就看得到那么一点点,如何能够信赖系统的其余部分能够正常运作?这就是闭着眼睛编程的要点。
抽象!构建一个封闭的系统,作为用户使用系统,从而将复杂的系统和当前要构造的代码区分开来。编程就是建立各种隔离,各种子系统,总是以客户的视角去使用系统,而不是成为系统细节的耦合。
越是复杂的系统(复杂的流程,复杂的算法),这种隔离越是有效,真正做到磨刀不误砍柴工。
有效的原因除了视角有限,也因为这种内聚系统相对容易测试。前面已经强调测试的重要性,那么即得出它有更高的编程效率。如果一个系统编写测试用例很困难,那么它就很有问题了。
Result<T, Error>
来返回错误。
Result<T,Error>
设计模式,也叫设计套路。有很多模式,会导致程序架构变得非常复杂,难以理解(因为你不熟悉它的套路),所以也不是什么时候都用设计模式来写代码。但是对于一些已经流行的套路,我们还是很有必要学习的,这样会让你的代码更有条理性。
希望拥有全局唯一的对象。
最容易想到的方案是:static mut T ,但静态可写对象是不安全的(要使用unsafe 上下文)。
另一个方案就是只能创建一次,第二次报异常。
这在很多算法中,是可以大幅度提高性能的模式。同时,也可以配合单例模式使用,在需要单例对象的时候,在创建单例对象,并缓存起来以后使用(不再创建)。
迭代器负责对集合的枚举,形成序列。函数式编程在这个过程中可以实现针对整体(或每个元素)进行运算。
在现代语言中,迭代器很多已经成为语言(或标准库)的一部分。同时也有简易的创建任意迭代器的技术:生成器。
为什么函数式编程会在迭代器编程中流行?主要是函数式编程适合处理集合(相对标量)。对集合的处理,使用函数式,会更加易于阅读和理解,用传统的流程控制,细节太多不便概括。
api 种类:
函数式编程主要体现在使用闭包作参数,还有可以使用链式操作的适配器上。严格来说, rust 并不是为函数式编程而设计的,它只是从实用性的角度出发,好用的地方就使用,而不是为了函数式而函数式,更多时候是非函数式的。
作为补充,函数式编程的特点:
观察一下,函数式主要的特点是:
关于错误处理的补充,错误处理分四个层次:
Option.ok_or(err) 可以将错误提升到 Result 层次。而 unwarp() 可以提升到 painc! 层次,如果没有异常处理,那么 painc! 提升到 abort 层次。所以,应该在低层次上处理问题,而不是将提升它的层次视为解决问题的方法。当然如果你懒得处理,那谁也阻止不了你。
死锁(deadlock)必要条件:
对应的解决方法:
更有效的方法是封装起来,提供一个系统,如生产者-消费者模型,管道等。
数据竞争(data race):
总之就是持有状态和瞬时状态不一致,而逻辑依赖瞬时状态的情况。
解决方法:加锁(最好是条件变量),但又容易:
解决方法:包装。(ps.内存分配器的模式?)
动态分析工具:
准备两套方案:
# 跟踪程序的系统调用
strace -f -o /tmp/sh ./sh
# 另一个 shell 监视
tail -f /tmp/sh
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。