精华内容
下载资源
问答
  • 而从主引导扇区处看,活动分区仅仅是分区表中,16个字节的最前面含有80标志分区信息所定义分区。 但猫猫对Windows帮助文档定义不敢苟同(也许是我错了,但是我思来想去,只有这样可以解释通)。首先,...
  •  oz空格或空位 用在最需要它们地方--------分隔语素,例如分隔语句  过程调用一律用{}括住,英文语句一律用英文?....end括住,真是清晰得不能再清晰了  面向对象中,方法头 "方法名(参数....) "竟然是一个...
  • 2.4.1 基本算术运算符号从最简单的“加、减、乘、幂、除、模、整除”等基础的算术运算说起,这些也是金融领域最基本的运算。表2-4介绍了Python相应的算术运算符号。表2-4 Python的算术运算符号需要注意的是...

    本节进入到Python具体的运算环节。既然是运算就需要有相应的运算符号,具体包括算术运算、关系运算、赋值运算、逻辑运算,这些运算在金融领域都是经常使用的。

    2.4.1 基本算术运算符号

    从最简单的“加、减、乘、幂、除、模、整除”等基础的算术运算说起,这些也是金融领域最基本的运算。表2-4介绍了在Python中相应的算术运算符号。

    表2-4 Python中的算术运算符号

    730a092bf7f70856cf64ec5029480258.png

    需要注意的是,在“加法、减法、乘法以及幂运算”中,存在以下3个规律:一是整型与整型之间的运算,得到的结果是整型;二是整型与浮点型之间的运算,得到的结果是浮点型;三是浮点型与浮点型之间的运算,得到的结果是浮点型。

    1.加法运算

    【例2-40】 在Python中输入整型和浮点型,并且进行相应的加法运算,具体的代码如下:

    2.减法运算

    【例2-41】 对例2-40中输入的整型和浮点型,进行相应的减法运算,具体的代码如下:

    注意,输出−3.1500000000000004的结果是因为浮点型在计算机内存中是以二进制形式表示的,通常这不会影响计算。

    此外,如果控制计算结果的小数点以后的位数,可以运用round函数,其中,round函数中的第一个参数代表了需要输出的结果,第二个参数代表输出结果的小数位数。

    【例2-42】 针对例2-41中,d-e输出结果需要保留小数点后2位,具体的代码如下:

    3.乘法运算

    【例2-43】 对例2-40中输入的整型和浮点型,进行相应的乘法运算,具体的代码如下:

    4.幂运算

    【例2-44】 对例2-40中输入的整型和浮点型,进行相应的幂运算,具体的代码如下:

    5.除法运算

    注意,对于除法而言,得到的结果始终是浮点型。

    【例2-45】 对例2-40中输入的整型和浮点型,进行相应的除法运算,具体的代码如下:

    请注意,在Python 2.X版本中,整型除以整型,只能得出整型,如果要得到有小数的结果,需要把其中一个数改成浮点型。

    6.模运算

    所谓的模运算就是计算余数,并且在Python中是用%符号表示,因此对于百分比的输入切记要转化为具有小数位的浮点型进行输入,否则就会失之毫厘,谬以千里。

    【例2-46】 对例2-40、例2-45中输入的整型和浮点型,进行相应的模运算,具体的代码如下:

    7.整除运算

    整除就是只输出商的整数部分,并且是向下取整(或着是在数轴上向左取整)之后的结果。同时需要注意,如果除数和被除数均是整型,输出的结果就是整型;如果除数和被除数只要有一个是浮点型,输出的结果是浮点型的整数。

    【例 2-47】 对例2-40中输入的整型和浮点型,进行相应的整除运算,具体的代码如下:

    2.4.2 关系运算符号

    在基金投资中,基金经理需要根据基金投资者的风险偏好和投资策略配置相应的证券资产,比如要求基金配置的股票必须是主板上市公司、不能是产能过剩的行业、股价波动率低于30%、上市公司股息分配率超过3%等投资的限制性条件,这就涉及数学中的关系运算,具体包括了等于、不等于、大于、大于等于、小于、小于等于这六大类,也是金融领域最主要的关系运算,在Python的关系运算符号如表2-5所示。

    9909aac61d2023137f646590fbb177a7.png

    需要注意的是,数学中的等于号,在Python中是用双等号“==”表示,而单等号“=”则是赋值符号(在2.1节已经介绍),切记这两个符号不能混淆。同时,表2-5中的输出结果True和False就是布尔值(bool)。

    2.4.3 赋值运算符号

    在前面2.1节就介绍了Python最基础的赋值方法,也就是基本赋值运算符号“=”。此外,Python中还有将不同的算数运算符号与基本赋值运算符号结合在一起而形成的高级赋值运算符号,具体见表2-6。

    e16186386a55a65cbc955f2d85158916.png
    59de6d619e9ec295de1fd9fad5e1c13f.png

    2.4.4 成员运算符号

    假定需要从沪深300指数中找出10只符合一定投资标准(比如市值、市盈率、换手率等)的股票,并且运用Python编写相应的程序,就会运用成员运算符号,并且往往需要结合循环语句、假设语句进行使用。Python的成员运算符号,可以判断一个元素是否在某一个列表中,可以判断一个字符是否属于某个字符串。表2-7就归纳了相应的成员运算符号。

    表2-7 Python中的成员运算符号

    747e555361adfce76c61faeab1195b9c.png

    下面通过数字和字符串两个例子演示在Python中成员运算符号的运用。

    【例2-48】 在Python中考察相应的数字是否在一个列表中,相关的代码如下:

    【例2-49】 在Python中考察相应的字符串是否在一个列表中,相关的代码如下:

    本文摘自:《基于Python的金融分析与风险管理》

    088c6ec5176f91b5ba26371f8ac955b6.png

    本书聚焦于Python在金融分析与风险管理的应用,全书分为入门篇、基础篇和提高篇,共12章。入门篇对Python做了介绍并结合金融场景演示了Python的基本操作;基础篇结合金融场景,讲解NumPy、Pandas、Matplotlib、SciPy等Python模块的具体运用;提高篇详细讨论运用Python分析利率、债券、股票、期货、期权以及风险价值等内容。


    本书是专注于Python在金融领域运用的普及性读物,作者斯文博士在金融与风险管理方面有着深厚的积累,同时也有着丰富的编程经验,一直致力于倡导和推广Python在金融领域的运用。
    本书适合想要掌握Python应用的金融学习者、金融从业者阅读,也适合想要转行到金融领域的程序员以及对Python在金融领域的实践应用感兴趣的人士阅读,并且不要求读者有Python编程基础。

    展开全文
  • 从最简单的“加、减、乘、幂、除、模、整除”等基础的算术运算说起,这些也是金融领域最基本的运算。表2-4介绍了Python相应的算术运算符号。 表2-4 Python的算术运算符号 需要注意的是,...

    本节进入到Python具体的运算环节。既然是运算就需要有相应的运算符号,具体包括算术运算、关系运算、赋值运算、逻辑运算,这些运算在金融领域都是经常使用的。

    2.4.1 基本算术运算符号

    从最简单的“加、减、乘、幂、除、模、整除”等基础的算术运算说起,这些也是金融领域最基本的运算。表2-4介绍了在Python中相应的算术运算符号。

    表2-4 Python中的算术运算符号

    需要注意的是,在“加法、减法、乘法以及幂运算”中,存在以下3个规律:一是整型与整型之间的运算,得到的结果是整型;二是整型与浮点型之间的运算,得到的结果是浮点型;三是浮点型与浮点型之间的运算,得到的结果是浮点型。

    1.加法运算

    【例2-40】 在Python中输入整型和浮点型,并且进行相应的加法运算,具体的代码如下:

    1. In [102]: a=2 #整型
    2.  
    3. In [103]: b=5 #整型
    4.  
    5. In [104]: c=1. #浮点型
    6.  
    7. In [105]: d=3.8 #浮点型
    8.  
    9. In [106]: e=6.95 #浮点型
    10.  
    11. In [107]: a+b #整型与整型相加
    12. Out[107]: 7
    13.  
    14. In [108]: a+c #整型与浮点型相加
    15. Out[108]: 3.0
    16.  
    17. In [109]: d+e #浮点型与浮点型相加
    18. Out[109]: 10.75

    2.减法运算

    【例2-41】 对例2-40中输入的整型和浮点型,进行相应的减法运算,具体的代码如下:

    1. In [110]: a-b #整型与整型相减
    2. Out[110]: -3
    3.  
    4. In [111]: a-c #整型与浮点型相减
    5. Out[111]: 1.0
    6.  
    7. In [112]: a-e #整型与浮点型相减
    8. Out[112]: -4.95
    9.  
    10. In [113]: d-e #浮点型与浮点型相减
    11. Out[113]: -3.1500000000000004

    注意,输出−3.1500000000000004的结果是因为浮点型在计算机内存中是以二进制形式表示的,通常这不会影响计算。

    此外,如果控制计算结果的小数点以后的位数,可以运用round函数,其中,round函数中的第一个参数代表了需要输出的结果,第二个参数代表输出结果的小数位数。

    【例2-42】 针对例2-41中,d-e输出结果需要保留小数点后2位,具体的代码如下:

    1. In [114]: round(d-e,2) #保留小数点2位
    2. Out[114]: -3.15

    3.乘法运算

    【例2-43】 对例2-40中输入的整型和浮点型,进行相应的乘法运算,具体的代码如下:

    1. In [115]: a*b #整型与整型相乘
    2. Out[115]: 10
    3.  
    4. In [116]: a*c #整型与浮点型相乘
    5. Out[116]: 2.0
    6.  
    7. In [117]: d*e #浮点型与浮点型相乘
    8. Out[117]: 26.41

    4.幂运算

    【例2-44】 对例2-40中输入的整型和浮点型,进行相应的幂运算,具体的代码如下:

    1. In [118]: a**b #整型与整型的幂运算
    2. Out[118]: 32
    3.  
    4. In [119]: b**a #整型与整型的幂运算
    5. Out[119]: 25
    6.  
    7. In [120]: a**c #整型与浮点型的幂运算
    8. Out[120]: 2.0
    9.  
    10. In [121]: d**e #浮点型与浮点型的幂运算
    11. Out[121]: 10702.765165970346

    5.除法运算

    注意,对于除法而言,得到的结果始终是浮点型。

    【例2-45】 对例2-40中输入的整型和浮点型,进行相应的除法运算,具体的代码如下:

    1. In [122]: f=4
    2.  
    3. In [123]: f/a #整型与整型相除
    4. Out[123]: 2.0
    5.  
    6. In [124]: b/a #整型与整型相除
    7. Out[124]: 2.5
    8.  
    9. In [125]: a/c #整型与浮点型相除
    10. Out[125]: 2.0
    11.  
    12. In [126]: e/d #浮点型与浮点型相除
    13. Out[126]: 1.8289473684210527

    请注意,在Python 2.X版本中,整型除以整型,只能得出整型,如果要得到有小数的结果,需要把其中一个数改成浮点型。

    6.模运算

    所谓的模运算就是计算余数,并且在Python中是用%符号表示,因此对于百分比的输入切记要转化为具有小数位的浮点型进行输入,否则就会失之毫厘,谬以千里。

    【例2-46】 对例2-40、例2-45中输入的整型和浮点型,进行相应的模运算,具体的代码如下:

    1. In [127]: f%a
    2. Out[127]: 0
    3.  
    4. In [128]: b%a
    5. Out[128]: 1
    6.  
    7. In [129]: d%a
    8. Out[129]: 1.7999999999999998
    9.  
    10. In [130]: d%e
    11. Out[130]: 3.8
    12.  
    13. In [131]: e%d
    14. Out[131]: 3.1500000000000004

    7.整除运算

    整除就是只输出商的整数部分,并且是向下取整(或着是在数轴上向左取整)之后的结果。同时需要注意,如果除数和被除数均是整型,输出的结果就是整型;如果除数和被除数只要有一个是浮点型,输出的结果是浮点型的整数。

    【例 2-47】 对例2-40中输入的整型和浮点型,进行相应的整除运算,具体的代码如下:

    1. In [132]: b//a #均是整型
    2. Out[132]: 2
    3.  
    4. In [133]: b//d #一个整型一个浮点型
    5. Out[133]: 1.0
    6.  
    7. In [134]: e//a #一个整型一个浮点型
    8. Out[134]: 3.0
    9.  
    10. In [135]: e//d #均是浮点型
    11. Out[135]: 1.0

    2.4.2 关系运算符号

    在基金投资中,基金经理需要根据基金投资者的风险偏好和投资策略配置相应的证券资产,比如要求基金配置的股票必须是主板上市公司、不能是产能过剩的行业、股价波动率低于30%、上市公司股息分配率超过3%等投资的限制性条件,这就涉及数学中的关系运算,具体包括了等于、不等于、大于、大于等于、小于、小于等于这六大类,也是金融领域最主要的关系运算,在Python的关系运算符号如表2-5所示。

    表2-5 Python中的关系运算符号

    需要注意的是,数学中的等于号,在Python中是用双等号“==”表示,而单等号“=”则是赋值符号(在2.1节已经介绍),切记这两个符号不能混淆。同时,表2-5中的输出结果True和False就是布尔值(bool)。

    2.4.3 赋值运算符号

    在前面2.1节就介绍了Python最基础的赋值方法,也就是基本赋值运算符号“=”。此外,Python中还有将不同的算数运算符号与基本赋值运算符号结合在一起而形成的高级赋值运算符号,具体见表2-6。


    2.4.4 成员运算符号

    假定需要从沪深300指数中找出10只符合一定投资标准(比如市值、市盈率、换手率等)的股票,并且运用Python编写相应的程序,就会运用成员运算符号,并且往往需要结合循环语句、假设语句进行使用。Python的成员运算符号,可以判断一个元素是否在某一个列表中,可以判断一个字符是否属于某个字符串。表2-7就归纳了相应的成员运算符号。

    表2-7 Python中的成员运算符号

    成员运算符 具体描述
    in 如果一个变量在指定的另一个变量(列表、元组、字符串等)中找到相应的值,则返回True,否则返回False
    not in 如果一个变量在指定的另一个变量中没有找到相应的值,返回True,否则返回False

    下面通过数字和字符串两个例子演示在Python中成员运算符号的运用。

    【例2-48】 在Python中考察相应的数字是否在一个列表中,相关的代码如下:

    1. In [176]: a=1
    2.  
    3. In [177]: b=3
    4.  
    5. In [178]: c=[1,2,4,8,16]
    6.  
    7. In [179]: a in c
    8. Out[179]: True
    9.  
    10. In [180]: b in c
    11. Out[180]: False

    【例2-49】 在Python中考察相应的字符串是否在一个列表中,相关的代码如下:

    
     
    1. In [181]: d='金融'
    2.  
    3. In [182]: e='风险管理'
    4.  
    5. In [183]: f=['finance','风险管理','波动率']
    6.  
    7. In [184]: d in f
    8. Out[184]: False
    9.  
    10. In [185]: e in f
    11. Out[185]: True

    本文摘自:《基于Python的金融分析与风险管理》

    本书聚焦于Python在金融分析与风险管理的应用,全书分为入门篇、基础篇和提高篇,共12章。入门篇对Python做了介绍并结合金融场景演示了Python的基本操作;基础篇结合金融场景,讲解NumPy、Pandas、Matplotlib、SciPy等Python模块的具体运用;提高篇详细讨论运用Python分析利率、债券、股票、期货、期权以及风险价值等内容。

    本书是专注于Python在金融领域运用的普及性读物,作者斯文博士在金融与风险管理方面有着深厚的积累,同时也有着丰富的编程经验,一直致力于倡导和推广Python在金融领域的运用。
    本书适合想要掌握Python应用的金融学习者、金融从业者阅读,也适合想要转行到金融领域的程序员以及对Python在金融领域的实践应用感兴趣的人士阅读,并且不要求读者有Python编程基础。

    展开全文
  •  触发器也可用于强制引用完整性,以便多个表添加、更新或删除行时,保留这些表之间所定义的关系。然而,强制引用完整性的最好方法是相关表定义主键和外键约束。如果使用数据库关系图,则可以表之间创建...
  • 它是最常用的控制,对它进行控制是PLC的优势,也是PLC最基本的应用。开关量控制的目的是,根据开关量的当前输入组合与历史的输入顺序,使PLC产生相应的开关量输出,以使系统能按一定的顺序工作。所以,有时也称其为...

    PLC编程算法(1)

    PLC中无非就是三大量:开关量、模拟量、脉冲量。只在搞清楚三者之间的关系,你就能熟练的掌握PLC了。1、 开关量也称逻辑量,指仅有两个取值,0或1、ON或OFF。它是最常用的控制,对它进行控制是PLC的优势,也是PLC最基本的应用。
    开关量控制的目的是,根据开关量的当前输入组合与历史的输入顺序,使PLC产生相应的开关量输出,以使系统能按一定的顺序工作。所以,有时也称其为顺序控制。
    而顺序控制又分为手动、半自动或自动。而采用的控制原则有分散、集中与混合控制三种。2、 模拟量是指一些连续变化的物理量,如电压、电流、压力、速度、流量等。
    PLC是由继电控制引入微处理技术后发展而来的,可方便及可靠地用于开关量控制。由于模拟量可转换成数字量,数字量只是多位的开关量,故经转换后的模拟量,PLC也完全可以可靠的进行处理控制。
    由于连续的生产过程常有模拟量,所以模拟量控制有时也称过程控制。
    模拟量多是非电量,而PLC只能处理数字量、电量。所有要实现它们之间的转换要有传感器,把模拟量转换成数电量。如果这一电量不是标准的,还要经过变送器,把非标准的电量变成标准的电信号,如4—20mA、1—5V、0—10V等等。
    同时还要有模拟量输入单元(A/D),把这些标准的电信号变换成数字信号;模拟量输出单元(D/A),以把PLC处理后的数字量变换成模拟量——标准的电信号。
    所以标准电信号、数字量之间的转换就要用到各种运算。这就需要搞清楚模拟量单元的分辨率以及标准的电信号。例如:
    PLC模拟单元的分辨率是1/32767,对应的标准电量是0—10V,所要检测的是温度值0—100℃。那么0—32767对应0—100℃的温度值。然后计算出1℃所对应的数字量是327.67。如果想把温度值精确到0.1℃,把327.67/10即可。
    模拟量控制包括:反馈控制、前馈控制、比例控制、模糊控制等。这些都是PLC内部数字量的计算过程。3、 脉冲量是其取值总是不断的在0(低电平)和1(高电平)之间交替变化的数字量。每秒钟脉冲交替变化的次数称为频率。
    PLC脉冲量的控制目的主要是位置控制、运动控制、轨迹控制等。例如:脉冲数在角度控制中的应用。步进电机驱动器的细分是每圈10000,要求步进电机旋转90度。那么所要动作的脉冲数值=10000/(360/90)=2500。

    PLC编程算法(2)——模拟量的计算

    1、 -10—10V。-10V—10V的电压时,在6000分辨率时被转换为F448—0BB8Hex(-3000—3000);12000分辨率时被转换为E890—1770Hex(-6000—6000)。
    2、 0—10V。0—10V的电压时,在12000分辨率时被转换为0—1770Hex(0—6000);12000分辨率时被转换为0—2EE0Hex(0—12000)。
    3、 0—20mA。0—20mA的电流时,在6000分辨率时被转换为0—1770Hex(0—6000);12000分辨率时被转换为0—2EE0Hex(0—12000)。
    4、 4—20mA。4—20mA的电流时,在6000分辨率时被转换为0—1770Hex(0—6000);12000分辨率时被转换为0—2EE0Hex(0—12000)。以上仅做简单的介绍,不同的PLC有不同的分辨率,并且您所测量物理量实现的量程不一样。计算结果可能有一定的差异。
      注:模拟输入的配线的要求
      1、使用屏蔽双绞线,但不连接屏蔽层。
      2、当一个输入不使用的时候,将V IN 和COM端子短接。
      3、模拟信号线与电源线隔离 (AC 电源线,高压线等)。
      4、当电源线上有干扰时,在输入部分和电源单元之间安装一个虑波器。
      5、确认正确的接线后,首先给CPU单元上电,然后再给负载上电。
      6、断电时先切断负载的电源,然后再切断CPU的电源。

    PLC编程算法(3)——脉冲量的计算

    脉冲量的控制多用于步进电机、伺服电机的角度控制、距离控制、位置控制等。以下是以步进电机为例来说明各控制方式。
    1、 步进电机的角度控制。首先要明确步进电机的细分数,然后确定步进电机转一圈所需要的总脉冲数。计算“角度百分比=设定角度/360°(即一圈)”“角度动作脉冲数=一圈总脉冲数*角度百分比。”
    公式为:
    角度动作脉冲数=一圈总脉冲数*(设定角度/360°)。
    2、 步进电机的距离控制。首先明确步进电机转一圈所需要的总脉冲数。然后确定步进电机滚轮直径,计算滚轮周长。计算每一脉冲运行距离。最后计算设定距离所要运行的脉冲数。
    公式为:
      设定距离脉冲数=设定距离/[(滚轮直径*3.14)/一圈总脉冲数]
    3、 步进电机的位置控制就是角度控制与距离控制的综合。
    以上只是简单的分析步进电机的控制方式,可能与实际有出入,仅供各位同仁参考。
    伺服电机的动作与步进电机的一样,但要考虑伺服电机的内部电子齿轮比与伺服电机的减速比。
    展开全文
  • 2.5.1 基本的算术运算符 2.5.2 算术表达式和运算符的优先级与结合性 2.5.3 表达式各类数值型数据间的混合运算 2.5.4 自增和自减运算符 2.5.5 强制类型转换运算符 2.6 赋值运算符与赋值表达式 2.6.1 赋值运算符 ...
  • 今天主要跟大家分享一下什么是 CQRS,以及项目如何去使用。 一、CRUD系统 我们平常熟悉就是三层架构,通常都是通过数据访问层来...这里基本上是围绕关系数据库构建而成“创建、读取、更新、删除”系统

    转自,建议去看原文哈:https://blog.csdn.net/bntX2jSQfEHy7/article/details/96657886

    今天主要跟大家分享一下什么是 CQRS,以及在项目中如何去使用。

    一、CRUD系统

    我们平常最熟悉的就是三层架构,通常都是通过数据访问层来修改或者查询数据,一般修改和查询使用的是相同的实体。然后通过业务层来处理业务逻辑,将处理结果封装成DTO对象返回给控制层,再通过前端渲染。反之亦然。

    640?wx_fmt=png

    这里基本上是围绕关系数据库构建而成的“创建、读取、更新、删除”系统(即CRUD系统)此类系统在一些业务逻辑简单的项目中可能没有什么问题,但是随着系统逻辑变得复杂,用户增多,这种设计就会出现一些性能问题。

    我们经常用到的解决方案就是对数据库进行读写分离。让主数据库处理事务性的增、删、改操作,让从数据库处理查询操作,然后主从数据库之间进行同步。

    但是这只是从DB角度处理了读写分离,从业务或者系统层面上来说,读和写的逻辑仍然是存放在一起的,他们都是操作同一个实体对象。这时候,CQRS 就该登场了。

     

    二、CQRS系统

    简单的说,CQRS(Command Query Responsibility Segration)就是一个系统,从架构上把 CRUD 系统拆分为两部分:命令(Command)处理和查询(Query)处理。其中命令处理包括增、删、改。

    640?wx_fmt=png

     

    然后命令与查询两边可以用不同的架构实现,以实现CQ两端(即Command Side,简称C端;Query Side,简称Q端)的分别优化。两边所涉及到的实体对象也可以不同,从而继续演变成下面这样。

    640?wx_fmt=png

     

    当然了,CQRS 作为一个读写分离思想的架构,在数据存储方面,也没有做过多的约束。所以 CQRS可以有不同层次的实现。

     

    三、CQRS 实现方式

    CQRS 可以有两种实现方式。

     

    1、CQ 两端数据库共享,只是在上层代码上分离。

    这样做的好处是可以让我们的代码读写分离,更容易维护,而且不存在 CQ 两端的数据一致性问题,

    因为是共享一个数据库的。这种架构是非常实用的(也就是我上面画的那种)

     

    2、CQ 两端不仅代码分离,数据库也分离,然后Q端数据由C端同步过来。

    同步方式有两种:同步或异步,如果需要 CQ 两端的强一致性,则需要用同步;如果能接受 CQ 两端数据的最终一致性,则可以使用异步。

    C端可以采用Event Sourcing(简称ES)模式,所有C端的最新数据全部用 Domain Event 表达即可

    而要查询显示用的数据,则从Q端的 ReadDB(关系型数据库)查询即可(详细可以参考文献3)。

     

    四、CQRS 的简单实现

    说了这么多,该怎么实现呢?我们以上面提到的第一种方式为例:代码层面实现分离,数据库共享。这种方式在企业里也非常实用。首先有几个概念需要介绍一下,CQRS 模式中,首先需要有 Command,这个 Command 命令会对应一个实体和一个命令的执行类。这样整个系统中肯定有很多不同的 Command,那么还需要一个 CommandBus 来做命令的分发处理。可能大家觉得比较抽象,我来写几行示例代码,一看就明白了。

    假设有个订单模块,我要新增一个订单信息。那么根据上文的分析,需要有个新增命令以及对应的订单实体(并不一定和数据库的订单实体完全对应)。首先先创建一个命令接口(绑定命令对应的实体),接口内部有个该命令的处理方法。

    public interface Command<T> {    Object execute(T commandModel);}interface Command<T> {
        Object execute(T commandModel);
    }

    OK,接下来我们可以创建订单的新增命令了。

    @Componentpublic class CreateOrderCommand implements Command<CreateOrderModel> {    @Override    public Object execute(CreateOrderModel model) {        // 具体的逻辑    }}

    到这里,我们写好了具体的创建订单命令的逻辑,那么该命令需要放到 CommandBus 中去执行,所以我们要写这个 CommandBus。

    @Componentpublic class CommandBus {    public  Object dispatch(Commandcmd, T model) {        return cmd.excute(model);    }}
    public class CommandBus {
        public  Object dispatch(Commandcmd, T model) {
            return cmd.excute(model);
        }
    }

    可能大家会看着有点晕,甚至有点绕,没关系,我解释一下:这个 dispatch 方法就相当于分发执行,内部根据传入的具体 Command 以及对应的 model,去执行该 Command 实现的逻辑。好了,那我们在熟悉的 Controller 层该如何去调用呢?很简单,如下:

    @RestController@RequestMapping(value = "/order")public class OrderController {    @Resource    private GetOrderInfoService getOrderInfoService;    @Resource    private CreateOrderCommand createOrderCommand;    @Resource    private CommandBus commandBus;    @PostMapping(value = "/getInfo")    public Object getOrderInfo(GetOrderInfoModel model) {        return getOrderInfoService.getOrderInfos(model);    }    @PostMapping(value = "/creat")    public Object createOrderInfo(CreateOrderModel model) {        return commandBus.dispatch(createOrderCommand, model);    }}
    @RequestMapping(value = "/order")
    public class OrderController {
    
        @Resource
        private GetOrderInfoService getOrderInfoService;
        @Resource
        private CreateOrderCommand createOrderCommand;
        @Resource
        private CommandBus commandBus;
    
        @PostMapping(value = "/getInfo")
        public Object getOrderInfo(GetOrderInfoModel model) {
            return getOrderInfoService.getOrderInfos(model);
        }
    
        @PostMapping(value = "/creat")
        public Object createOrderInfo(CreateOrderModel model) {
            return commandBus.dispatch(createOrderCommand, model);
        }
    }

    我还写了一个获取订单信息的接口,大家有没有发现,查询和插入是不同的方式,插入走的是 CommandBus 分发到 CreateOrderCommand 去执行,而查询则是直接走 service 层去查。这就是 CQRS 模式。当然了,当命令越来越多的时候,也可以将 CommandBus 抽象出接口,可以根据业务需求,实现多个不同的 CommandBus 来分发命令。除此之外,CQRS 还可以用在任务调度模块中,不同的任务可以包含不同的 Command,实际中运用是非常广泛的。

     

    五、总结

    CQRS 是一种思想很简单清晰的设计模式,他通过在业务上分离操作和查询来使得系统具有更好的可扩展性及性能,使得能够对系统的不同部分进行扩展和优化。在 CQRS 中,所有的涉及到对 DB 的操作都是通过发送 Command,然后特定的 Command 触发对应事件来完成操作,也可以做成异步的,主要看业务上的需求了。CQRS 虽然在思想上简单,但是实现上相对来说复杂些,也涉及到 DDD 的一些概念了当然了,这篇文章主要是介绍以及演示 CQRS 模式的基本实践,更多知识需要大家再深入的去学习。最后,希望阅读完本文,能对你有所帮助。

     

    展开全文
  • 关系模型的基本概念

    2020-05-24 14:25:28
    2.是从表(Table)及表处理方式抽象出来,是对传统表及其操作进行数学化严格定义基础上,引入集合理论与逻辑学理论提出。 3.是数据库三大经典模型(层次模型、网状模型和关系模型)之一,现在大多数...
  • 在上一篇中,我们回顾了数据库领域以及 SQL 最新发展趋势。...在关系模型中,用于存储数据的逻辑结构称为关系(Relation);对于使用者而言,关系就是二维表(Table)。 以下是一个员工信息表,它和 Excel 表
  • SIS与ESD、DCS、PLC四者,化工生产过程中,常常被误解,本文从四者最基本的概念,到四者之间具体的关系进行逐一讲解,帮助仪表人了解并掌握。SIS是安全仪表系统,ESD是紧急停车系统,ESD属于SIS的一部分。SIS包括...
  • 线性表数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构实际应用是广泛采用的一种数据...
  • 相信很多新手朋友都遇到过这种情况,编译正常,自己的逻辑也没有错误,但执行的时候却发生数据错误,调试的时候惊奇的发现if条件里的关系运算连个值相等的变量,关系运算结果却是false。小编这里解释一下== 和 ...
  • 今天主要跟大家分享一下什么是 CQRS,以及项目如何去使用。1. CRUD系统我们平常熟悉...这里基本上是围绕关系数据库构建而成“创建、读取、更新、删除”系统(即CRUD系统),此类系统一些业务逻辑简单项...
  • 原创作品,允许转载,转载时请...我们都知道,数据块是oracle最基本的读写单位,但用户所需要的数据,并不是整个块,而是块的行,或列.当用户发出SQL语句时,此语句被解析执行完毕,就开始了数据的抓取阶段,此阶段,服务
  • 6,Hadoop HA配置

    2018-10-17 15:03:59
    HA配置: 配置NameNode逻辑到物理映射关系 配置JN结点通信方式 Ssh 手动HA基本上配置完了 ...但是HA格式化之前要先启动journalNode,因为格式化时候重要是生成一个集群ID(Clu...
  • 它们都会以“组件”作为一个基本的抽象单元。 可能不同的框架,它所提供的操控组件的方式不一样,但概念上是相似的。 之前听过一次尤雨溪的知乎Live,他将实际应用的组件分为四种类型并依次介绍...
  • 线性表中数据元素所代表具体含义随具体应用不用而不同,线性表定义中,只不过是一个抽象表示符号。 线性表抽象数据类型定义 ADT List{ 数据对象; 数据关系基本操作:InitList(&L) ...
  • 程序员除了会 CRUD 之外,还应该知道什么叫 CQRS!

    千次阅读 多人点赞 2019-07-29 16:18:28
    作者 |倪升武 责编 | 郭 芮 今天主要跟大家分享一下什么是 CQRS,以及项目如何去使用。 ...我们平常熟悉就是三层架构,通常都是通过数据访问层来修改或者查询...这里基本上是围绕关系数据库构建而成“...
  • 是从表(Table)及表处理方式抽象出来, 是对传统表及其操作进行数学化严格定义基础上,引入集合理论与逻辑学理论提出。 是数据库三大经典数据模型之一, 也是现在大多数商品化数据库系统所仍然使用数据...
  • 易学C++,C++入门

    2009-12-06 14:30:11
     1.5 C语言、C++和Visual C++的关系   1.6 学习程序设计的方法和必要准备   1.7 总结   第2章 Hello,World   2.1 如何创建一个示例程序   2.2 创建自己的Hello,World   2.3 C++语言的输出与...
  • 数据库的逻辑结构设计

    万次阅读 2018-06-30 23:21:51
    逻辑结构是独立于任何一种数据模型实际应用中,一般所用数据库环境已经给定(如SQL Server或Oracle或MySql)。由于目前使用数据库基本上都是关系数据库,因此首先需要将E-R图转换为关系模型,然后根据具体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 756
精华内容 302
关键字:

在逻辑关系中,最基本的关系是