熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

數據庫與面向對象是冤家

2013-11-13 22:22:39  來源: Oracle 

  面向對象和數據庫之間存在著矛盾這正是我們學習了面向對象理論之後信心百倍地要去做項目時突然發現有很多問題的原因……

  話說當年面向對象和數據庫剛出道的時候曾經引發過驚天動地的大討論(當然這裡說的是關系型數據庫以下簡稱數據庫)兩個陣營的人都試圖說服對方加入到自己的陣營裡來(傳說是都說了你別做了那個了沒發展)經過車輪式討論也沒得到共識只好分道揚镳了

  雖然無法考證這個傳說是不是真的但確實面向對象和數據庫之間存在著矛盾這正是我們學習了面向對象理論之後信心百倍地要去做項目時突然發現有很多問題的原因

  要是世界上只有面向對象或則只有數據庫那該多好啊?但這只是奢望罷了既然矛盾並共存著那就只能取長補短了

  讓面向對象和數據庫好好合作

  大家有沒有覺得類圖和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有DataSetDelphi有TTableTQuery等等是使用數據庫控件還是使用對象?應該是從它們的優點去出發來決定用哪一個對象結構簡單操作起來非常方便而且直觀數據庫控件雖然結構復雜操作不方便但處理大量數據是它的優勢所以傳遞單條記錄時使用對象傳遞一組記錄的時候使用數據庫控件是一個不錯的方法

  當然傳遞一組記錄時也可以用對象把對象裝在容器裡然後傳遞但要考慮一下幾點只是為了顯示嗎?那就大可不必因為它的功能只是顯示數據庫控件可以做得很好而且不需要額外的工作要用這些對象做統計操作嗎?那就需要考慮效率問題了數據傳輸和對象生成需要消耗更多的資源而且統計是數據庫的強項為什麼放著能干的人不用呢?

  一般常用的業務邏輯類編寫方式

  用類把你的函數封裝起來

  方法聲明一個static類然後把函數放到類裡不要說這個太不像面向對象了類是一個模塊能准確定義一個類是面向對象中最困難的事情

  數據處理手寫SQL

  數據容器編程工具提供的數據庫控件

  

  // 客戶類
  static class Customer
  {
  // 輸入客戶信息
  static public bool Insert(int Idint Name)
  {
  }
  // 更新客戶信息
  static public bool Update(int Idint 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)
  {
  thisId = 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 方面的知識

  那到底該用什麼樣的方式?

  采用什麼樣的方式實際上說主要還是在人而不是在技術確定使用哪種方式之前可以考慮以下幾個問題

   使用它的目的是什麼?

   對它了如指掌嗎?如果出現問題能馬上解決嗎?

   它簡單嗎?初學的人需要多長時間才能掌握?

   跟所有人達成共識了嗎?有沒有抵觸的人?

  不要讓項目成為你練手的試驗品不要讓底下的人每天處理%的工具問題只處理%的業務邏輯業務邏輯才是客戶需要的東西


From:http://tw.wingwit.com/Article/program/Oracle/201311/18925.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.