面向过程和面向对象

在之前学习的C语言为面向过程的语言,C++、Java等为面向对象的语言。

面向对象和面向过程都是对软件分析、设计和开发的一种思想,它指导着人们以不同的方式去分析、设计和开发软件。

面向过程思想思考问题时,我们首先考虑“怎么按步骤实现?”并将步骤对应成方法,一步一步,最终完成。

这个适合简单任务,不需要过多协作的情况下。

面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。

面向对象面向过程有什么区别

10-19

面向对象与面向过程有什么区别:rn在mysqli的扩展库里,既支持面向对象又支持面向过程,但是老师告诉我,最好使用面向对象的方式编程,对于新手的我来说,很是不理解。rn在PHP文档里面,关于mysqli的介绍中,文档既写出了使用面向对象编程的实例,也写出了面向过程编程的实例,我比较了一下,发现两者没有多大区别。rn举例说明一下,我们用语句从数据库里提取一段记录,rn这是文档中mysqli::query中面向对象风格的实例rn[code=PHP]connect_errno) rn printf("Connect failed: %s\n", $mysqli->connect_error);rn exit();rnrnrn/* Create table doesn't return a resultset */rnif ($mysqli->query("CREATE TEMPORARY TABLE myCity LIKE City") === TRUE) rn printf("Table myCity successfully created.\n");rnrnrn/* Select queries return a resultset */rnif ($result = $mysqli->query("SELECT Name FROM City LIMIT 10")) rn printf("Select returned %d rows.\n", $result->num_rows);rnrn /* free result set */rn $result->close();rnrnrn/* If we have to retrieve large amount of data we use MYSQLI_USE_RESULT */rnif ($result = $mysqli->query("SELECT * FROM City", MYSQLI_USE_RESULT)) rnrn /* Note, that we can't execute any functions which interact with thern server until result set was closed. All calls will return anrn 'out of sync' error */rn if (!$mysqli->query("SET @a:='this will not work'")) rn printf("Error: %s\n", $mysqli->error);rn rn $result->close();rnrnrn$mysqli->close();rn?> rn[/code]rn这是文档中mysqli::query中面向过程风格的实例rn[code=PHP] rn[/code]rn我通过观察发现,不论是面向对象还是面向过程,数据库的查询只有三部rn一、连接数据库,不同的是,面向对象中使用实例化mysqli类来连接,面向过程中使用mysqli_connect()函数连接rn二、数据库查询,面向对象使用$mysqli::query(语句)查询,面向过程使用mysqli_query(语句)查询rn三、关闭资源,面向对象使用$mysqli->close()关闭,面向过程使用mysqli_close()关闭rnrnrn老师也说过mysqli的使用与原来很相似,但是对于新手的我来说,过程一样,只是用类实例化对象调用方法来代替原来的函数,不论怎么想都没有什么实际的优势,在网上搜索了很多,好多人会说面向对象更高效更利于维护之类的高深术语,对于新手的我来说,根本没区别。rn其实就是想知道在具体开发,或者说编程中,面向对象编程与面向过程编程有多大区别?rn

困惑中,面向对象还是面向过程

11-19

刚学JAVA不久,模拟了学校的校园卡系统,但是现在越来越发现自己的在面向对象这个思想上,自己也搞不清楚,到底自己是怎么想的,我把我写的那个代码附上,请大家指点下我的思路rnimport java.awt.*;rnimport java.awt.event.*;rnimport java.io.*;rnimport java.awt.Graphics;rnrnrnpublic class j03127e3Xiaoyuanka//Application主函数rnrn public static void main(String args[])rn rn new Denglu();rn rnrnrnclass Student//定义一个学生类rnrn static String id=new String("1103101127");rn static String name=new String("伍鑫");rn static String address=new String("湖北省武穴市枚川镇");rn static String grade=new String("计031班");rn static protected String password="1103101127";rn static double money=200.0;rnrnrnrn class Denglu extends Frame implements ActionListener//登录界面rnrnrn Main Mainwindow;//声明rnrn Label n1,n2,n3;rn TextField txt1,txt2;rn Button btn1,btn2;rn Denglu()rn rn super("校园卡管理系统");rn Mainwindow=new Main();rn setLayout(null);rn n1=new Label("请输入学号:");rn n1.setBounds(20,40,80,25);rn add(n1);rn txt1=new TextField(10);rn txt1.setBounds(100,40,80,20);rn add(txt1);rn n2=new Label("请输入密码:");rn n2.setBounds(20,70,80,25);rn add(n2);rn txt2=new TextField(10);rn txt2.setBounds(100,70,80,20);rn txt2.setEchoChar('*');rn add(txt2);rnrn btn1=new Button("确定");rn btn1.setBounds(40,100,50,20);rn btn2=new Button("退出");rn btn2.setBounds(110,100,50,20);rn add(btn1);rn add(btn2);rn btn1.addActionListener(this);rn btn2.addActionListener(this);rn n3=new Label(" ");rn n3.setBounds(20,120,150,25);rn add(n3);rn setSize(215,180);rn setLocation(400,200);rn show();rn rn public void actionPerformed(ActionEvent e)//按纽事件rn rn if(e.getSource()==btn2)//根据不同的按纽做不同的操作rn rn setVisible(false);rn rn elsern rn if((txt1.getText().equals(Student.id))&&(txt2.getText().equals(Student.password)))//判断学号和密码是否一致rn rn Mainwindow.show();rn txt1.setText("");txt2.setText("");rn rn elsern n3.setText("请输入正确的学号和密码!");rn rn rn rnrnrnrnrn class Main extends Frame implements ActionListenerrnrn Information Mywindow1;//声明rn Changepassword Mywindow2;rn Payment Mywindow3;rn Sign_up Mywindow4;rn Chongqian Mywindow5;rn Button btn1,btn2,btn3,btn4,btn5,btn6;rnrnrn Main()rn rn super("操作窗口");rn Mywindow1=new Information();rn Mywindow2=new Changepassword();rn Mywindow3=new Payment();rn Mywindow4=new Sign_up();rn Mywindow5=new Chongqian();rnrn setLayout(new GridLayout(6,1,5,8));rn btn1=new Button("基本信息");rn add(btn1);rn btn2=new Button("密码修改");rn add(btn2);rn btn3=new Button("消费");rn add(btn3);rn btn6=new Button("自助充值");rn add(btn6);rn btn4=new Button("考试报名");rn add(btn4);rn btn5=new Button("退出");rn add(btn5);rn btn1.addActionListener(this);rn btn2.addActionListener(this);rn btn3.addActionListener(this);rn btn4.addActionListener(this);rn btn5.addActionListener(this);rn btn6.addActionListener(this);rnrn setSize(300,300);rn setLocation(400,200);rn rnrn public void actionPerformed(ActionEvent e)rn rn if(e.getSource()==btn1)//根据不同的按纽做不相应的操作rn rn Mywindow1.show();rn rn if(e.getSource()==btn2)rn rn Mywindow2.show();rn rn if(e.getSource()==btn3)rn rn Mywindow3.show();rn rn if(e.getSource()==btn4)rn rn Mywindow4.show();rn rn if(e.getSource()==btn5)rn rn dispose();rn rn if(e.getSource()==btn6)rn rn Mywindow5.show();rn rn rnrnclass Information extends Frame implements ActionListenerrnrnrnrn Label n1,n2;rn TextField txt1,txt2;//,txt3;rn TextArea p1;rnrn Button btn1,btn2;rnrnrn Information()rn rnrn super("基本信息");rn setLayout(new FlowLayout(FlowLayout.LEFT));rnrn n1=new Label("请输入学号: ");rn add(n1);rn txt1=new TextField(10);rn add(txt1);rn n2=new Label("请输入密码: ");rn add(n2);rn txt2=new TextField(10);rn txt2.setEchoChar('*');rn add(txt2);rnrn btn1=new Button("确定");rn btn2=new Button("退出");rn add(btn1);rn add(btn2);rn btn1.addActionListener(this);rn btn2.addActionListener(this);rn p1=new TextArea(10,30);rn add(p1);rn //p1.setText("学号:"+j03127e3Xiaoyuanka.id+"\n"+"姓名:"+j03127e3Xiaoyuanka.name+"\n"+"地址:"+j03127e3Xiaoyuanka.address+"\n"+"班级:"+j03127e3Xiaoyuanka.grade+"\n"+"卡内金额:"+j03127e3Xiaoyuanka.money);//这个是打算在这个界面不需要密码,当出现这个界面的时候就显示信息rn setSize(300,300);rn setBackground(Color.lightGray);rn setVisible(false);rn setLocation(400,200);rn rnrn public void actionPerformed(ActionEvent e)rn rn if(e.getSource()==btn2)rn rn dispose();rn txt1.setText("");txt2.setText("");p1.setText("");rn rn elsernrn if((txt1.getText().equals(Student.id))&&(txt2.getText().equals(Student.password)))//falsern p1.setText("学号:"+Student.id+"\n"+"姓名:"+Student.name+"\n"+"地址:"+Student.address+"\n"+"班级:"+Student.grade+"\n"+"卡内金额:"+Student.money);rn p1.setEditable(false);txt1.setText("");txt2.setText("");rn elsern p1.setText("你输入的信息有错误!");txt1.setText("");txt2.setText("");rn rnrnrnrnrnrn(接下面) rn

[转载]面向过程面向对象→ 面向组件!

01-13

在软件界流传着这样一种看法,随着技术的进步,每十年便会出现一种主流的计算平台,编程语言和程序设计思想。80年代是Unix/C和面向过程,90年代是Windows/C++和面向对象,当今则是.NET/C#和面向组件。.NET旗帜鲜明地提出下一代软件的构建思想--面向组件,和构建平台--XML Web Services,C#为此量身定做,生逢其时。只有洞悉了其仰仗的平台和程序设计思想,我们才能清晰地把握由C/C++到C#这一锐利之路的精神命脉。在这样的平台和思想的基石上,C#主要从以下四个方面对C++进行了显著的革新和提高: rnrn  明晰,简练的语法风格 rn  托管,安全的执行环境 rn  高效,内置的XML Web Services支持 rn  直接,丰富的组件编程支持 rnrn  在这中间,组件支持是C#语言的灵魂,也是本文在阐述从C/C++向C#转型过程中着墨最多的地方。值得指出的是本文中的C/C++指传统C/C++,不包括微软对C++进行托管包装后的Managed C++,因为它更多的是为原先的C++的代码向.NET平台提供转换支持,在这里不具比较意义。下面本文将从上述四个方面来阐述。 rnrn  C#在和C++语法风格保持了高度一致的同时,摈除了很多晦涩不清,繁荣拖沓的表达。赋值等号和判断等号严格区分彻底消除了C++中赋值与判断同时表达的危险。单根继承加上多接口实现的支持,使C#杜绝了C++晦涩不清的多继承。数值类型和对象之间转换的box/unbox操作,兼顾了数值运算的性能和面向对象的统一。声明与实现同归一处使得C#中再也没有C++头文件的烦恼。在方法及其参数传递方面,C#摈弃了指针与地址操作及const 修饰,代之以引用(ref),输出(out),数组(params)这样一些表义明确的修饰符。foreach语句使得集合中的元素的遍历更加方便和优雅。C#也对操作符重载进行了更为严格规定和有限的支持。“不安全的转型操作,数组索引越界,未初始化变量”等在C++中经常出现的错误在这里将不再可能。 rnrn  .NET平台为C#引入的安全,高效的托管执行环境--通用语言运行时(CLR)引人注目。内存泄漏一直以来都是C/C++程序界的一个顽疾。把这样容易出错而又繁重的任务交给系统处理,将程序员从中解脱出来专注于事务逻辑的实现,已经成为软件业的共识。自动垃圾收集改变了C++中内存管理的方式,在C#中程序员甚至不需要有内存管理这样的概念--实际上我们根本找不到类似delete这样的内存释放指令。强健的异常处理极大地提高了C#开发软件的纠错能力,绝非传统C++中错误代码返回值所能企及。类型安全在C#语言中被提到了一个相当的高度,对任何数据的任何操作都被CLR所监视,并严格限定在该数据类型所支持的范围内,转型操作也被严格定义。和传统COM组件及DLL的互操作性使得C#和传统C++实现了交互访问能力,这种改良而非革命的策略对C++程序员非常重要。基于IL中间语言(C#的目标编译语言)的JIT编译技术在实现其跨平台编程的许诺的同时,更是使得C#可以同多达20多种主流开发语言实现对象级的互操作,这令人异常震惊和兴奋。 rnrn  Web 服务为当今产业界公认的下一代网络计算的方向,它一个基于因特网的应用程序模块,在遵守由一个协议集组成的特殊的技术规格下进行对象组件之间的远程交互。.NET平台直接在IL中间语言中内置对XML Web Services的操作支持更是传统C++所非企及,这使得C#与生俱来地获得下一代网络编程语言的美名。在C#下的XML Web Services编程,开发人员面对的将是一个友好的由商业组件组成的对象结构,而不是HTTP,SOAP,UDDI,WSDL等底层协议。 rnrn  历史是一面镜子,回顾一下软件开发走过的路子对我们理解C#及其倡导的组件编程思想将很有启发。在早期Unix和C主导的时代,“数据结构+算法”成为我们构建软件的唯一方式,按字母排序的API函数集成为我们编程的圣经。然而我们不能忍受这种扁平的API组织结构给我们带来的现实逻辑和机器实现之间的巨大鸿沟,近乎相同的软件被我们低效地一遍一遍重写。千呼万唤始出来,一时间C++和面向对象技术于是成为我们的口头语,绚丽多彩的Windows成为我们的栖息地,MFC类库及由其主导开发的各种桌面软件成为C++历史上的极盛时期。然而,随着软件规模越来越大,面向Web应用的需求越来越高,源代码级的对象复用显然已经不能满足我们的需要。修修补补的COM组件技术登上历史舞台,然而由于C++语言底层机制带来的结构性矛盾,各种问题接踵而来:IDL拖沓繁冗,“DLL-Hell”噩梦连绵,二进制流在防火墙的阻隔下举步维艰......我们迫切需要一个面向Internet异构体系,为软件提供像IC电路元件一样的可插拔的标准封装和复用方式的组件构造平台,.NET和C#应运而生。组件编程是C#将C++及其面向对象技术从软件设计开发阶段向软件发布,运行,管理的合理延伸。C#在面向对象的基础上直接引入接口,属性,方法,事件,特征,文档化等组件特性,为其RAD开发提供第一等的支持。内置语言的元数据映射机制彻底解除了IDL,GUID以及COM接口等繁冗的编程任务,使得组件得以廉价地实现自描述,并且革新了传统C++的代码编写方式。“side by side”的执行方式解决了长期以来困扰程序员的“DLL-Hell”,多个版本的组件可以相安无事地同时运行于一个系统内。简化了的XCopy安装方式使得繁琐的注册表不再成为安装程序的必须,“拷贝,然后运行”--程序本来就应该是这个样子! rnrn  “用C++同样可以进行组件开发!”没错,但就像我们可以用C来实现面向对象的技术一样,我们完全可以用“近乎高超”的技巧来为C++进行组件开发提供各种论据。但且不说这种间接的,晦涩的开发策略会在多大程度上损伤我们的对于组件编程思想的表达,光是它带来的各种琐碎和不安全的纰漏就曾令多少程序员噩梦不断!组件编程不仅是编程元素的改变,更是程序设计思想的革新! 一个典型的C#程序设计能使我们更真切地体会从C++对象编程到C#组件编程的转型过程。我们首先思考的是我们能否把我们的问题组件化?我们是否在编写一个可复用组件?我们要为我们的组件添加诸如接口,属性,方法,事件,特征,文档吗?我们是否可以为我们组件提供RAD重用开发支持?一切OK!我们无需再关心诸如内存泄漏,多版本安装,IDL,GUID等等繁琐的细节--而这正是现时我们在C++下设计完类后花费很多时间和精力的地方。编程的本质是创造服务,而非驯服机器,C#还编程以它本来的面貌。 rnrn  当然我们决非要C#替代C/C++,我们所竭力伸张的是在现时主流的开发需求和潮流下的选择导向。C#也绝非完美,比如在C++中很好用的模板在C#中就没有实现(微软正在研发当中)。对机器的表达也绝非C++的犀利所媲--当然这是问题的另一个方面。C++在对机器底层操作要求较高的编程环境如:实时应用,系统内核,硬件驱动等方面仍然保持其统治地位。只有理解了整个软件业的当下需求和未来方向,真正把握了C#语言根深蒂固的组件编程设计思想,我们才能根据我们的实际需要而非喧闹争论得出适合自己的结论,完成从C/C++到C#的锐利之路! rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试