zoukankan      html  css  js  c++  java
  • 面向对象建模方法与数据库建模方法的比较

    我们知道:软件开发一般分为五个阶段:分析、设计、编程、调试、部署和运行。

    编程阶段我们通常采用Java/.NET这样面向对象的 语言,使用面向对象的语言可以为我们带来很多设计上的好处。不过好多时候,在开发过程中我们会错误的使用面向对象语言,具体的表现就是用面向对象的语言来 编写过程式的代码。我们开发软件就是将现实世界的东西对应到计算机世界中,如何做好现实世界与计算机世界间的映射,是判断软件产品好坏的标准。目前,将需求从客观现实世界映射到计算机软件世界主要有两种方式:传统的数据库分析设计面向对象建模(object-oriented class model)


    在 分析阶段,采用哪种建模方式决定了后面编程阶段的编程特点。如果以数据表为核心进行分析设计,也就是根据需求首先得到数据表名和数据字段,接下来的编程工 作只需要我们学会sql语句操作这些数据表,软件中的活动就是数据表前后顺序的操作(具体的操作就是crud),必然我们的代码会成为过程式的代码。

    相反,在分析阶段,我们根据需求采用面向对象建模的方法,那么我们使用面向对象的语言,再加上框架的辅助,就很顺理成章走上OO编程风格。

    下面我们来看看两种建模方法是如何来表达客观世界的。

    面向对象的模型(Class Model)

    面向对象模型的核心:类、对象、关系

    类与对象

    类(class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性方法。类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类的概念对象的概念是紧密交织在一起的,对象是存在于时间和空间中的具体的实体,而类仅代表一种抽象,即一个对象的“本质”

    类的关系

    类与类的关系其实就是对象间的关系,具体的关系有:依赖、依赖、聚合、组合

    具体的关于对象的关系和数据库的关系可以参看文章:领域驱动设计之model的关系及ef建模

    面向对象模型遵循的基本原则有:抽象、封装、模块化以及层次原则等

    抽象

    抽象是处理现实世界复杂性的最基本方式在OO方法中它强调一个对象和其他对象相区别的本质特性对于一个给定的域确定合理的抽象集是面向对象建模的关键问题之一

    封装

    封装是对抽象元素的划分过程抽象由结构和行为组成封装用来分离抽象的原始接口和它的执行

    封装也称为信息隐藏Information Hiding它将一个对象的外部特征和内部的执行细节分割开来并将后者对其他对象隐藏起来

    模块化

    模块化是已经被分为一系列聚集的和耦合的模块的系统特性对于一个给定的问题确定正确的模块集几乎与确定正确的抽象集一样困难通常每个模块应该足够简单以便能够被完整地理解

    层次

    抽象集通常形成一个层次,层次是对抽象的归类和排序。在复杂的现实世界中有两种非常重要的层次一个是类型层次另一个是结构性层次 。确定抽象的层次是基于对象的继承,它有助于在对象的继承中发现抽象间的关系,搞清问题的所在理解问题的本质

    数据库模型(Database Model 传统E-R模型 )

    好了,下面我们谈论关系数据表模型,以前我们朴素的分析设计都是根据需求直接建立数据表的方式来进行的,为什么称为朴素, 是因为我们好像只有数据结构 算法方面的知识,也认为只有这样做才叫做软件。 那么既然这条路能够走出来,我们看看这个领域是如何映射客观世界的。

    数据表由于技术提供庞大数据存储和可靠的数据访问,正在不断从技术领域走向社会领域,很多不懂计算机的人 也知道需要建立数据库来管理一些事务,但是不代表我们就必须围绕数据库的分析设计。

    数据表是类似前面的“类”,也是一种表达客观世界的基本单元,表有多列字段,表的字段是保存数据的,每个字段有数据类型。 注意,这里没有数据的封装和公开,表的字段是赤裸的,只要有数据库访问权限,任何人都可以访问,没有结构层次关系, 都是扁平并列的

    数据表也有一些行为,这些行为是基于实体的一些规则:

    约束(Constraints) 能够保证不同表字段之间的关系完整安全性,保证数据库的数据安全。

    触发器(Triggers)提供了实体在修改 新增和删除之前或之后的一些附加行为,

    存 储过程(Database stored procedures)提供数据专有的脚本性语言,存储过程象一个数学公式虽然具有抽象简洁美学,但是这种简洁是闷葫芦美学,不是大众美学,只有公式存储 过程发明者自己了解精通,别人无法插手,软件不是科学,不是比谁智商高,科研水平高,软件是人机工程,更讲究集体,讲究别人是否方便与你协同扩展软件。

    关 系数据表的遍历访问是通过列字段遍历或表join等方式实现,SQL语句是这样标准语言, 只要会写SQL语句,就能访问那些失去层次,失去客观世界特征的苍白的数据,这样的系统能够多少真实 反映客观需求,是有问号的?SQL语句是否方便修改,是否经得起频繁修改而不出错,都是有疑问的地方,是否 SQL语句越复杂,修改越快,或者另外一个程序员能够很快修改不是自己写的SQL语句,这些都是问题所在。

    数据表关系

    数 据表的关系主要是通过外健或专门关联表来表达的,这种关系虽然可以反映1:1或1:N这样关系,但是无法 表达关系的性质,是紧密组成关系式的关联,还是无关紧要的普通关系,正因为如此,使用数据表分析设计时, 我们会有蜘蛛网的关系表,这些关系由于在后期无法分辨性质,无法进行整理,增加了系统复杂性。

    更重要的是:分析就是对一个可能陌生领域进行 探寻,如果使用数据表的分析设计方法,那么我们实际就是 在陌生领域中寻找数据表这样一个形式,那么有可能产生误判断,将一个实则是表达关系的东东误认为是一个实体表, 因为关系表必然带来关系,这样,就必然产生蜘蛛网式的数据表模型,将简单问题复杂化。

    两种建模方法对应的模型


    面向对象建模的方法在开发过程中使用领域驱动设计的方法开发更为友好


    传统的数据库分析设计的方法我们在开发过程中更多的使用贫血模型

  • 相关阅读:
    第二节:Java环境变量配置
    第一节:VS充当IIS的配置步骤(VS2017和VS2019)
    .Net进阶系列(21)-跨域请求
    02-Unity深入浅出(二)
    第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
    01-Unity深入浅出(一)
    第十二节:SQLServer存储过程详解及EFCore调用
    Android 组件系列-----Activity的传值和回传值
    Access大数据高效分页语句
    C#清除HTML样式
  • 原文地址:https://www.cnblogs.com/whx1973/p/3360730.html
Copyright © 2011-2022 走看看