领域驱动设计

传统的设计往往是针对数据为中心的开发方式,结合目前的REST风格API设计,很容易便能开发出一个简单的CURD的项目。 也正是由于针对数据开发, 即针对数据库开发,用了数据库导致业务模型被数据库给绑定了,因此会引入一些问题。

  • 数据库中的实体与页面元素不一致问题。
  • 数据库的实体的设计往往不能体现类与类之间的复杂关系,如继承,对应关系。
    • 继承,比如A,B继承于C,如果A,B单独建表,会存在冗余,如果A,B一个表进行表示,就会存在大量的空白字段。
    • 1对多,比如A中包含多个B,在JAVA代码中是用List表示的,但是数据库中只会在A中存储B的引用。在实际中的业务,虽然是对一个实体的操作,我们往往要对数据库中多个表进行操作。
  • 数据库中的实体会在散落在多处代码中改变,由此导致的矛盾没法定位的问题

领域驱动设计(Domain-Driven Design,DDD),开发团队和领域专家一起通过 通用语言 去理解和消化领域知识, 从领域知识中提取和划分以一个子领域 ,构建出一套符合当前领域的模型。 第一步就是考虑领域模型,而不是将其分割为数据和行为,然后数据用数据库实现,行为用服务实现。DDD关注于业务而不是数据。

其特点在于:领域模型准确地反映了业务语言,避免了只关系数据,这些数据对象只拥有setter/getter方法外,没有任何业务方法。

关键在于如何划分领域,划分好边界

与微服务的关系

DDD解决了微服务的拆分边界困难。 微服务讲究高内聚,低耦合。DDD通过聚合将关联性强的业务划分到一个边界之中。

面向切面编程

实现

编译期、字节码加载前、字节码加载后三种时机来实现AOP

角色

AOP联盟、aspectj、jboss AOP、Spring自身实现的AOP、Spring嵌入aspectj。

接口设计

AOP联盟定义的概念或接口:Pointcut(概念,没有定义对应的接口)、Joinpoint、Advice、MethodInterceptor、MethodInvocation

SpringAOP针对上述Advice接口定义的接口及其实现类:BeforeAdvice、AfterAdvice、MethodBeforeAdvice、AfterReturningAdvice;针对aspectj对上述接口的实现AspectJMethodBeforeAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJAfterAdvice。

SpringAOP定义的定义的AdvisorAdapter接口:将上述Advise转化为MethodInterceptor

SpringAOP定义的Pointcut接口:含有两个属性ClassFilter(过滤类)、MethodMatcher(过滤方法)

SpringAOP定义的ExpressionPointcut接口:实现中会引入aspectj的pointcut表达式

SpringAOP定义的PointcutAdvisor接口(将上述Advice接口和Pointcut接口结合起来)

面向对象编程

面向对象简单来说就是将功能封装到对象(数据和操作结合)里,我们面向对象,让对象去完成这些功能。 万物皆对象。(在我们程序员眼中,一切皆对象)

操作的是:类。

它具有三大特性:

封装

将描述事物的数据和操作封装在一起,形成一个类;被封装的数据和操作只有通过提供的公共方法才能被外界访问(封装隐藏了对象的属性和实施细节),私有属性和方法是无法被访问的,表现了封装的隐藏性,增加数据的安全性。

继承

单继承,让类与类之间产生关系,注意这里是有父子关系。

多态

virtual方法

abstract类

当父类的某些方法不确定时,可以用abstract关键字来修饰该方法,用abstract来修饰该类。

(相同但是不确定的东西,以为了之后的重用)

接口

Reactive响应式编程

Reactive响应式(反应式)编程 是一种新的编程风格,其特点是异步或并发、事件驱动、推送PUSH机制以及观察者模式的衍生。reactive应用(响应式应用)允许开发人员构建事件驱动(event-driven),可扩展性,弹性的反应系统:提供高度敏感的实时的用户体验感觉,可伸缩性和弹性的应用程序栈的支持,随时可以部署在多核和云计算架构。

Spring WebFlux

Spring WebFlux是随Spring 5推出的响应式Web框架。 既然是响应式编程了,有些朋友可能会想统一用函数式的编程风格,WebFlux满足你。WebFlux提供了一套函数式接口

命令式编程

一条条命令,一步步完成;把人类理解认知翻译成精确的计算机语言。

int count;
for(int i=0;i<students.size();i++){
   if(students.get(i).getAge()<18){
       count++;
   }
}

声明式编程

对外声明需要什么,怎么做由别人完成。

int count=students.stream().filter(s->s.getAge()<18).count();

声明式编程函数式编程的一个重要特点。

函数式编程

主要思想是把运算过程尽量写成一系列嵌套的函数调用,及将函数作为参数。

特点:

  • 声明式编程
  • 函数是一等公民,每一步都用返回值
  • 没有 副作用(side effect),所有的功能都是返回一个新值,并且不得修改外部变量的值(javascript,python可以修改😕),这样保证了同样的输入,函数总是返回同样的结果
  • 没有数据类型,只有值
  • 采用递归,而不是迭代

移动应用程序

移动应用程序可以分为 原生移动端应用混合移动端应用

原生移动端应用:运行效率高,界面响应速度快,动画效果流畅,用户体验较好;但是技术门槛较高,尤其是iOS,还需要使用objective-c或swift。不跨平台,一个应用需要Android和iOS两套代码,需要两个技术团队来维护。

混合移动端应用:能够根据服务端返回的内容随意修改应用中的内容,甚至是布局,甚至是添加新功能。灵活,技术门槛低,一个前端开发工程师也是可以快速的学会开发移动应用的。 跨平台开发,write once ,run anywhere。代码只需要写一次就可以在不同平台上运行;但是应用是网页代码,html和js写出来的,在一些对计算要求比较高的操作上,比如动画效果会比原生代码开发的应用差一些。

React Native

React Native是一个 JavaScript 框架,用于为iOS和 Android 本地编写移动应用程序。它基于React,Facebook的用于构建用户界面的JavaScript库 - 但它不是针对浏览器,而是针对移动平台。

产出的并不是“网页应用”, 或者说“HTML5应用”,又或者“混合应用”。 最终产品是一个真正的移动应用,从使用感受上和用Objective-C或Java编写的应用相比几乎是无法区分的。

React Native于2013年夏天在Facebook开始作为内部黑客马拉松项目,并且自此成为最受欢迎的移动框架之一。2015年3月,Facebook在F8宣布React Native已在GitHub上开放。

使用React Native,应用程序是使用JavaScript和JSX(XML-esque标记)的混合编写的。在引擎盖下,React Native“bridge”调用Objective-C(适用于iOS)或Java(适用于Android)中的本机呈现API。这允许您的应用使用真实的移动UI组件呈现,而不是使用webview,使其外观和感觉与任何其他本机移动应用程序一样。