问题描述
原以为会了点面向对象,可前几天看了个帖子,感觉似乎离的太远了。举个例子吧。一个进销存,后台数据库,customer表纪录客户的所有信息。我一般在做的时候,在客户信息录入界面,就是将一个datatable绑定到每个控件的属性(大部分是textbox的text)。然后,执行对应的insert或者update操作。我原以为这就是面向对象了。可看了那个帖子,说道,这只是数据库的E-R关系。似乎应该按照customer的字段,设计一个customer类,类的属性代表对应的字段,并有相应的方法。最后,将类的属性与界面的控件绑定。这样才是面向对象。而原来的方法只是基于对象。那要在录入单据的时候,一般后台都是两个表的(主子表)。那么,又该怎么设计类呢?才算面向对象。不管用哪种方法实现,哪种方法针对这个应用更简单,既然用c#这面向对象的语言,至少应该懂得什么是真正的面向对象,什么是基于对象吧。现在请高手们解惑,讲讲这种情况下,如何算面向对象,如何算基于对象????
解决方案
解决方案二:
抛砖引玉哈~!个人感觉:第一种做法是直接对数据的操作client-->data第二种做法是把要操作的数据抽象出一个对象,是对对象的属性的操作client-->object-->data两者的差别就在于用户和实际的数据之间多了个对象,这个对象的存在是为了让实际的数据data能更符合人client的思维逻辑方式面向对象的话,如果业务逻辑都是以对象为基础的就能算是面向对象了吧
解决方案三:
usingSystem;namespaceMedicineMis.Common.Domain.Employees{publicclassEmployee:BaseObject{#region定义私有成员privateshort_embranchmentId;privateshort_employeeId;privatestring_embranchmentName;privatestring_code;privatestring_name;privatestring_spellCode;privatestring_sex;privatestring_address;privatestring_telephone;privatestring_mobilePhone;privatestring_departId;privatebool_isUser;privatestring_study;privatestring_duty;privatestring_comment;privateDateTime_graduateDate;privateDateTime_inDate;privatestring_jSZC;privatestring_zYZG;privatebool_cFQ;privatedecimal_cFF;privatestring_passWord;privatestring_text;privatebyte[]_image;privatestring_indentityNumber;privatestring_specialty;privatestring_excuQualificationNumber;privatestring_excuType;privatestring_excuRegisterNumber;privatestring_excuRegisterUnit;privateDateTime_excuIssueDate;privateDateTime_excuInvalidate;privatestring_practNumber;privatestring_practIssueUnit;privatestring_practWorkUnit;privatestring_practInvalidate;privatestring_othCertName;privatestring_othCertIssueUnit;privatestring_othCentNumber;privateDateTime_othCentIssueDate;privatestring_othCentWorkUnit;privatestring_resume;privatestring_others;#endregion#region默认参数为空的构造函数///<summary>///默认构造函数///</summary>publicEmployee(){_employeeId=0;_code=null;_name=null;_spellCode=null;_sex="男";_address=null;_telephone=null;_mobilePhone=null;_departId=null;_isUser=false;_study="小学";_duty=null;_comment=null;_graduateDate=newDateTime();_inDate=newDateTime();_jSZC=null;_zYZG=null;_cFQ=false;_cFF=0;_passWord=null;_text=null;_image=newbyte[]{};_fddbr=false;_qyfzr=false;_zlfzr=false;_indentityNumber=null;_specialty=null;_excuQualificationNumber=null;_excuType=null;_excuRegisterNumber=null;_excuRegisterUnit=null;_excuIssueDate=newDateTime();_excuInvalidate=newDateTime();_practNumber=null;_practIssueUnit=null;_practWorkUnit=null;_practInvalidate=null;_othCertName=null;_othCertIssueUnit=null;_othCentNumber=null;_othCentIssueDate=newDateTime();_othCentWorkUnit=null;_resume=null;_others=null;}#endregion#region定义公共方法publicshortEmbranchmentId{get{return_embranchmentId;}set{_isChanged|=(_embranchmentId!=value);_embranchmentId=value;}}publicshortEmployeeId{get{return_employeeId;}set{_isChanged|=(_employeeId!=value);_employeeId=value;}}publicstringCode{get{return_code;}set{if(value!=null&&value.Length>10)thrownewArgumentOutOfRangeException("InvalidvalueforCode",value,value.ToString());_isChanged|=(_code!=value);_code=value;}}publicstringName{get{return_name;}set{if(value!=null&&value.Length>10)thrownewArgumentOutOfRangeException("InvalidvalueforName",value,value.ToString());_isChanged|=(_name!=value);_name=value;}}publicstringEmbranchmentName{get{return_embranchmentName;}set{if(value!=null&&value.Length>20)thrownewArgumentOutOfRangeException("InvalidvalueforEmbranchmentName",value,value.ToString());_isChanged|=(_embranchmentName!=value);_embranchmentName=value;}}publicoverrideintGetHashCode(){inthash=57;hash=27*hash*_employeeId.GetHashCode();returnhash;}#endregion}}
解决方案四:
基于对象?执着的符合面向对象就是错误的,保证程序相对健壮就可以了。
解决方案五:
没看懂那段程序是什么意思
解决方案六:
我并不是执著,如果在实现我的目标的前提下,哪种更简单我就选哪种但问题是,我必须得搞懂面向对象和基于对象的区别。比如,一个跟数据表类似的datatable,我也把它看作一个对象,可以通过adapter将更改保存到数据库。那么,为它建一个类,把相关的字段表示为类的属性,然后,还得将所有属性值,通过一种方式存入到数据库中。两种做法,区别在哪,后一种感觉繁琐,有没有什么优点。两种都属于面向对象还是一种是一种不是,等等。
解决方案七:
upself
解决方案八:
面向对象是一种思维方式,是一种解决问题的方法...将问题抽象为对象来解决它的过程就是面向对象...基于对象仅仅是使用对象,无法利用现有的对象模板产生新的对象类型继而产生新的对象...利用面向对象方法的成果以面向过程方法来解决问题就是基于对象...比如只是使用.NETFramwork类库却没有在架构上有面向对象的设计,就只是在形式上面向对象,而实质上只是库函数的一种扩展...很有一些人常常打着面向对象的幌子,干着过程编程的勾当...
解决方案九:
同意面向对象是一种思维方式,基于对象只是对对象的引用。面向对象编程时一般着重对象摸拟现实状态,很复杂,它的特点是可持久性及可扩展性;基于对象基本上就是可视化编,知道引用已做好的控制就行了。
解决方案十:
执着的符合面向对象就是错误的,保证程序相对健壮就可以了。同意
解决方案十一:
面向对象是一种思维方式,和面向过程不同。比如楼主想到要读数据,则马上新建个ADO对象,想到要显示数据,则绑定到界面控件,这就是一种面向过程的思维。就是说顺着工作的流程而下,如果遇到分支,则用if,else等。面向对象的思维需要结合现实世界来考虑。我个人认为公司人事管理非常能说明这一点。每一位员工代表一个类,每一个部门可以看成一个抽象类,他们有共同的工作任务,但每个人又不相同。部门又分很多种,有办实事的,有协调的,有中转的,有控制的。你可以拿你的程序和这个对比一下,比如数据合法性验证方面,是否专门有一组类,就如质检部门一样?这组类是否有合适的接口,让界面类组能方便的将数据传递到质检类?检验完成后是否有一组类似于仓管部门的类?专门负责把生产好的数据存到仓库(数据库)去?这组仓管类专门负责进货,出货(读取,保存数据)?呵呵,不知道你是否看的懂?至于你提的那个为每个数据表见一个类的问题,术语叫O-RMapping,在java里面有大量的开源框架支持,你可以看看这方面的东西
解决方案十二:
想不到OO的讨论蔓延到CSDN了==================================挑一挑楼上的错误每一位员工代表一个类,每一个部门可以看成一个抽象类=================================================每个数据表见一个类的问题,术语叫O-RMapping这个不敢苟同
解决方案十三:
支持7楼.......面向过程...感觉是在建立单一的线....多条线...以后就会成乱麻了...面向对象...更感觉向层..或者面...每一层都有自己要解决的问题.代码分层慢慢细化...
解决方案十四:
想不到OO的讨论蔓延到CSDN了==================================挑一挑楼上的错误每一位员工代表一个类,每一个部门可以看成一个抽象类=================================================每个数据表见一个类的问题,术语叫O-RMapping这个不敢苟同不知11楼有何精辟的见解?
解决方案十五:
泡方便面的时候你打开盖子,向里面加入调料,葱,辣椒粉,灌上水,等5分钟.你就是面向过程的而你打开盖子,将调料包里的调料放入,将葱包里的葱放入,将辣味粉包里的辣椒粉放入,将温瓶里面的水灌入,等手表里分针偏离5个刻度.你就是面向对象的如果你直接叫老板帮你泡好,你就是基于对象的
其他方案:
面向对象,已经讨论这么多年了,还是没有什么完全让人信服的定义,还是自己慢慢体会,感觉lz只是在问这两种架构的区别而已。其实这两种结构对功能什么没有啥影响啊,只是后一种结构清晰,分工明确而以,相当于流水线作业,每个人只管自己那一块,剩下的别人做。还是别去讨论这个了,越讨论越晕。仁者见仁,智者见智,自己体悟比较好。纯粹是一种想法。就和那本最短的小说一样。内容都是不一样的。
其他方案:
如果你直接叫老板帮你泡好-----------------那你不是老板娘就是小蜜...
其他方案:
它建一个类,把相关的字段表示为类的属性,然后,还得将所有属性值,通过一种方式存入到数据库中。