计算机科学领域就两件难事,为什么计算科学中最难的两件事是命名和缓存失效...

本文主要是介绍计算机科学领域就两件难事,为什么计算科学中最难的两件事是命名和缓存失效...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2013-01-11 10:18 "@thinkjava"的内容

命名是有些笼统 ...

DDD的命名笼统好像是小事,但是反映了对事物的分析程度,有句老话:

"There are only two hard things in Computer Science: cache invalidation and naming things" - Phil Karlton

计算科学中最难的两件事是命名和缓存失效。

在DDD实践中,这两个问题都会同时碰到,命名反映了领域模型的提炼过程,聚合边界的划分,说白了反映程序员的分析能力:

事物分析方法之道:找出内聚性强的结构,以包含这个结构为边界进行切分。

找到聚合体名称后,实体和值对象等类的名称都能确定了。但是这个过程在对复杂业务情况下比较难。

关于缓存失效,其实也就涉及到实体的状态变化,现在计算机业界采取有态和无态划分方式,EJB也是这种划分,函数编程FP也是这种划分,专门针对无态。但是有态的变化是无法回避的,也是很难的。

见下图,当我们命名好我们的领域模型后,进入计算机代码实施时,这时我们的领域模型对象是生存在计算机的In-memory cache,而领域模型的对象状态是经常被事件改变的,那么不可避免遭遇状态在缓存中失效,也就是更新的问题:

62716559e25d31e0d21de0c731a733c5.png

下图演示用户的事件是如何改变领域模型状态的:

ces.png

缓存失效还涉及到数据一致性等等问题,也可以说,很难用算法来精确进行缓存失效。

一个复杂系统只有将这两个问题解决了,系统基本意味成熟稳定了,也就表示良好的维护性和拓展性,否则越修改越乱,BUG越多。

有句笑话:程序猿成天象抓蚊子一样抓臭虫BUG,反映两个问题:

首先教育阶段只了解CPU是咋样脾气,不了解人如何与CPU计算机交互,或者说如何训练计算机作为自己的宠物狗;第二是因为不了解人分析事物方法,也就不知道有这个“道”存在,只能象无头苍蝇到处乱撞,拼命加班,浪费青春年华。

[该贴被banq于2013-01-12 10:05修改过]

这篇关于计算机科学领域就两件难事,为什么计算科学中最难的两件事是命名和缓存失效...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813852

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

一文详解Nginx的强缓存和协商缓存

《一文详解Nginx的强缓存和协商缓存》这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、强缓存(Strong Cache)1. 定义2. 响应头3. Nginx 配置示例4. 行为5. 适用场景二、协商缓存(协

通过Python脚本批量复制并规范命名视频文件

《通过Python脚本批量复制并规范命名视频文件》本文介绍了如何通过Python脚本批量复制并规范命名视频文件,实现自动补齐数字编号、保留原始文件、智能识别有效文件等功能,听过代码示例介绍的非常详细,... 目录一、问题场景:杂乱的视频文件名二、完整解决方案三、关键技术解析1. 智能路径处理2. 精准文件名

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

MySQL进阶之路索引失效的11种情况详析

《MySQL进阶之路索引失效的11种情况详析》:本文主要介绍MySQL查询优化中的11种常见情况,包括索引的使用和优化策略,通过这些策略,开发者可以显著提升查询性能,需要的朋友可以参考下... 目录前言图示1. 使用不等式操作符(!=, <, >)2. 使用 OR 连接多个条件3. 对索引字段进行计算操作4