[和管子對話] 1 2007-4-5/對面向對象的你言我語
引用:記錄和管偉同志在軟件開發方面的交流點滴,匯成江河以滋志同道合者。
主人公簡介:
管子,又名雙眼皮,乃技術通博之人。
王者,.NET的愛好之徒,認為C#代碼,有藝術的感覺而癡狂。一句話,為技術而藝術。
管語:
面向對象是一個理論,每一種面向對象的程序語言對這個理論的支持程度都不一樣,C++支持的最全面,但是C++中有太多自己的東西,所以說C++用來描述面向對象理論,盡管全面,但不完美,其他像java或C#雖然這兩個語言用來描述這個理論比較好,但是它們支持的不夠全面。
這是因為面向對象也并不是完美的理論,所以語言的發明人,就拋棄了他們認為面向對象理論中的糟粕!
這和關系數據庫的理論和數據庫的產品之間的關系是非常類似的,關系數據庫理論的作者提出要滿足n條規則,那么這個數據庫產品才算是關系型的,而時至今日,世界上只有oracle才僅僅滿足了m條,m約等于n/2的,oracle已經相當成功,為人類的文明進步提供了巨大幫助了,呵呵!我自己的一點看法,說出來給你聽聽。
王論:
面向對象是程序設計的思想里程碑,從POP到OOP,最重要的轉變,應該是從需求到設計,不是以流程為重點,而是以對象為核心。我們針對需求,重點考慮應該是有什么東西,這些東西有什么特性,去做什么,這些思路清晰了,對象、對象的關系用OOP的技術以包裝,設計就自然而然出來了。
管語:
>另外,剛才說到了數據庫,想起一點事情:
>咱們做程序是面向對象的編程,而數據庫現在用的都是關系型的,所以對象和關系這是矛盾的,咱們不得不就要轉一下,轉對象為關系,那就天下大亂了,所以只好轉關系為對象,把數據庫看成是對象,把記錄、記錄集看成是對象,這個轉化過程中,就會有一些新東西被提出來,像Beacon用的是DAO,java中比較有名的是hibernate,J2EE規范中的實體EJB也是干這個的。這種數據庫的對象就叫持久化對象,說的有點亂,不知道意思清楚沒有。
>關系數據庫已經不是萬能的了,現在似乎有了面向對象的數據庫,不知道只是理論還是已經有了產品。如果這塊成熟,說不定實體EJB或hibernate就會消失了。
>現在GIS也很火的,GIS數據就不能直接以關系的方式存在關系數據庫中,也不是不能,是巨麻煩的,所以GIS用的是空間數據庫,現在沒有好的空間數據庫,就只好在關系數據庫上改,Oracle中有special數據庫特性,用來解決GIS數據庫問題,相信SQL Server2005也有類似解決方案。
王論:
呵呵,你涉獵太多了。
我的理解,你上所言,應該是ORM的范疇。其實Hibernate就是典型的ORM框架,在.NET中有對應的NHibernate框架。將數據庫和對象建立映射,然后以對象的方式來實現數據庫的操作,應該是這個樣子,所以業務層的發揮度就大大提高,以前用Sql做的,現在可以用C#來寫。程序發展越來越高級了,從匯編到Fortan,從過程到對象,每一步都是思想的提升。所以我們再追趕技術的時候,切不可沉迷于手段,思想的永恒才是關注的焦點。
王論:
////////////////////////////////////////
//Author: www.anytao.com //
//Date: 2007-4-5 //
//To Guanwei, a simple ORM example. //
//////////////////////////////////////// 
using System; 
namespace Anytao.Data
{
public class Student
{
//定義屬性和數據庫中表Student一一對應
private string _name;
public string Name
{
get {return _name;}
set {_name = value;}
}
private int _age;
public int Age
{
get {return _age;}
set {_age = value;}
}
void Student(IDataAccessProvider dap)
{
dap.GetStudent(this);
}
} 
interface IDataAccessProvider
{
//再次可以聲明要實現的所有業務邏輯
public void GetStudent(Student s);
public void SetStudent(Student s);
} 
public class SqlDataAccessProvider: IDataAccessProvider
{
public void GetStudent(Student s)
{
SqlConnection conn = new SqlConnection("DataSource = .; Catalog =
");
SqlCommand com = new SqlCommand("Select name, age from Student", conn);
com.Open();
SqlDataReader reader = com.ExecuteNonQuery();
while(reader.Read())
{
Console.WriteLine("The age of student {0} is {1} .", reader[0], reader[1]);
}
}
public void SaveStudent(Student s)
{
//
}
} 
public class OracleAccessProvider: IDataAccessProvider
{
public void GetStudent(Student s)
{
//
}
public void SaveStudent(Student s)
{
//
}
} 
}

注:以上示例借鑒蘇朋Webcast講座《設計數據存儲策略——SQL Server 2005應用開發》。
今日到此,明日再論。
Worktile,新一代簡單好用、體驗極致的團隊協同、項目管理工具,讓你和你的團隊隨時隨地一起工作。完全免費,現在就去了解一下吧。
https://worktile.com



浙公網安備 33010602011771號