大话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 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后 ...
随机推荐
- 第五百七十八、九天 how can I 坚持
这样下去不行啊 ,昨天晚上回来捣鼓了一晚上手机,看个视频还经常开小差,得全力以赴了,不能抱着打酱油的心态了,加油. 今天和yj聊了聊,好多事啊,不能一心工作了,还得考虑结婚,也是醉了. 努力吧,先把考 ...
- TJI读书笔记12-接口
TJI读书笔记12-接口 抽象类和抽象方法 接口 完全解耦和策略模式 接口间的继承关系 工厂模式 乱七八糟不知道怎么归类的知识点 接口和抽象类为我们提供了更强又有力的接口和实现分离的方法. 抽象类和抽 ...
- Mycat配置文件schema.xml参数配置
Mycat原理: Mycat的原理中最重要的一个动词是"拦截",它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析.路由分析.读写分离分析.缓存分析等 ...
- vsnprintf
http://www.cplusplus.com/reference/cstdio/vsnprintf/ int vsnprintf (char * s, size_t n, const char * ...
- DDK Build的DIRS和SOURCE文件
DDK Build编译的时候,使用3个文件来描述被编译的源码,其中SOURCES和Makefile是必须的,而DIRS则只在划分目录的时候有用.Makefile在这里作用并不大但是必须和SOURCES ...
- 性能检测工具介绍-Linux系统命令行
本文介绍的关于Linux自带命令进行性能检测的介绍,详细介绍这些linux自带的工具的使用. 一.uptime uptime命令的显示结果包括服务器已经运行了多长时间,有多少登陆用户和对服务器性能的总 ...
- RHEL7网络管理之nmcli
在RHEL7中默认使用NetworkManager 守护进程来监控和管理网络设置.nmcli是命令行的管理NetworkManager的工具,会自动把配置写到/etc/sysconfig/networ ...
- PostGreSQL存储过程
1 返回结果集的存储过程 -- drop FUNCTION getall();CREATE or REPLACE FUNCTION getall() RETURNS SETOF users AS$B ...
- IOS网络请求原理
1,为什么要用到网络, 只有通过网络跟外界进行数据交互,数据更新,应用才能保持哦新鲜.活力 如果没有网络,也就缺少数据变化.变成一滩死水. 2, 良好的移动网络应用 = 良好的UI + 良好的用户体 ...
- EhReport ,CReport改进版本,再次改进 ,V1.31
取消了xlgrid依赖,带齐了第三方包. 安装更加方便. For D7 下载源码