知识大全 数据库与面向对象是冤家

Posted 客户

篇首语:胸怀万里世界, 放眼无限未来。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 数据库与面向对象是冤家相关的知识,希望对你有一定的参考价值。

  面向对象和数据库之间存在着矛盾 这正是我们学习了面向对象理论之后 信心百倍地要去做项目时 突然发现有很多问题的原因……

  话说当年面向对象和数据库刚出道的时候 曾经引发过惊天动地的大讨论(当然 这里说的是关系型数据库 以下简称数据库) 两个阵营的人都试图说服对方 加入到自己的阵营里来(传说是都说了 你别做了那个了 没发展) 经过车轮式讨论 也没得到共识 只好分道扬镳了

  虽然 无法考证这个传说是不是真的 但确实 面向对象和数据库之间存在着矛盾 这正是我们学习了面向对象理论之后 信心百倍地要去做项目时 突然发现有很多问题的原因

  要是世界上只有面向对象 或则只有数据库 那该多好啊?但这只是奢望罢了 既然矛盾并共存著 那就只能取长补短了

  让面向对象和数据库 好好合作

  大家有没有觉得 类图和ER图画出来之后 是不是很像?矛盾就在这里 数据库阵营的人认为 面向对象做得是在内存中建立一个新的数据库 浪费了资源 而面向对象阵营的人认为面向对象更符合人的思维模式 可以开发出更健壮的系统

  先看一下面向对象和数据库的优点吧 面向对象的优点在于模块化和处理复杂的业务逻辑 而数据库的优点在于数据存储 查询 统计

  解决一个问题 不是只有一种方法 不能说哪一个方法是万能药 每一个方法都有它存在的意义

  面向对象和数据库各有其特长 何不让它们发挥各自的特长呢?

  面向对象 你就处理复杂的业务逻辑~

  数据库 你就处理数据的查询 统计 简单的业务逻辑~

  好 首先大的方向已经明确了 但开始做项目之前还要明确以下几点 当需要时 才加载 类有属性和方法 下面定义了一个客户类

  

  // 客户类   class Customer      Public int Id; //客户ID   Public String Name;//客户姓名   // 取客户的销售额   public bool GetSaleAmount();   

  我现在要查询客户的销售额 那么Id和Name对我来说是没有意义的 如果不是数据库编程 这都是无关紧要的 但数据库编程中 属性的数据保存在数据库里 所以每生成一个对象 都要去查询数据库的话 系统的性能肯定大打折扣 看一下修改后的类

  

  // 客户类   class Customer      // 取客户信息   public DataSet GetInfo ();   // 取客户的销售额   public bool GetSaleAmount();   

  类中把Id和Name属性去掉 然后加了一个GetInfo方法 现在好了 生成客户对象 不会进行数据库查询 当需要客户信息时 可以调用GetInfo方法来获得 这种方法看起来 不像是面向对象的 因为它没有属性 面向对象是思想 理论 理论要联系实际 根据实际情况取舍一些东西是无可厚非的 况且 这样做也不会丢掉面向对象的优点(还可以用 继承 多态等等)

  用什么来传递数据 编程工具都有数据库控件 比如 NET有DataSet Delphi有TTable TQuery等等 那 是使用数据库控件还是使用对象?应该是从它们的优点去出发来决定用哪一个 对象结构简单 操作起来非常方便 而且直观 数据库控件虽然结构复杂 操作不方便 但处理大量数据是它的优势 所以传递单条记录时使用对象 传递一组记录的时候使用数据库控件是一个不错的方法

  当然传递一组记录时也可以用对象 把对象装在容器里 然后传递 但要考虑一下几点 只是为了显示吗?那就大可不必 因为它的功能只是显示 数据库控件可以做得很好 而且不需要额外的工作 要用这些对象做统计操作吗?那就需要考虑效率问题了 数据传输和对象生成 需要消耗更多的资源 而且统计是数据库的强项 为什么放著能干的人 不用呢?

  一般常用的业务逻辑类编写方式

  用类把你的函数封装起来

  方法 声明一个static类 然后把函数放到类里 不要说这个太不像面向对象了 类是一个模块 能准确定义一个类是面向对象中最困难的事情

  数据处理 手写SQL

  数据容器 编程工具提供的数据库控件

  

  // 客户类   static class Customer      // 输入客户信息   static public bool Insert(int Id int Name)         // 更新客户信息   static public bool Update(int Id int Name)         //删除客户信息   static public bool Delete(int Id)         //获得客户信息   static public DataSet GetInfo(int Id)         //获得客户列表   public DataSet GetList()         

  优点

   对面向对象理论方面要求不高 通过短时间学习 就可以掌握

   代码简单易懂

   代码效率高

  缺点

   不能充分发挥面向对象的特点

   Update和Insert把数据库字段作为参数 当添加字段或删除字段时 需要修改函数

  发挥面向对象和数据库的特点

  方法 声明一个Entity类和一个业务逻辑类

  数据处理 手写SQL

  数据容器 插入 更新 传递单条记录使用Entity对象 一组记录使用数据库控件

  

  // 客户Entity   class CustomerEntity      public int Id;   public string Name;      // 客户类   class Customer      private int Id;   //构造   public Customer(int Id)      this Id = Id;      // 输入客户信息   public bool Insert(CustomerEntity CustEntity)         // 更新客户信息   public bool Update(CustomerEntity CustEntity)         //删除客户信息   public bool Delete()         //获得客户信息   public CustomerEntity GetInfo()         //获得客户列表   public DataSet GetList()         

  优点

   能发挥面向对象和数据库各自的特点

   代码效率高

  缺点

   需要比较全面的面向对象理论

   使用了Entity类 需要自动生成工具

  使用O/R Mapping 工具

  方法 使用O/R Mapping工具

  数据处理 O/R Mapping 工具自动处理

  数据容器 对象

  

  // 客户类   class Customer      public int Id;   public string Name;   // 输入客户信息   public bool Insert(CustomerEntity CustEntity)         // 更新客户信息   public bool Update(CustomerEntity CustEntity)         //删除客户信息   public bool Delete()         //获得客户信息   public CustomerEntity GetInfo()         //获得客户列表   public IList GetList()         

  优点

   能发挥面向对象特点

   可以自动把对象模型转换到数据模型

   能自动处理 简单的CURD

  缺点

   需要很高的能力和耐心

   流行的O/R Mapping 工具都是开源出来的 没有保障

   还不是很完善 存在不可预测的危险

   对于处理复杂的对象关系 配置复杂

   需要额外学习O/R Mapping 方面的知识

  那到底该用什么样的方式?

  采用什么样的方式 实际上说 主要还是在人 而不是在技术 确定使用哪种方式之前 可以考虑以下几个问题

   使用它的目的是什么?

   对它了如指掌吗?如果出现问题 能马上解决吗?

   它简单吗?初学的人需要多长时间 才能掌握?

   跟所有人达成共识了吗?有没有抵触的人?

cha138/Article/program/Oracle/201311/18925

相关参考

知识大全 多态与面向对象(一)

  不管时光如何流逝应该说每个人对他职业生涯的第一次面试都是记忆犹新不是吗?    经过前两轮的筛选我推开那扇门小心翼翼地坐在Andy面前我应聘的职位是C++程序员坦率的讲我有一些紧张您知道的一个找不

知识大全 JS中的prototype与面向对象

JS中的prototype与面向对象  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!<scri

知识大全 叩开C#之门系列之C#与面向对象编程语言

叩开C#之门系列之C#与面向对象编程语言  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#是纯

知识大全 js一般方法改写成面向对象方法的无限级折叠菜单示例代码

  本例是应用别人的例子原来那位老兄是用一般方法写成的无限级折叠菜单在此先感谢他!后来我就通过了一些简化修改将原来的例子改成了面向对象的方式实例中的展开与闭合的小图标可以自己重新添加从而更好的查看效果

知识大全 再谈面向对象

  谈到面向对象这方面的文章非常多但是明确地给出对象的定义或说明对象的定义的非常少——至少我现在还没有发现其初面向对象是专指在程序设计中采用封装继承抽象等设计方法可是这个定义显然不能再适合现在情况面向

知识大全 我的面向对象程序观

  我的面向对象程序观    )面向对象概念的一些误解    面向对象是一个如今被人叫烂的词汇就像去年人们都喜欢把自己的公司打上的标记一样其实有多少人能真正理解这个词汇呢很难说我喜欢这样来比喻人们对对

知识大全 对象的创建和存在时间

  从技术角度说OOP(面向对象程序设计)只是涉及抽象的数据类型继承以及多形性但另一些问题也可能显得非常重要本节将就这些问题进行探讨  最重要的问题之一是对象的创建及破坏方式对象需要的数据位于哪儿如何

知识大全 面向对象逻辑思维方法

Java进阶:面向对象逻辑思维方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  什么是面向对象

知识大全 PHP学习笔记之面向对象设计

PHP学习笔记之面向对象设计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  面向对象设计是php

知识大全 计算机网络技术专业到底学的是什么?

计算机网络技术专业到底学的是什么?主要课程:数据库原理与SQL SERVER,Oracle数据库管理、面向对象程序设计,网络安全管理与维护技术,HTML与JavaScript,网络后期维护与运营,网络