多少光年

风可以吹走尘土,但吹不走记忆


  • 首页

  • 标签

  • 分类

  • 归档

领域模型的价值

发表于 2016-02-21 | 更新于 2018-11-19 | 分类于 技术 , 领域模型 | 阅读次数:

价值

  • 提供什么服务:
    • 什么来体现服务:运行方式,运行过程和业务逻辑
  • 提供的质量:如何服务,要做的事情

传统数据库为中心

业务逻辑在数据库上,结合系统代码来保证业务逻辑的实现。
以数据库为中心的开发如何的OO﹐如何多的设计模式﹐架构体系如何优美﹐它始终离不开数据库。

OO|面向对象

表现点则是直接在对象本身上﹐在于对象之间真正的交互过程﹐结果也是保留在对象的属性和对象与对象的关系中
逻辑直接存在于对象上﹐这与现实情况是吻合的。

领域模型是一种思维﹐是一种方法,是在系统分析阶段使用﹐而不是在代码中进行纯设计时的工具。不是为了OO而领域﹐不是为了最终要新增数据库而领域。在没有理解领域模型本质时,任何编码都得不到收益。

在分析或架构一个系统时,要得出系统的服务和服务场景,即user case。

领域模型的特点

  1. 领域模型是对具有某个边界的领域的一个抽象,反映了领域内用户业务需求的本质;领域模型是有边界的,只反应了我们在领域内所关注的部分;
      2. 领域模型只反映业务,和任何技术实现无关;领域模型不仅能反映领域中的一些实体概念,如货物、书本、应聘记录、地址等;还能反映领域中的一些过程概念,如资金转账,等;
      3. 领域模型确保了我们的软件的业务逻辑都在一个模型中,都在一个地方;这样对提高软件的可维护性,业务可理解性以及可重用性方面都有很好的帮助;
      4. 领域模型能够帮助开发人员相对平滑地将领域知识转化为软件构造;
      5. 领域模型贯穿软件分析、设计,以及开发的整个过程;领域专家、设计人员、开发人员通过领域模型进行交流,彼此共享知识与信息;因为大家面向的都是同一个模型,所以可以防止需求走样,可以让软件设计开发人员做出来的软件真正满足需求;
      6. 要建立正确的领域模型并不简单,需要领域专家、设计、开发人员积极沟通共同努力,然后才能使大家对领域的认识不断深入,从而不断细化和完善领域模型;
      7. 为了让领域模型看的见,我们需要用一些方法来表示它;图是表达领域模型最常用的方式,但不是唯一的表达方式,代码或文字描述也能表达领域模型;
      8. 领域模型是整个软件的核心,是软件中最有价值和最具竞争力的部分;设计足够精良且符合业务需求的领域模型能够更快速的响应需求变化。

FlatBuffers简介

发表于 2016-02-19 | 更新于 2018-11-19 | 分类于 技术 , FlatBuffers | 阅读次数:

FlatBuffers简介

代码:https://github.com/google/flatbuffers/

文档:http://google.github.io/flatbuffers/

FlatBuffers是一个开源的、跨平台的、高效的、提供了C++/Java接口的序列化工具库。它是Google专门为游戏开发或其他性能敏感的应用程序需求而创建。 允许在不解析和解包就可以直接访问序列化数据,而且仍然很好地向上和向下兼容,这意味着序列化对象可以多版本共存。

支持的操作系统

  • Android
  • Windows
  • MacOS X
  • Linux

目前支持的编程语言

  • C++
  • C#
  • Go
  • Java
  • JavaScript
  • PHP
  • Python

and many more in progress…

为什么要用FlatBuffers?

  • 对序列化数据的访问不需要打包和拆包——它将序列化数据存储在缓存中,这些数据既可以存储在文件中,又可以通过网络原样传输,而没有任何解析开销;
  • 内存效率和速度——访问数据时的唯一内存需求就是缓冲区,不需要额外的内存分配。 这里可查看详细的基准测试;
  • 扩展性、灵活性【多版本兼容】——它支持的可选字段意味着不仅能获得很好的前向/后向兼容性(对于长生命周期的游戏来说尤其重要,因为不需要每个新版本都更新所有数据);
  • 最小代码依赖——仅仅需要自动生成的少量代码和一个单一的头文件依赖,很容易集成到现有系统中。再次,看基准部分细节;
  • 强类型设计——尽可能使错误出现在编译期,而不是等到运行期才手动检查和修正;
  • 使用简单——生成的C++代码提供了简单的访问和构造接口;而且如果需要,通过一个可选功能可以用来在运行时高效解析Schema和类JSON格式的文本;
  • 跨平台——支持C++11、Java,而不需要任何依赖库;在最新的gcc、clang、vs2010等编译器上工作良好;

为什么不使用Protocol Buffers的,或者JSON

Protocol Buffers的确和FlatBuffers比较类似,但其主要区别在于FlatBuffers在访问数据前不需要解析/拆包这一步。 而且Protocol Buffers既没有可选的文本导入/导出功能,也没有Schemas语法特性(比如union)。同时,在工程中使用时,FlatBuffers的引用比Protocol Buffers方便很多,只需要包含两三个头文件即可。

JSON的可读性很好,而且当和动态类型语言(如JavaScript)一起使用时非常方便。然而在静态类型语言中序列化数据时,JSON不但具有运行效率低的明显缺点,而且会让你写更多的代码来访问数据(这个与直觉相反)。

与Protocol Buffers或JSON Parsing这样的可选方案相比,FlatBuffers的优势在于开销更小,这主要是由于它没有解析过程。http://google.github.io/flatbuffers/md__benchmarks.html

FlatBuffers 使用指南

发表于 2016-02-19 | 更新于 2018-11-19 | 分类于 技术 , FlatBuffers | 阅读次数:

FlatBuffers 使用指南

FlatBuffers序列化性能是protobuf的2倍,但size也是protobuf的2倍

编译源码

1
2
3
$ git clone https://github.com/google/flatbuffers.git
#切换到最新release版本
$ git checkout v1.2.0

安装cmake

http://www.cmake.org.

1
2
3
4
for mac osx
$ brew install cmake
for centOS
$ sudo yum install cmake

用cmake构建project

1
2
3
cmake -G "Unix Makefiles"
cmake -G "Visual Studio 10"
cmake -G "Xcode"

在*nix系统,mac osx系统也建议使用 cmake -G "Unix Makefiles",生成Makefile,之后make & make install
编译生成flatc并安装到系统。

1
2
3
$ cmake -G "Unix Makefiles"
$ make
$ make insall

使用schema编译器flatc来生成基础代码

1
2
3
$ cd samples
#在目录src中生成java代码
$flatc -j -o src monster.fbs

编程语言参数:

  • –cpp, -c : Generate a C++ header for all definitions in this file (as filename_generated.h).
  • –java, -j : Generate Java code.
  • –csharp, -n : Generate C# code.
  • –go, -g : Generate Go code.
  • –python, -p: Generate Python code.
  • –javascript, -s: Generate JavaScript code.
  • –php: Generate PHP code.

其他常用选项:

  • -o PATH 指定源码输出目录
  • -I PATH 有include语句时,指定include目录

完整的参数

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
usage: flatc [OPTION]... FILE... [-- FILE...]
-b Generate wire format binaries for any data definitions.
-t Generate text output for any data definitions.
-c Generate C++ headers for tables/structs.
-g Generate Go files for tables/structs.
-j Generate Java classes for tables/structs.
-s Generate JavaScript code for tables/structs.
-n Generate C# classes for tables/structs.
-p Generate Python files for tables/structs.
-o PATH Prefix PATH to all generated files.
-I PATH Search for includes in the specified path.
-M Print make rules for generated files.
--strict-json Strict JSON: field names must be / will be quoted,
no trailing commas in tables/vectors.
--defaults-json Output fields whose value is the default when
writing JSON
--no-prefix Don't prefix enum values with the enum type in C++.
--scoped-enums Use C++11 style scoped and strongly typed enums.
also implies --no-prefix.
--gen-includes (deprecated), this is the default behavior.
If the original behavior is required (no include
statements) use --no-includes.
--no-includes Don't generate include statements for included
schemas the generated file depends on (C++).
--gen-mutable Generate accessors that can mutate buffers in-place.
--gen-onefile Generate single output file for C#
--raw-binary Allow binaries without file_indentifier to be read.
This may crash flatc given a mismatched schema.
--proto Input is a .proto, translate to .fbs.
--schema Serialize schemas instead of JSON (use with -b)
FILEs may depend on declarations in earlier files.
FILEs after the -- must be binary flatbuffer format files.
Output files are named using the base file name of the input,
and written to the current directory or the path given by -o.
example: flatc -c -b schema1.fbs schema2.fbs data.json

写schema IDL文件

参考:http://google.github.io/flatbuffers/flatbuffers_guide_writing_schema.html

春天开篇

发表于 2016-02-19 | 更新于 2018-11-19 | 分类于 那年今日 | 阅读次数:

一年之计在于始

想到这句名言时,却不知道出处,也忘记了其他的句子,随即搜了一下,原句如下:

“一日之计在于晨,一年之计在于春,一生之计在于勤”

更有:

“一年之计在于春,一日之计在于晨,一家之计在于和,一生之计在于勤”

春,晨,和,勤

1…34
铁汤

铁汤

34 日志
18 分类
54 标签
Github 蜂鸟 500px 简书 微服务 大数据
友情链接
  • 许进沉思录
  • Spring Cloud中国社区博客
  • Spring Cloud中文网
  • 程序员DD
  • spring4all
© 2015 – 2019 铁汤