代码

人类认知原理 #

原理
    模拟执行
负担
    概念量
        封装粒度大
        多态、运行时多态、静态多态
        临时状态
        用工作流, 而非队列
        日志(event)搜索/集中/回放
        抽出权限层
        非轻量级
            胶水层厚
            无稳定方案, 复用困难
    流程长度
最好
    单线程                  # 不插入行为
    上下文集中
        this.scene.commit()集中状态转移时间线
    单一方式

软件设计原则 #

统一原则 #

观念
    KISS(keep it simple stupid)
    YAGNI(You Ain’t Gonna Need It)
    取好名字占设计一半
    约定大于配置
    并发的世界,并发的软件
        分布式的世界,分布式的软件
        不可预测的世界,容错性强的软件
        复杂的世界,简单的软件
    代码即数据
        物体上绑定行为数据
        传递代码数据(函数一等公民)
    防御性编程
        接口前validator
        启动时自检断言
        异常处理
        不可过度
设计
    solid原则
        单一职则(single responsibility)
            一个类负责一个功能
        开闭(open/closed)
            对扩展开放,对修改关闭,如接口, 如数组扩展结构体状态
        里氏替换原则(liskov substitution)
            子类继承超类的所有
        接口分离(interface segregation)
            最小功能隔离
        依赖反转(dependency inversion)
            低层依赖高层, 具体依赖抽象
    非侵入     # non-intrusion
        将功能推入代码,而非代码拿到功能
        代码实现接口,而非继承类
    拆分
        边界
        正交
    unix rules
        模块化(modularity)          # 模块由精心设计的接口连接
        清晰化(clarity)             # 可读性、可维护性
        组合(composition)
        分离(separation)
        简单(simplicity)
        节俭(parsimony)             # 越小越好
        透明(transparency)          # log, tracing
        鲁棒(robustness)
        可展示(representation)      # 逻辑简单,数据复杂
        最小惊吓(least surprise)     # 少打破用户预期
        安静(silence)
        修复(repair)                # 产生足够报错
        经济(economy)               # 减少开发时间
        生成(generation)            # 避免手写, 用高阶抽象生成代码
        优化(optimization)            # 优化和收益平衡
        分化(diversity)             # 一开始设计不限制、优雅开放灵活
        扩展(extensibility)         # 协议可扩展
优化
    需要时再优化,设计时考虑扩展性
    dry(don't repeat yourself), 不可过度
    找瓶颈
产出
    设计清晰
    选型简单
    代码精炼
    抽象优雅

代码风格 #

命名
    包名类名为名词, 方法名为动词
    参数、方法名称在上下文语义中合理 , 像写文章一样
    横向代码单屏内分行
性能
    避免嵌套循环,特别是数据库操作
结构
    # 高内聚,低耦合
    抽取方法
    业务逻辑分层
    框架无侵入性
技巧
    注释驱动写复杂业务
    自解释代码
安全
    密码二次验证
    离机锁屏
    用户名、密码、ip、端口不提交
    代码安全, 如sql注入, XSS

代码质量 #

代码
    功能、结构、资源
非遗留代码
    写了测试
改代码
    bug
    重构
        # 只改结构
    确定修改点
        找出测试点
        解依赖
            伪/仿对象
            接缝
                全局函数
                    提取重写方法
                宏预处理
                替换连接的代码
                对象
                    # 耦合对象不好初始化
                    子类化重写方法
                    接口提取
                    创建简化接口
                    创建简化类与对象,引用原对象
                    暴露静态方法
                    对象提取公共方法,只测公共方法
                传方法参数
        写测试
    优化
        # 只改资源

具体实现原则 #

数据结构 #

状态机解决流程问题
AST解决主义问题

面向对象(Object Oriented) #

特性
ooad
    # Object Oriented Analysis and Design
    ooa     # analysis
        建立针对业务问题域的清晰视图
        列出核心任务
        针对问题域建立公共词汇表
        列出针对问题域的最佳解决方案
    ood     # design
        细化类关系,明确可见性
        增加属性
        分配职责(方法)
        消息驱动系统中消息传递方式
        局部应用设计模式
        类图时序图
    oop     # program
        抽象: abstract
            接口
                无实现
                可多重继承
            抽象类
                可以有私有方法变量
                实现部分方法
        封装: encapsulation
            # 数据和方法绑定
        继承: inheritance
        多态: polymorphism
            overload为编译时
            override为运行时
        关联: association
            # has a
            双向关联
                两个类互相知道对方公共属性和操作
            单向关联(大多数)
                一个类知道另一个类的公共属性和操作
            聚合: aggregation
                a包含b, b可以不在a创建时创建
            组合: composition
                比聚合强,a包含b, b在a创建时创建
        内聚与耦合: cohesion & coupling
            # 高内聚低耦合
        依赖: dependency
            # use a
        泛化: generalization
            # is a
            泛型

函数式 #

数组
    [1, 1, 3, 5, 5].reduce(function(x, y){ return x + y;})
    [1, 4, 9].map(function(num){return num * 2;})
高阶函数(higher-order function)
    操作函数的函数, 接收函数作为参数, 返回函数
不完全函数(partial function)
    一次调用拆成多次调用,每次调用返回一个函数,如f(1,2)(3,4)(5,6)
        # 每次调用叫做不完全调用(partial application)
不变式
    循环不变式
        用于形式化证明正确性
        描述
            有循环变量
            算法初始、保持、终止时, 某特性不变, 如选择排序中, arr[0,...,j-1]一直有序
    类(或数据类型)不变式
        并发时, 不变的成员关系
            如, 并发临界区(同时只能一个线程占用)
cps(continuation passing style)
    传入处理函数, 处理函数中传处理函数
curry
    f(1,2,3)改写成f(1).f(2).f(3)
thunk
    触发函数, 如 f(){_f(1)}