大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)
一,总体概要
1,笔者浅谈
我是从学习Java编程开始接触OOP(面向对象编程),刚开始使用Java编写程序的时候感觉很别扭(面向对象式编程因为引入了类、对象、实例等概念,非常贴合人类对于世间万物的认知方式和思考方式。对于复杂的事物,人类是如何去认识、归纳、总结的?面向对象式编程就是在努力回答这个问题,而答案的核心就是两个字:抽象。所以面向对象式编程特别适合处理业务逻辑,因此被广泛应用于目前的软件开发当中。因为我们开发软件就是为了解决问题,面向对象式编程符合人类对于“问题”的认知方式),因为我早以习惯用C来编写程序(),很欣赏C的简洁性和高效性,喜欢C简练而表达能力丰富的风格,特别忍受不了Java运行起来慢吞吞的速度,相对冗长的代码,而且一个很简单的事情,要写好多类,一个类调用一个类,心里的抵触情绪很强。我对Java的面向对象的特性研究很久,自认为有所领悟,也开始有意识的运用OOP风格来写程序,然而还是经常会觉得不知道应该怎样提炼类,面对一个具体的问题的时候,会觉得脑子里千头万绪的,不知道怎么下手,一不小心,又会回到原来的思路上去。 这里以一个登录,注册的完整例子贯穿全文来说明面向对象与面向过程的方式来循序渐进的进行分析和不断重构来达到我们预期的效果。
2,简单小结
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
面向对象是将实物高度抽象化。
面向过程是一种自顶向下的编程。
二,案例引入
(1)需求分析
a,只有注册了的用户才可以登录系统。登录系统很简单,只需要提供登录的用户名和密码即可登录系统。
b,未注册的用户可以注册一个用户名,并提供密码和简单的个人信息,比如E-mail地址,即可注册成功。需要注意的是,用户名不能够重复。注册成功的用户即可按照刚才注册的用户名和密码登录系统。
c,注册功能的输入数据项包括用户名、密码、E-mail。
(2)实例讲解,循序渐进
这里以登录的例子作为参考,最初我会这样实现:
function login(userName,userPass){
if(!userName || !userPass){
throw new Error("用户名或者密码不能为空!") ;
}
$.ajax({
url : "/login.json" ,
type : "post" ,
data:{
userName : userName ,
userPass : userPass
} ,
dataType: "json"
}).done(function(data){
console.log("登录成功!") ;
}) ;
} ;
不难看出这是一种面向过程的实现方式,但是里面依然存在设计阶段错误的思维,login它的职能就是登录的作用,可是里面掺加了用户信息的验证工作,显然要分离职责,继续看代码
function login(userName,userPass){
if(validate(userName,userPass)){
$.ajax({
url : "/login.json" ,
type : "post" ,
data:{
userName : userName ,
userPass : userPass
} ,
dataType: "json"
}).done(function(data){
console.log("登录成功!") ;
}) ;
}
else{
throw new Error("用户名或者密码不能为空!") ;
}
} ;
function validate(userName,userPass){
return (!userName || !userPass) ? false : true ;
} ;
这样看上去好多了,最起码设计上是没问题的,但如果再进一步抽象就更好了,看最终的代码
function login(userName,userPass){
if(validate(userName,userPass)){
loginService({
userName : userName ,
userPass : userPass
},function(data){
console.log("登录成功!") ;
}) ;
}
else{
throw new Error("用户名或者密码不能为空!") ;
}
} ;
function loginService(params,callback){
$.ajax({
url : "/login.json" ,
type : "post" ,
data:{
userName : params.userName ,
userPass : params.userPass
} ,
dataType: "json"
}).done(function(data){
callback(data) ;
}) ;
} ;
function validate(userName,userPass){
return (!userName || !userPass) ? false : true ;
} ;
逐步的重构发现比最初的好多了,但依旧是过程化的思维,从机器的角度到现实世界的角度来分析问题的。因此在设计的时候,就已经把程序编程实现的细节都考虑进去了,企图从底层实现程序这样的出发点来达到满足现实世界的软件需求的目标。 这样的分析方法其实是不适用于Java这样面向对象的编程语言,因为,如果改用C语言,封装两个C函数,都会比Java实现起来轻松的多,逻辑上也清楚的多。 我觉得面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的,只要领会了这一点,就领会了面向对象的思维方法。
好的咱们现在用OO的方式去实现那个登录的例子
1,建立User实体模型类
function User(userName,userPass,rePass,userMail){
this.userName = userName ;
this.userPass = userPass ;
this.rePass = rePass ;
this.userMail = userMail ;
} ;
User.prototype = {
// set get
} ;
2,建立User实体模型中的操作api
function User(userName,userPass,rePass,userMail){
this.userName = userName ;
this.userPass = userPass ;
this.rePass = rePass ;
this.userMail = userMail ;
} ;
User.prototype = {
// set get
} ;
User.getUserByNameAndPwd = function(params){
return $.ajax({
url : "/login.json" ,
type : "post" ,
data:{
userName : params.userName ,
userPass : params.userPass
} ,
dataType: "json"
}) ;
} ;
3,建立UserManager类
function UserManager(user){
this.user = user ;
} ;
UserManager.prototype = {
login : function(){
if(this.validate()){
this.user.getUserByNameAndPwd({
userName : this.user.userName ,
userPass : this.user.userPass
},function(data){
console.log("登录成功!") ;
}) ;
}
else{
throw new Error("用户名或者密码不能为空!") ;
}
} ,
validate : function(){
return (!this.user.userName || !this.user.userPass) ? false : true ;
}
} ;
4,建立客户端测试方法
function LoginClient(){
var userMgr = new UserManager(new User("bb","123456")) ;
userMgr.login() ;
} ;
5,基本这就是OO的完整重构版本了,以下作个小结
通过上面的例子的设计说明,使用面向对象的思维方法,其实是一个把业务逻辑从具体的编程技术当中抽象出来的过程,而这个抽象的过程是自上而下的,非常符合人类的思维习惯,也就是先不考虑问题解决的细节,把问题的最主要的方面抽象成为一个简单的框架,集中精力思考如何解决主要矛盾,然后在解决问题的过程中,再把问题的细节分割成一个一个小问题,再专门去解决细节问题。
因而一旦牢牢的抓住了这一点,你就会发现在软件设计和开发过程中,你自己总是会不知不觉的运用面向对象的思维方法来设计和编写程序,并且程序的设计和开发也变得不再那么枯燥,而一个合理运用面向对象技术进行设计和架构的软件,更是具备了思维的艺术美感。
最后,愿面向对象的思维方法也能给您的程序设计之路带来创作的乐趣。
三,最后的总结一下
1.类的职责不能多,职责多需要分解
2.抽象实体模型
3.理解oo的特质封装,继承,多态
哈哈哈,本篇结束,未完待续,希望和大家多多交流够沟通,共同进步(*^__^*) 嘻嘻……
大话JS面向对象之扩展篇 面向对象与面向过程之间的博弈论(OO Vs 过程)------(一个简单的实例引发的沉思)的更多相关文章
- JS:面向对象(基础篇)
面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念.long long ago,js是没有类的概念(ES6推出了class,但其原理还是基于原型),但是它是基于原 ...
- JS:面向对象(进阶篇)
组合使用构造函数和原型模式 构造函数模式用于定义实例属性,而原型模式用于定义方法和共享属性.结果,每个实例都会有自己的一份实例属性的副本,但同时又共享这对方法的引用,最大限度的节省了内存. funct ...
- JavaScript 面向对象(一) —— 基础篇
学好JS的面向对象,能很大程度上提高代码的重用率,像jQuery,easyui等,这篇博客主要从细节上一步步讲JS中如何有效地创建对象,也可以看到常见的创建对象的方式,最后也会附上一些JS面向对象的案 ...
- JavaScript 面向对象(三) —— 高级篇
JavaScript 面向对象(一) —— 基础篇 JavaScript 面向对象(二) —— 案例篇 一.json方式的面向对象 首先要知道,js中出现的东西都能够放到json中.关于json数据格 ...
- JavaScript 面向对象(二) —— 案例篇
看案例前可以先看看基础篇:JavaScript 面向对象(一) —— 基础篇 案例——面向对象的选项卡:把面向过程的程序一步步改成面向对象的形式,使其能够更加的通用(但是通用的东西,一般会比较臃肿). ...
- python_day7【模块configparser、XML、requests、shutil、系统命令-面向对象】之篇
python内置模块补充 一.configparser configparser:用户处理特定格式的文件,其本质是利用open打开文件 # 节点 [section1] #键值对k1 = v1 k2:v ...
- 从 prototype.js 深入学习 javascript 的面向对象特性
从 prototype.js 深入学习 javascript 的面向对象特性 js是一门很强大的语言,灵活,方便. 目前我接触到的语言当中,从语法角度上讲,只有 Ruby 比它更爽. 不过我接触的动态 ...
- python 面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- Python 面向对象(初级篇)
51CTO同步发布地址:http://3060674.blog.51cto.com/3050674/1689163 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...
随机推荐
- 指针的指针&指向指针数组的指针
一.指针的指针 指针的指针看上去有些令人费解.它们的声明有两个星号.例如: char ** cp; 如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...
- Egret 摇一摇功能
一 什么是重力感应 二 什么是陀螺仪 三 Egret中的摇一摇是利用什么原理实现的 四 摇一摇代码 一 什么是重力感应 二 什么是陀螺仪 三 Egret中的摇一摇是利用什么原理实现的 大概是利用手机 ...
- Delphi调用REST
Delphi调用REST很简单,首先在界面上放上: RESTClient1: TRESTClient; RESTRequest1: TRESTRequest; RESTResponse1: TREST ...
- 你还没成为Delphi QC的成员吗?(转红鱼儿)
Delphi很早就建立了quality.embarcadero.com,简称为QC,质量控制中心,用来接收用户反馈的bug,新功能建议等,是开发者与delphi官方直接交流的平台.无论是否为正版用户, ...
- COleChangeSourceDialog不能Change Source的解决方法
在微软给的例子OClient中,有选中一个OLE对象然后Change Source的功能,但是会报错.分析了一下是这样的: void CMainView::OnOleChangeSource() ...
- Explode TArray
function Explode(const Separator, S: string; Limit: Integer = 0): TArray;var SepLen : Integer; F, P ...
- linq 对Sum()函数的支持
首先看一段SQL语句: SELECT SUM(TASKAPPR) AS APPRCOUNT, SUM(TASKLOCKED) AS LOCKEDCOUNT, SUM(TASKCHECKED) AS C ...
- 编程实践中C语言的一些常见细节
对于C语言,不同的编译器采用了不同的实现,并且在不同平台上表现也不同.脱离具体环境探讨C的细节行为是没有意义的,以下是我所使用的环境,大部分内容都经过测试,且所有测试结果基于这个环境获得,为简化起见, ...
- MySQL相关操作知识
1.解决客户端联不上MySQL服务器的问题: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; ...
- System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围
GridView指定的参数已超出有效值的范围GridView在更新过程中异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围.参数名:v ...