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

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

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

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

PyCharm如何更改缓存位置

《PyCharm如何更改缓存位置》:本文主要介绍PyCharm如何更改缓存位置的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm更改缓存位置1.打开PyCharm的安装编程目录2.将config、sjsystem、plugins和log的路径

golang float和科学计数法转字符串的实现方式

《golangfloat和科学计数法转字符串的实现方式》:本文主要介绍golangfloat和科学计数法转字符串的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望... 目录golang float和科学计数法转字符串需要对float转字符串做处理总结golang float

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red