大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)

一,总体概要

1,笔者浅谈

我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类、对象、实例等概念,非常贴合人类对于世间万物的认知方式和思考方式。对于复杂的事物,人类是如何去认识、归纳、总结的?面向对象式编程就是在努力回答这个问题,而答案的核心就是两个字:抽象。所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中。因为我们开发软件就是为了解决问题,面向对象式编程符合人类对于“问题”的认知方式),因为我早以习惯用C来编写程序(),很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。我对Java的面向对象的特性研究很久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。 这里以一个登录,注册的完整例子贯穿全文来说明面向对象与面向过程的方式来循序渐进的进行分析和不断重构来达到我们预期的效果。

2,简单小结

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 

面向对象是将实物高度抽象化。

面向过程是一种自顶向下的编程。

二,案例引入

(1)需求分析

a,只有注册了的用户才可以登录系统。登录系统很简单,只需要提供登录的用户名和密码即可登录系统。

b,未注册的用户可以注册一个用户名,并提供密码和简单的个人信息,比如E-mail地址,即可注册成功。需要注意的是,用户名不能够重复。注册成功的用户即可按照刚才注册的用户名和密码登录系统。

c,注册功能的输入数据项包括用户名、密码、E-mail。

(2)实例讲解,循序渐进

这里以登录的例子作为参考,最初我会这样实现:

 1 function login(userName,userPass){
 2     if(!userName || !userPass){
 3         throw new Error("用户名或者密码不能为空!") ;
 4     }
 5     $.ajax({
 6         url : "/login.json" ,
 7         type : "post" ,
 8         data:{
 9             userName : userName ,
10             userPass : userPass
11         } ,
12         dataType: "json"
13     }).done(function(data){
14         console.log("登录成功!") ;
15     }) ;
16 } ;

不难看出这是一种面向过程的实现方式,但是里面依然存在设计阶段错误的思维,login它的职能就是登录的作用,可是里面掺加了用户信息的验证工作,显然要分离职责,继续看代码

 1 function login(userName,userPass){
 2     if(validate(userName,userPass)){
 3         $.ajax({
 4             url : "/login.json" ,
 5             type : "post" ,
 6             data:{
 7                 userName : userName ,
 8                 userPass : userPass
 9             } ,
10             dataType: "json"
11         }).done(function(data){
12             console.log("登录成功!") ;
13         }) ;
14     }
15     else{
16         throw new Error("用户名或者密码不能为空!") ;
17     }
18 } ;
19 function validate(userName,userPass){
20     return (!userName || !userPass) ? false : true ;
21 } ;

这样看上去好多了,最起码设计上是没问题的,但如果再进一步抽象就更好了,看最终的代码

 1 function login(userName,userPass){
 2     if(validate(userName,userPass)){
 3         loginService({
 4             userName : userName ,
 5             userPass : userPass
 6         },function(data){
 7             console.log("登录成功!") ;
 8         }) ;
 9     }
10     else{
11         throw new Error("用户名或者密码不能为空!") ;
12     }
13 } ;
14 function loginService(params,callback){
15     $.ajax({
16         url : "/login.json" ,
17         type : "post" ,
18         data:{
19             userName : params.userName ,
20             userPass : params.userPass
21         } ,
22         dataType: "json"
23     }).done(function(data){
24         callback(data) ;
25     }) ;
26 } ;
27 function validate(userName,userPass){
28     return (!userName || !userPass) ? false : true ;
29 } ;

逐步的重构发现比最初的好多了,但依旧是过程化的思维,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。 这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。 我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。 


好的咱们现在用OO的方式去实现那个登录的例子

1,建立User实体模型类

1 function User(userName,userPass,rePass,userMail){
2     this.userName = userName ;
3     this.userPass = userPass ;
4     this.rePass = rePass ;
5     this.userMail = userMail ;
6 } ;
7 User.prototype = {
8     // set get
9 } ;

2,建立User实体模型中的操作api

 1 function User(userName,userPass,rePass,userMail){
 2     this.userName = userName ;
 3     this.userPass = userPass ;
 4     this.rePass = rePass ;
 5     this.userMail = userMail ;
 6 } ;
 7 User.prototype = {
 8     // set get
 9 } ;
10 User.getUserByNameAndPwd = function(params){
11     return $.ajax({
12         url : "/login.json" ,
13         type : "post" ,
14         data:{
15             userName : params.userName ,
16             userPass : params.userPass
17         } ,
18         dataType: "json"
19     }) ;
20 } ;

3,建立UserManager类

 1 function UserManager(user){
 2     this.user = user ;
 3 } ;
 4 UserManager.prototype = {
 5     login : function(){
 6         if(this.validate()){
 7             loginService({
 8                 userName : this.user.userName ,
 9                 userPass : this.user.userPass
10             },function(data){
11                 console.log("登录成功!") ;
12             }) ;
13         }
14         else{
15             throw new Error("用户名或者密码不能为空!") ;
16         }
17     } ,
18     validate : function(){
19         return (!this.user.userName || !this.user.userPass) ? false : true ;
20     }
21 } ;

4,建立客户端测试方法

1 function LoginClient(){
2     var userMgr = new UserManager(new User("bb","123456")) ;
3     userMgr.login() ;
4 } ;    

5,基本这就是OO的完整重构版本了,以下作个小结

通过上面的例子的设计说明,使用面向对象的思维方法,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。 

因而一旦牢牢的抓住了这一点,你就会发现在软件设计和开发过程中,你自己总是会不知不觉的运用面向对象的思维方法来设计和编写程序,并且程序的设计和开发也变得不再那么枯燥,而一个合理运用面向对象技术进行设计和架构的软件,更是具备了思维的艺术美感。 

最后,愿面向对象的思维方法也能给您的程序设计之路带来创作的乐趣。

三,最后的总结一下

1.类的职责不能多,职责多需要分解

2.抽象实体模型

3.理解oo的特质封装,继承,多态

哈哈哈,本篇结束,未完待续,希望和大家多多交流够沟通,共同进步(*^__^*) 嘻嘻……

时间: 2024-10-31 16:19:19

大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)的相关文章

第十篇 面向对象的程序设计

第十篇 面向对象的程序设计 阅读目录 一 面向对象的程序设计的由来 二 什么是面向对象的程序设计及为什么要有它 三 类和对象 3.1 什么是对象,什么是类 3.2 类相关知识 3.3 对象相关知识 3.4 对象之间的交互 3.5 类名称空间与对象/实例名称空间 3.6 小结 四 继承与派生 4.1 什么是继承 4.2 继承与抽象(先抽象再继承) 4.3 继承与重用性 4.4 组合与重用性 4.5 接口与归一化设计 4.6 抽象类 4.7 继承实现的原理(继承顺序) 4.8 子类中调用父类方法 五

JavaScript 面向对象(三) —— 高级篇

JavaScript 面向对象(一) —— 基础篇 JavaScript 面向对象(二) —— 案例篇 一.json方式的面向对象 首先要知道,js中出现的东西都能够放到json中.关于json数据格式这里推荐一篇博客:JSON 数据格式 先看下json创建的简单对象:相比基础篇中的构造函数.原型等的创建方式,json方式简单方便:但是缺点很明显,如果想创建多个对象,那么会产生大量重复代码,不可取. JSON方式适用于只创建一个对象的情况,代码简介又优雅. 1 <!DOCTYPE html>

python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇

python内置模块补充 一.configparser configparser:用户处理特定格式的文件,其本质是利用open打开文件 # 节点 [section1] #键值对k1 = v1 k2:v2 k1 = v1 #建:k1 k2 k2:v2 [section2] k1 = v1 k3:v3 [section3] k3 = v3 k4:v4 [section4] k4 = v4 k5:v5 在configparser默认将获取的元素当做一个字符串进行处理,不用特定执行元素的类型 1.获取所

python 面向对象(进阶篇)

上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象

python_way ,day7 面向对象 (初级篇)

面向对象 初级篇 python支持 函数 与 面向对象 什么时候实用面向对象? 面向对象与函数对比 类和对象 创建类 class 类名 def 方法名(self,xxxx) 类里面的方法,只能对象去调用 对象 = 类名() 通过对象执行方法 对象.方法名(xxxx) 设计,增删改查功能 函数式: def fetch(self,host,port name passwd,sql) pass def create(self,host,port name passwd,sql) pass def re

Python 面向对象(初级篇)

在Python教学中发现,很多同学在走到面向对象编程这块就开始蒙圈了,为了帮助大家更好的理解面向对象编程并其能将其用到自己的开发过程中,特写此文. 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." 面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处. while True:

黑马程序员系列第六篇 面向对象基础

ASP.Net+Android+IOS开发  .Net培训.期待与您交流! (前言:本篇文章主要依据毕向东老师的课程视频整理而成,如要详细学习,请观看毕老师视频  百度网盘链接地址:http://pan.baidu.com/s/1mgngVl2) 目录:1.面向对象三大特性    2.类和对象    3.内部类   1.面向对象三大特性    封装.继承.多态 封装 概念:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:将变化隔离:便于使用:提高重用性:安全性. 封装原则:将不需要

js 实现对ajax请求面向对象的封装

AJAX 是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 在js中使用ajax请求一般包含三个步骤: 1.创建XMLHttp对象 2.发送请求:包括打开链接.发送请求 3.处理响应 在不使用任何的js框架的情况下,要想使用ajax,可能需要向下面一样进行代码的编写 var xmlHttp = xmlHttpCreate();//创建对象 xmlHttp.onreadysta

java 第十一天 面向对象(高级篇之接口、对象的多态性,instanceof)

接口的基本概念:接口的访问权限是public,关键字interface,子类通过implements关键字实现接口.一个子类可以同时实现多个接口. 对象的多态性: 两种体现形式:(1)方法的重载与覆写.(2)对象的多态性. 对象的多态性分两种: (1)向上转型:子类对象--→父类对象 (2)向下转型:父类对象--→子类对象 java中可以使用instanceof关键字判断对象到底是哪个类的实例 java 第十一天 面向对象(高级篇之接口.对象的多态性,instanceof),码迷,mamicod