[和管子对话] 1 2007-4-5/对面向对象的你言我语

[和管子对话] 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,从过程到对象,每一步都是思想的提升。所以我们再追赶技术的时候,切不可沉迷于手段,思想的永恒才是关注的焦点。

 

王论:

 

ExpandedBlockStart.gif
ContractedBlock.gif
/**/
////


None.gif
//
Author: www.anytao.com 
//

None.gif

//
Date: 2007-4-5 
//

None.gif

//
To Guanwei, a simple ORM example. 
//
ExpandedBlockStart.gifContractedBlock.gif

/**/
///


None.gif

None.gif

using
 System; 
None.gif
None.gif

namespace
 Anytao.Data
ExpandedBlockStart.gifContractedBlock.gif

dot.gif
{

InBlock.gif
public class Student
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
//定义属性和数据库中表Student一一对应
InBlock.gif
private string _name;
InBlock.gif
public string Name
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

ExpandedSubBlockStart.gifContractedSubBlock.gif
get dot.gif{
return _name;}

ExpandedSubBlockStart.gifContractedSubBlock.gif
set dot.gif{_name = value;}
ExpandedSubBlockEnd.gif}

InBlock.gif
private int _age;
InBlock.gif
public int Age
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

ExpandedSubBlockStart.gifContractedSubBlock.gif
get dot.gif{
return _age;}

ExpandedSubBlockStart.gifContractedSubBlock.gif
set dot.gif{_age = value;}
ExpandedSubBlockEnd.gif}

InBlock.gif
void Student(IDataAccessProvider dap)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif
InBlock.gifdap.GetStudent(
this);
ExpandedSubBlockEnd.gif}

ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
interface IDataAccessProvider
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
//再次可以声明要实现的所有业务逻辑
InBlock.gif
public void GetStudent(Student s);
InBlock.gif
public void SetStudent(Student s);
ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
public class SqlDataAccessProvider: IDataAccessProvider
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
public void GetStudent(Student s)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gifSqlConnection conn 
= new SqlConnection(DataSource = .; Catalog = dot.gif);
InBlock.gifSqlCommand com 
= new SqlCommand(Select name, age from Student, conn);
InBlock.gifcom.Open();
InBlock.gifSqlDataReader reader 
= com.ExecuteNonQuery();
InBlock.gif
while(reader.Read())
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gifConsole.WriteLine(
The age of student {0} is {1} ., reader[0], reader[1]);
ExpandedSubBlockEnd.gif}
 
ExpandedSubBlockEnd.gif}
 
InBlock.gif
public void SaveStudent(Student s)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
//dot.gif
ExpandedSubBlockEnd.gif
}

ExpandedSubBlockEnd.gif}
 
InBlock.gif
InBlock.gif
public class OracleAccessProvider: IDataAccessProvider
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
public void GetStudent(Student s)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
//dot.gif
ExpandedSubBlockEnd.gif
}

InBlock.gif
public void SaveStudent(Student s)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{

InBlock.gif
//dot.gif
ExpandedSubBlockEnd.gif
}

ExpandedSubBlockEnd.gif}
 
InBlock.gif
ExpandedBlockEnd.gif}


None.gif
None.gif

 

注:以上示例借鉴苏朋Webcast讲座《设计数据存储策略——SQL Server 2005应用开发》。

 

今日到此,明日再论。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111102.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 颜色校准调整伽马_色彩gamma什么意思

    颜色校准调整伽马_色彩gamma什么意思目录1、色彩矫正(CCM)2、伽马校正(Gamma)1、色彩矫正(CCM)色彩校正(ColorCorrection)是指用相同的方法改变图像中的所有像素的颜色值,以得到不同得显示效果。图像采集系统在获得数字图像时,由于一起或环境光照或人为因素的影响,采集的图像往往与原始图像有很大差别。颜色校正可以在一定程度上减少这种差别。利用RGB颜色模型可以方便地调整图像的RGB分量值,这对校正偏色很有用。色彩校正的基本原理如下:其中,Mij…

    2022年9月16日
    4
  • Linux7/Centos7磁盘分区、格式化及LVM管理

    Linux7/Centos7磁盘分区、格式化及LVM管理RHEL7如何对磁盘进行分区和格式化以及如何配置LVM,与以前版本的RHEL区别不大,可以通过disk工具(在图形桌面中运行)或命令工具(如:fdisk、gdisk、parted)管理硬盘设备。fdisk可以配置MBR格式;gdisk配置gpt格式,parted可以自己选择。传统的硬盘分区都是MBR格式,MBR分区位于0扇区,他一共512字节,前446字节是grub引导程序,这个会在后面学习;…

    2022年5月27日
    39
  • 谈谈自己对正则化的一些理解~

    谈谈自己对正则化的一些理解~上学的时候,就一直很好奇,模式识别理论中,常提到的正则化到底

    2022年7月14日
    14
  • OHEM算法及Caffe代码详解

    OHEM算法及Caffe代码详解这是CVPR2016的一篇论文,用于目标检测,本篇博文先介绍这个算法,然后介绍其Caffe代码。论文:TrainingRegion-basedObjectDetectorswithOnlineHardExampleMining论文链接:https://arxiv.org/abs/1604.03540算法概述:OHEM(onlinehardexampleminiing)算法的

    2022年5月22日
    37
  • python encode和decode函数说明[通俗易懂]

    python encode和decode函数说明[通俗易懂]字符串编码常用类型:utf-8,gb2312,cp936,gbk等。python中,我们使用decode()和encode()来进行解码和编码在python中,使用unicode类型作为编码的基础类型

    2022年7月1日
    39
  • 指令周期,时钟周期,总线周期概念辨析图_总线周期是指

    指令周期,时钟周期,总线周期概念辨析图_总线周期是指《指令周期、时钟周期、总线周期概念辨析》由会员分享,可在线阅读,更多相关《指令周期、时钟周期、总线周期概念辨析(2页珍藏版)》请在人人文库网上搜索。指令周期、时钟周期、总线周期概念辨析在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。通常用内存中读取一个指令字的最短时间来规定CPU周期,(也就是计算机通

    2022年10月10日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号