首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel公式练习42: 统计句子中满足条件的单词个数

Excel公式练习42: 统计句子中满足条件的单词个数

作者头像
fanjy
发布于 2020-02-26 08:03:15
发布于 2020-02-26 08:03:15
1.7K0
举报
文章被收录于专栏:完美Excel完美Excel

导语:继续研究来自于excelxor.com的案例。这个案例应用了前面分享的一些公式技巧,值得反复学习。

本次的练习是:如下图1所示,在单元格A1中有一段英文文本,其中可能包含标点符号或不包含标点符号,在单元格B1中输入一个公式,识别文本中包含五个元音字母的单词,统计出这些单词的个数。

图1

注意,统计的单词应满足:

1. 单词中包含全部五个元音字母

2. 这五个元音字母在单词中从左至右出现的顺序是a、e、i、o、u

3. 这五个元音字母在单词中只出现一次

在图1中,红色字体的单词满足条件,而黑色斜体的单词虽然包含全部的五个元音字母但由于顺序不符合要求,因此不满足条件。

先不看答案,自已动手试一试。

公式

在单元格B1中输入公式:

=SUMPRODUCT(0+(MMULT(0+(LEN(Arry2)-LEN(SUBSTITUTE(Arry2,{"a","e","i","o","u"},""))=1),{1;1;1;1;1})=5),0+(ISNUMBER(SEARCH("a*e*i*o*u",Arry2))))

公式解析

公式中的Arry1和Arry2是定义的两个名称。

名称:Arry1

引用位置:=ROW(INDIRECT("1:"&1+LEN($A1)-LEN(SUBSTITUTE($A1,"",""))))-1

名称:Arry2

引用位置:=TRIM(MID(SUBSTITUTE(LOWER($A1),"",REPT(" ",LEN($A1))),LEN($A1)*Arry1+1,LEN($A1)))

注意,在定义名称时确保活动单元格位于工作表的第一行。

首先,来看看名称Arry1:

=ROW(INDIRECT("1:" & 1+LEN($A1)-LEN(SUBSTITUTE($A1,"",""))))-1

由于单元格A1中字符串的长度为461,去掉空格后的长度为392,因此公式转换为:

=ROW(INDIRECT("1:" & 1+461-392))-1

转换为:

=ROW(INDIRECT("1:"& 70))-1

转换为:

{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70}-1

结果为:

{0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69}

中间获得的数组中的70对应着文本包含有70个子字符串(单词)。

将得到的结果数组传递给名称Arry2中MID函数的start_num参数:

=TRIM(MID(SUBSTITUTE(LOWER($A1),"",REPT(" ",LEN($A1))),LEN($A1)*Arry1+1,LEN($A1)))

注意,这里使用LOWER函数将文本转换成小写,因为SUBSTITUTE函数区分大小写。

Arry2将生成由A1中的单词组成的数组,其运行原理在本系列前面的文章中已作详细讲解,有兴趣的朋友可查阅参考。Arry2生成的数组为:

{"abstemious";"people";"who";"are";"not";"facetious";"by";"nature";"should";"not";"be";"lacking";"the";"education";"imbibing";"of";"arsenious";"substances";"will";"not";"make";"them";"more";"abstentious.";"indeed,";"facetiousness";"aside,";"such";"practices";"are";"likely";"to";"be";"harmful,";"as";"many";"acheilous";"casualties";"can";"testify.";"a";"more";"reliable";"herbal";"remedy";"is";"a";"concoction";"of";"the";"caesious,";"annelidous";"plants";"found";"anemious";"plains";"of";"outer";"mongolia,";"plants";"which";"are";"thought";"to";"contributed";"to";"the";"diet";"of";"raeticodactylus."}

数组中,有些单词包含了标点符号,但并不影响最终的结果。

下面,我们需要对上面生成的数组中的每个元素执行两项测试:第一项测试是确定每个元素是否按顺序包含“a”、“e”、“i”、“o”、“u”这五个元素,第二项测试确定这五个元音字母在元素中仅出现一次。

先看看公式中的:

ISNUMBER(SEARCH("a*e*i*o*u",Arry2))

SEARCH函数有一个很好的特性,接受通配符。因此,在合适的地方插入通配符后,可以使用字符串“a*e*i*o*u”作为该函数的find_text参数。这样,如果在查找的字符串中按顺序包含“a”、“e”、“i”、“o”、“u”这五个元素的话,则返回代表找到字符位置的数字。上述公式可转换为:

{TRUE;FALSE;FALSE; FALSE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; TRUE; FALSE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE}

我们将数组中的TRUE采用红色字体,与Arry2中相应的元素对应:

{"abstemious";"people";"who";"are";"not";"facetious";"by";"nature";"should";"not";"be";"lacking";"the";"education";"imbibing";"of";"arsenious";"substances";"will";"not";"make";"them";"more";"abstentious.";"indeed,";"facetiousness";"aside,";"such";"practices";"are";"likely";"to";"be";"harmful,";"as";"many";"acheilous";"casualties";"can";"testify.";"a";"more";"reliable";"herbal";"remedy";"is";"a";"concoction";"of";"the";"caesious,";"annelidous";"plants";"found";"anemious";"plains";"of";"outer";"mongolia,";"plants";"which";"are";"thought";"to";"contributed";"to";"the";"diet";"of";"raeticodactylus."}

显然,这些红色字体的元素满足我们的条件,但并不是所有都满足,其中有两个“facetiousness”和“raeticodactylus.”中有些元音多于一个。

这样,我们需要进行第二项测试:

MMULT(0+(LEN(Arry2)-LEN(SUBSTITUTE(Arry2,{"a","e","i","o","u"},""))=1),{1;1;1;1;1})=5

这是一个标准的公式技术,用来确定字符串中某个字符有多少个:使用原始字符串的长度减去剔除掉指定字符后的字符串的长度。

注意到,我们要确定的字符不是一个而是五个。

对于LEN(Arry2),转换为原始字符串的长度:

{10;6;3;3;3;9;2;6;6;3;2;7;3;9;8;2;9;10;4;3;4;4;4;12;7;13;6;4;9;3;6;2;2;8;2;4;9;10;3;8;1;4;8;6;6;2;1;10;2;3;9;10;6;5;8;6;2;5;9;6;5;3;7;2;11;2;3;4;2;16}

公式中的:

LEN(SUBSTITUTE(Arry2,{"a","e","i","o","u"},"")

传递由五个值组成的数组给SUBSTITUTE函数的参数old_text,要确保这五个值组成的数组与Arry2正交。由于Arry2是单列数组向量,那么这五个数组应该是单行数组向量。这样,就形成了一个69行5列的数组,对应着每个单词删除一个元音字母后的字符串。例如,生成的数组的第一行应该为:

{"bstemious","abstmious","abstemous","abstemius","abstemios"}

最终的结果为:

{9,9,9,9,9;6,4,6,5,6;3,3,3,2,3;2,2,3,3,3;3,3,3,2,3;8,8,8,8,8;2,2,2,2,2;5,5,6,6,5;6,6,6,5,5;3,3,3,2,3;2,1,2,2,2;6,7,6,7,7;3,2,3,3,3;8,8,8,8,8;8,8,5,8,8;2,2,2,1,2;8,8,8,8,8;9,9,10,10,9;4,4,3,4,4;3,3,3,2,3;3,3,4,4,4;4,3,4,4,4;4,3,4,3,4;11,11,11,11,11;7,5,6,7,7;12,11,12,12,12;5,5,5,6,6;4,4,4,4,3;8,8,8,9,9;2,2,3,3,3;6,5,5,6,6;2,2,2,1,2;2,1,2,2,2;7,8,8,8,7;1,2,2,2,2;3,4,4,4,4;8,8,8,8,8;8,9,9,10,9;2,3,3,3,3;8,7,7,8,8;0,1,1,1,1;4,3,4,3,4;7,6,7,8,8;5,5,6,6,6;6,4,6,6,6;2,2,1,2,2;0,1,1,1,1;10,10,9,7,10;2,2,2,1,2;3,2,3,3,3;8,8,8,8,8;9,9,9,9,9;5,6,6,6,6;5,5,5,4,4;7,7,7,7,7;5,6,5,6,6;2,2,2,1,2;5,4,5,4,4;8,9,8,7,9;5,6,6,6,6;5,5,4,5,5;2,2,3,3,3;7,7,7,6,6;2,2,2,1,2;11,10,10,10,10;2,2,2,1,2;3,2,3,3,3;4,3,3,4,4;2,2,2,1,2;14,15,15,15,15}

从上面生成的第一个数组减去第二个数组,等于由每个元素中分别包含五个元音的数量组成的数组。例如第一个数组的第一个元素10(即单词"abstemious"的长度)减去第二个数组中的第一行{9,9,9,9,9}(即单词"abstemious"分别去掉五个元音后的长度):

10-{9,9,9,9,9}

得到:

{1,1,1,1,1}

也就是单词"abstemious"中元音"a","e","i","o","u"的个数组成的数组。

最终的结果为:

{1,1,1,1,1;0,2,0,1,0;0,0,0,1,0;1,1,0,0,0;0,0,0,1,0;1,1,1,1,1;0,0,0,0,0;1,1,0,0,1;0,0,0,1,1;0,0,0,1,0;0,1,0,0,0;1,0,1,0,0;0,1,0,0,0;1,1,1,1,1;0,0,3,0,0;0,0,0,1,0;1,1,1,1,1;1,1,0,0,1;0,0,1,0,0;0,0,0,1,0;1,1,0,0,0;0,1,0,0,0;0,1,0,1,0;1,1,1,1,1;0,2,1,0,0;1,2,1,1,1;1,1,1,0,0;0,0,0,0,1;1,1,1,0,0;1,1,0,0,0;0,1,1,0,0;0,0,0,1,0;0,1,0,0,0;1,0,0,0,1;1,0,0,0,0;1,0,0,0,0;1,1,1,1,1;2,1,1,0,1;1,0,0,0,0;0,1,1,0,0;1,0,0,0,0;0,1,0,1,0;1,2,1,0,0;1,1,0,0,0;0,2,0,0,0;0,0,1,0,0;1,0,0,0,0;0,0,1,3,0;0,0,0,1,0;0,1,0,0,0;1,1,1,1,1;1,1,1,1,1;1,0,0,0,0;0,0,0,1,1;1,1,1,1,1;1,0,1,0,0;0,0,0,1,0;0,1,0,1,1;1,0,1,2,0;1,0,0,0,0;0,0,1,0,0;1,1,0,0,0;0,0,0,1,1;0,0,0,1,0;0,1,1,1,1;0,0,0,1,0;0,1,0,0,0;0,1,1,0,0;0,0,0,1,0;2,1,1,1,1}

代表着每个单词中元音"a","e","i","o","u"分别出现的个数。

由于我们感兴趣的仅仅是这五个元音只出现一次的单词,将上面的数组与1相比较:

LEN(Arry2)-LEN(SUBSTITUTE(Arry2,{"a","e","i","o","u"},""))=1

得到:

{TRUE,TRUE,TRUE,TRUE,TRUE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;TRUE,TRUE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;TRUE,TRUE,TRUE,TRUE,TRUE;FALSE,FALSE,FALSE,FALSE,FALSE;TRUE,TRUE,FALSE,FALSE,TRUE;FALSE,FALSE,FALSE,TRUE,TRUE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,FALSE,FALSE,FALSE;TRUE,FALSE,TRUE,FALSE,FALSE;FALSE,TRUE,FALSE,FALSE,FALSE;TRUE,TRUE,TRUE,TRUE,TRUE;FALSE,FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;TRUE,TRUE,TRUE,TRUE,TRUE;TRUE,TRUE,FALSE,FALSE,TRUE;FALSE,FALSE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;TRUE,TRUE,FALSE,FALSE,FALSE;FALSE,TRUE,FALSE,FALSE,FALSE;FALSE,TRUE,FALSE,TRUE,FALSE;TRUE,TRUE,TRUE,TRUE,TRUE;FALSE,FALSE,TRUE,FALSE,FALSE;TRUE,FALSE,TRUE,TRUE,TRUE;TRUE,TRUE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE,TRUE;TRUE,TRUE,TRUE,FALSE,FALSE;TRUE,TRUE,FALSE,FALSE,FALSE;FALSE,TRUE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,FALSE,FALSE,FALSE;TRUE,FALSE,FALSE,FALSE,TRUE;TRUE,FALSE,FALSE,FALSE,FALSE;TRUE,FALSE,FALSE,FALSE,FALSE;TRUE,TRUE,TRUE,TRUE,TRUE;FALSE,TRUE,TRUE,FALSE,TRUE;TRUE,FALSE,FALSE,FALSE,FALSE;FALSE,TRUE,TRUE,FALSE,FALSE;TRUE,FALSE,FALSE,FALSE,FALSE;FALSE,TRUE,FALSE,TRUE,FALSE;TRUE,FALSE,TRUE,FALSE,FALSE;TRUE,TRUE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,TRUE,FALSE,FALSE;TRUE,FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,FALSE,FALSE,FALSE;TRUE,TRUE,TRUE,TRUE,TRUE;TRUE,TRUE,TRUE,TRUE,TRUE;TRUE,FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,TRUE;TRUE,TRUE,TRUE,TRUE,TRUE;TRUE,FALSE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,FALSE,TRUE,TRUE;TRUE,FALSE,TRUE,FALSE,FALSE;TRUE,FALSE,FALSE,FALSE,FALSE;FALSE,FALSE,TRUE,FALSE,FALSE;TRUE,TRUE,FALSE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,TRUE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,TRUE,TRUE,TRUE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,FALSE,FALSE,FALSE;FALSE,TRUE,TRUE,FALSE,FALSE;FALSE,FALSE,FALSE,TRUE,FALSE;FALSE,TRUE,TRUE,TRUE,TRUE}

将布尔值转换成数字:

{1,1,1,1,1;0,0,0,1,0;0,0,0,1,0;1,1,0,0,0;0,0,0,1,0;1,1,1,1,1;0,0,0,0,0;1,1,0,0,1;0,0,0,1,1;0,0,0,1,0;0,1,0,0,0;1,0,1,0,0;0,1,0,0,0;1,1,1,1,1;0,0,0,0,0;0,0,0,1,0;1,1,1,1,1;1,1,0,0,1;0,0,1,0,0;0,0,0,1,0;1,1,0,0,0;0,1,0,0,0;0,1,0,1,0;1,1,1,1,1;0,0,1,0,0;1,0,1,1,1;1,1,1,0,0;0,0,0,0,1;1,1,1,0,0;1,1,0,0,0;0,1,1,0,0;0,0,0,1,0;0,1,0,0,0;1,0,0,0,1;1,0,0,0,0;1,0,0,0,0;1,1,1,1,1;0,1,1,0,1;1,0,0,0,0;0,1,1,0,0;1,0,0,0,0;0,1,0,1,0;1,0,1,0,0;1,1,0,0,0;0,0,0,0,0;0,0,1,0,0;1,0,0,0,0;0,0,1,0,0;0,0,0,1,0;0,1,0,0,0;1,1,1,1,1;1,1,1,1,1;1,0,0,0,0;0,0,0,1,1;1,1,1,1,1;1,0,1,0,0;0,0,0,1,0;0,1,0,1,1;1,0,1,0,0;1,0,0,0,0;0,0,1,0,0;1,1,0,0,0;0,0,0,1,1;0,0,0,1,0;0,1,1,1,1;0,0,0,1,0;0,1,0,0,0;0,1,1,0,0;0,0,0,1,0;0,1,1,1,1}

现在要找到数组中由5个1组成的行,使用MMULT函数:

MMULT(0+(LEN(Arry2)-LEN(SUBSTITUTE(Arry2,{"a","e","i","o","u"},""))=1),{1;1;1;1;1})

得到:

{5;1;1;2;1;5;0;3;2;1;1;2;1;5;0;1;5;3;1;1;2;1;2;5;1;4;3;1;3;2;2;1;1;2;1;1;5;3;1;2;1;2;2;2;0;1;1;1;1;1;5;5;1;2;5;2;1;3;2;1;1;2;2;1;4;1;1;2;1;4}

我们将数组中为5的与Arry2中相应的元素对应:

{"abstemious";"people";"who";"are";"not";"facetious";"by";"nature";"should";"not";"be";"lacking";"the";"education";"imbibing";"of";"arsenious";"substances";"will";"not";"make";"them";"more";"abstentious.";"indeed,";"facetiousness";"aside,";"such";"practices";"are";"likely";"to";"be";"harmful,";"as";"many";"acheilous";"casualties";"can";"testify.";"a";"more";"reliable";"herbal";"remedy";"is";"a";"concoction";"of";"the";"caesious,";"annelidous";"plants";"found";"anemious";"plains";"of";"outer";"mongolia,";"plants";"which";"are";"thought";"to";"contributed";"to";"the";"diet";"of";"raeticodactylus."}

有9个结果满足,但只满足单词中出现五个元音字母一次而不满足其按"a","e","i","o","u"的顺序出现。

将上面的数组与5比较,得到:

{TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}

将上面得到的两个条件的结果代入公式:

=SUMPRODUCT(0+(MMULT(0+(LEN(Arry2)-LEN(SUBSTITUTE(Arry2,{"a","e","i","o","u"},""))=1),{1;1;1;1;1})=5),0+(ISNUMBER(SEARCH("a*e*i*o*u",Arry2))))

得到:

=SUMPRODUCT(0+{TRUE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;TRUE;TRUE;FALSE;FALSE;TRUE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE;FALSE}),0+{TRUE;FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE; TRUE;FALSE; FALSE; TRUE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; FALSE;FALSE; FALSE; FALSE; FALSE; FALSE; FALSE; TRUE })

得到:

=SUMPRODUCT({1;0;0;0;0;1;0;0;0;0;0;0;0;1;0;0;1;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0},{1;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;1;0;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;1;1;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1})

结果为:

8

疑问

在我的Excel中,按照作者原来提供的文本,得到的结果是#VALUE!,我将文本中去掉了6个单词之后,公式才得到正确的值。很奇怪,似乎文本长度没有超过限制,怎么会这样呢?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
2020-5-7-规约模式(specification)
假设你正在减肥,不能吃肉,也不能吃卡路里大于500的食物。把这种情况用编程来表示就会是下面这样
黄腾霄
2020/06/10
7270
2020-5-6-restful理解
Restful已经是目前我们耳熟能详的概念了,但是找了下网上的文章,大部分都是介绍restful API范式。很少介绍resetful架构的。今天同大家介绍下对restful的理解。此外,阮一峰的文章也很不错,感兴趣的同学也可以参考。理解RESTful架构 - 阮一峰的网络日志
黄腾霄
2020/06/10
5290
DDD理论学习系列(12)-- 仓储
1. 引言 DDD中Repository这个单词,主要有两种翻译:资源库和仓储,本文取仓储之译。 说到仓储,我们肯定就想到了仓库,仓库一般用来存放货物,而仓库一般由仓库管理员来管理。当工厂生产了一批货物时,只需交给仓库管理员即可,他负责货物的堆放;当需要发货的时候,仓库管理员负责从仓库中捡货进行货物出库处理。当需要库存盘点时,仓库管理员负责核实货物状态和库存。换句话说,仓库管理员负责了货物的出入库管理。通过仓库管理员这个角色,保证了仓库和工厂的独立性,工厂只需要负责生产即可,而至于货物如何存放工厂无需关注。
圣杰
2018/01/11
2.1K0
DDD理论学习系列(12)-- 仓储
2020-5-10-RESTfulAPI中能否使用query string
之前2020-5-6-restful理解 - huangtengxiao和大家介绍了对RESTful的理解。然后就有小伙伴问了我灵魂问题,对于RESTfulAPI设计,是不是不能使用query string?
黄腾霄
2020/06/10
6290
DDD-经典四层架构应用
根据DDD领域驱动设计原则,对应的软件架构也需要做出相应的调整。 我们常用的三层架构模型划分为表现层,业务逻辑层,数据访问层等,在DDD分层结构中既有联系又有区别, 个人认为主要有如下异同:
烂猪皮
2020/11/02
6.7K0
DDD-经典四层架构应用
.NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记
源码链接: https://github.com/witskeeper/geektime/tree/master/microservices
郑子铭
2021/01/13
5600
.NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记
DDD领域驱动设计实战-分层架构及代码目录结构
DDD并没有给出标准的代码模型,不同的人可能会有不同理解。 按DDD分层架构的分层职责定义,在代码模型里分别为用户接口层、应用层、领域层和基础层,建立了 interfaces、application、domain 和 infrastructure 四个一级目录。
JavaEdge
2022/11/30
9K0
DDD领域驱动设计实战-分层架构及代码目录结构
后端开发实践系列——领域驱动设计(DDD)编码实践
的确,很多时候软件的业务逻辑是无法通过推理而得到的,有时甚至是被臆想出来的。这样的结果使得原本已经很复杂的业务变得更加复杂而难以理解。而在具体编码实现时,除了应付业务上的复杂性,技术上的复杂性也不能忽略,比如我们要讲究技术上的分层,要遵循软件开发的基本原则,又比如要考虑到性能和安全等等。
ThoughtWorks
2019/08/01
1.4K0
后端开发实践系列——领域驱动设计(DDD)编码实践
关于Repository模式
本文转载:http://www.cnblogs.com/dudu/archive/2011/05/25/repository_pattern.html
跟着阿笨一起玩NET
2018/09/19
2.3K0
DDD落地之仓储
hello,everyone。又到了周末了,没有出去玩,继续肝。从评论与粉丝私下的联系来看,大家对于DDD架构的热情都比较高。但是因为抽象化的概念较多,因此理解上就很困难。
柏炎
2022/08/23
1.2K0
DDD落地之仓储
DDD之Repository对象生命周期管理
在DDD中Repository是一个相当重要的概念。聚合是战略与战术之间的交汇点。而管理聚合的正是Repository。
码农戏码
2022/11/18
7860
DDD之Repository对象生命周期管理
2020-5-16-理解Graphql
之前2020-5-6-restful理解 - huangtengxiao和大家提及了RESTfulAPI的一个弊端,就是接口膨胀。
黄腾霄
2020/06/10
6950
领域驱动设计(DDD)实践之路(一)
领域驱动设计(Domain Driven Design,DDD)其实并非新理论,大家可以看看 Eric Evans 编著的《领域驱动设计》原稿首版是2003年,距今已十余年时间。与现在的分布式、微服务相比,绝对是即将步入中年的“老家伙”了。
2020labs小助手
2020/02/24
1.5K0
人人都在跟风学微服务,却不知道DDD领域驱动设计?
最先介绍领域驱动设计(domain-driven design)的是在程序员 Eric Evans 2004年出版的《领域驱动设计:复杂软件核心复杂应对之道》书籍中,领域驱动设计是领域概念的扩展和应用,并且将它应用在软件开发中。它的目标是将软件相关部分连接到不断发展的模型中,以此更容易创建复杂的应用。
Lvshen
2022/05/05
4750
人人都在跟风学微服务,却不知道DDD领域驱动设计?
【深度解析】DDD领域驱动设计,分层架构秘籍大公开!让你的设计更上一层楼!
将领域模型和业务逻辑分离出来,并减少对基础设施、用户界面甚至应用层逻辑的依赖,因为它们不属业务逻辑。将一个夏杂的系统分为不同的层,每层都应该具有良好的内聚性,并且只依赖于比其自身更低的层。
程序视点
2025/01/04
3310
DDD落地,如何持久化聚合
聚合是一组始终需要保持一致的业务对象。因此,我们作为一个整体保存和更新聚合,以确保业务逻辑的一致性。聚合是 DDD 中最为重要的概念,即使你不使用 DDD 编写代码也需要理解这一重要的概念 —— 部分对象的生命周期可以看做一个整体,从而简化编程。一般来说,我们需要对聚合内的对象使用 ACID 特性的事务。最简单的例子就是订单和订单项目,订单项目更新必须伴随订单的更新,否则就会有总价不一致之类的问题。订单项目需要跟随订单的生命周期,我们把订单叫做聚合根,它就像一个导航员一样
ThoughtWorks
2021/11/19
2.9K1
DDD落地,如何持久化聚合
[半翻] 设计面向DDD的微服务
许多技术概念和模式,例如充血模型(对应我们常写贫血模型)、值对象、聚合和聚合根规则。
有态度的马甲
2020/05/04
7340
2020-5-11-HATEOAS简介
之前2020-5-6-restful理解 - huangtengxiao和大家介绍了对RESTful的理解。今天和大家介绍下RESTful中最重要的一个概念HATEOAS。
黄腾霄
2020/06/10
7970
熬夜整理的2W字DDD学习笔记
领域可以进一步划分为子领域。我们把划分出来的多个子领域称为子域,每个子域对应一个更小的问题域或更小的业务范围。领域可以拆分为多个子领域。一个领域相当于一个问题域,领域拆分为子域的过程就是大问题拆分为小问题的过程。
BookSea
2024/04/17
3500
熬夜整理的2W字DDD学习笔记
DDD领域驱动设计实战-分层架构
整洁架构、CQRS、六边形架构等微服务架构都旨在“高内聚低耦合”。那DDD分层架构又如何?
JavaEdge
2021/01/22
2K0
DDD领域驱动设计实战-分层架构
推荐阅读
相关推荐
2020-5-7-规约模式(specification)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档