简介 Software entities (classes, modules, functions, etc.) should be open for extension but closed for modification. 软件实体(类,模块,方法等等)应当对扩展开放,对修改关闭,即软件实体应当在不修改的前提下扩展。 问题由来:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码
9.2 原型法 我们在 4.3 中介绍了自顶向下逐步求精的程序设计方法。自顶向下设计是非常强大的程 序设计技术,但它也有不适用的场合。 自顶向下设计的第一步是顶层设计,这需要设计者对问题的全局有清晰的认识。万一要 解决的问题非常复杂,或者用户需求不是很完整、清晰,这时顶层设计就非常困难。另外, 设计者有时候会卡在自顶向下层次中的某一层,这就导致下层的精化无法继续,从而影响整 个程序的开发。即便前面
Less 包含一套自定义的语法及一个解析器,用户根据这些语法定义自己的样式规则,这些规则最终会通过解析器,编译生成对应的 CSS 文件。 Less 并没有裁剪 CSS 原有的特性,更不是用来取代 CSS 的,而是在现有 CSS 语法的基础上,为 CSS 加入程序式语言的特性。先看一个简单的例子,Less 代码如下: @color: #4d926f; header { color: @colo
账户模型与 UTXO 比特币,及其很多的继任者,将用户的余额存储在一个基于 UTXO(unspent transaction output)的数据结构中,系统的整个状态由一个“未花费输出,unspent output” 的集合构成。那么 UTXO 到底是什么呢?简单来说,UTXO 就是人民币,就是 “coin”。有多少 UTXO,就有多少人民币。跟人民币的区别在于: “面值”,人民币的面值有 1
引言 区块链是 21 世纪最具革命性的技术之一,它仍然处于不断成长的阶段,而且还有很多潜力尚未显现。 本质上,区块链只是一个分布式数据库而已。 不过,使它独一无二的是,区块链是一个公开的数据库,而不是一个私人数据库,也就是说,每个使用它的人都有一个完整或部分的副本。 只有经过其他“数据库管理员”的同意,才能向数据库中添加新的记录。 此外,也正是由于区块链,才使得加密货币和智能合约成为现实。 在本系
镜像的实现原理 Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去。 通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允
目录 Overview NodeSelectorSlot: 建立树状结构(调用链路) ClusterBuilderSlot: 根据资源保存统计簇点 StatisticSlot: 实时数据统计 FlowSlot: 流量控制 DegradeSlot: 熔断降级 SystemSlot: 系统负载保护 Overview 在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),
基于 Swoole 提供的 Swoole\Atomic,直接在配置文件中设置,就可以在worker进程中使用,数据互通。 使用时无需加锁! 配置方式 在项目配置文件中加入以下节 'atomics' => [ // 定义名为name1的,初始值为0 'name1', // 定义名为name2的,初始值为10 'name2' => 10, ],
MOSN 的架构和原理解析。 MOSN 核心概念 MOSN 的核心概念解析。 Sidecar 模式 Sidecar 模式是 Service Mesh 中习惯采用的模式。 流量劫持 MOSN 作为 Sidecar 使用时的流量劫持方案。 TLS 安全链路 MOSN 的 TLS 安全能力。 MOSN 平滑升级原理解析 如何在升级 Sidecar(MOSN)的时候而不影响业务,对于存量的长连接如何迁移,
类装载器ClassLoader 类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件。在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导入Class文件; [2.]链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的: [2.1]校验:检查载入Class文件数据的正确性; [2.2]准备:给类的静态变量分配存储空间; [2.3]解
为什幺错误类型不是泛型 enum Event<Element> { case Next(Element) // next element of a sequence case Error(ErrorType) // sequence failed with error case Completed // sequence terminate
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据
可以使用literal标签来防止模板标签被解析,例如: {literal} Hello,{$name}! {/literal} 上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出。 literal标签还可以用于页面的JS代码外层,确保JS代码中的某些用法和模板引擎不产生混淆。 总之,所有可能和内置模板引擎的解析规则冲突的地方都可以使用literal
Db类支持原生SQL查询操作,主要包括下面两个方法: query方法 query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。 使用示例: Db::query("select * from think_user where status=1"); 如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务
GoF将原型模式引用为通过克隆的方式基于一个现有对象的模板创建对象的模式. 我们能够将原型模式认作是基于原型的继承中,我们创建作为其它对象原型的对象.原型对象自身被当做构造器创建的每一个对象的蓝本高效的使用着.如果构造器函数使用的原型包含例如叫做name的属性,那么每一个通过同一个构造器创建的对象都将拥有这个相同的属性. 在现存的(非Javascript的)语法中重新看一看对这个模式的定义,我们也