0

0

应聘者页面??文本输入框及单选多视图重构_html/css_WEB-ITnose

php中文网

php中文网

发布时间:2016-06-24 11:56:02

|

1189人浏览过

|

来源于php中文网

原创

             最近校招季,实习单位提供校招软件服务,线上用户比较多,并没有太多新功能上线,乐帝主要负责做一些重构的工作。想想今年毕业新来的同事,已经能够独立承担业务开发。乐帝最近对mvc架构有了更深的了解,编程能力也有一定的入门提高,从同事新胜那儿,学到很多前端开发的规范,在这里再次感谢新胜耐心教导、无私帮助。

    乐帝与新胜最大的差别在于,新胜处理问题解决问题,都有深厚的理论功底,即知其所以然,而不单单是一个程序员,他有自己的思考,懂得如何优化代码与性能。乐帝向新胜学习他,构建的理论体系及解决问题的方法。快速缩小与新胜这个榜样的差距。

    这篇文章所讨论视图,在单位,招聘项目里,应聘者功能下。那为什么需要重构呢?

    在这次重构工作中,我想有两方面原因:

Presentations.AI
Presentations.AI

AI驱动创建令人惊叹的演示文稿

下载

立即学习前端免费学习笔记(深入)”;

  • 模板中处理逻辑过于复杂,不符合结构与处理逻辑分离,代码可读性不高。

  •       如上所示,模板中用了多层if-else嵌套,夹杂各种以分割HTML和JS代码,结构与逻辑耦合度非常高,可读性比较低,不利于修改。

  • 多个同类视图,在逻辑和结构上,只有微小差异,但源代码各写一套逻辑和视图,扩展性不高,造成大量代码冗余,不利于后期维护。
  •    乐帝做的第一步是将模板中逻辑提取出来,并将views.SearchItemView1、views.SearchItemView20、views.SearchItemView23,这三个视图模板采用Beyond Compare软件进行文字比对,发现三个模板差异,这里的差异包括两部分内容:结构差异与逻辑差异。其中结构上标签名都相同,只是每个视图部分标签属性值不同,这些属性值可在View中处理。

       乐帝最初的解决方案,是通过调试每个视图传入model值,发现视图构建差异在model值中Ctype属性上。


      于是针对以上三个视图,针对Ctype判断,构建不同视图不同的属性值。

    textInputAttr:function(){				var isDefault = this.model.get("IsDefault");				var searchItems = this.model.get("searchItems");				var defaultVal  = this.model.get("DefaultVal");				var cType =this.model.get("Ctype");				if(cType==1){					this.$el.find("input[type='text']").addClass("search_box_prev");					this.$el.find("input[type='text']").attr("data-rule-maxlength",300);				}else{					this.$el.find("input[type='text']").addClass("souce_name");					this.$el.find("input[type='text']").attr("data-rule-maxlength",100);					if(cType==23){						this.$el.find("input[type='text']").addClass("default_word");					}				}//针对不同ctype设置input不同属性及值				if(cType==1){					if(typeof isDefault !="undefined"&&isDefault==1)					{						this.$el.find("input[type='text']").attr("defaultValue",defaultVal);					};// 设置defaultValue属性				}								if(typeof searchItems !="undefined")				{					if(searchItems.Value!=null)					{						this.$el.find("input[type='text']").attr("value",searchItems.Value[0]);					}				}				else{					if(cType==1){						if(typeof isDefault !="undefined"&&isDefault==1){						this.$el.find("input[type='text']").attr("value",defaultVal);						}					}									}//设置value属性值			},			checkInputAttr:function(){				var searchItems = this.model.get("searchItems");				var cType =this.model.get("Ctype");				if(cType==1){					this.$el.find("input[type='checkbox']").addClass("search_box_any");				}else{					this.$el.find("input[type='checkbox']").addClass("souce_name");				}					if((typeof searchItems !="undefined")&&(searchItems.Value!=null)&&(searchItems.Value.length>0)){							_.each(searchItems.Value,function(item,value){								var valLength = (cType==1)?(searchItems.Value.length):(searchItems.Value.length-1);//判断采用何种表达式								if(valLength==value){									if(item){										this.$el.find("input[type='checkbox']").attr("value",item);										if(searchItems.Value[value]=="true")											this.$el.find("input[type='checkbox']").attr("checked","checked");									}else{										this.$el.find("input[type='checkbox']").attr("value","");									}								}							});					}else{						this.$el.find("input[type='checkbox']").attr("value","");					}			}//checkbox设置

                   这段代码存在的隐患是,根据Ctype做判断生成各视图,与model非常相关,即与已有数据结构高度耦合,不利于扩展。假如在此逻辑上,我需要新加一个与上述三类视图同类的视图,那么还需在代码基础上,再次改进代码,加入对新视图Ctype判断,这显然不是我们想要的。

       重构真正的需求是:构造一个通用类,将每个视图共通的地方写入此类中,在不同子视图中继承此通用类,如有差异可覆写通用类方法,实现个性化定制。

       有了如上思路,接下来做的工作,就是根据之前采用文本比对得出的差异部分,进行分块处理,即构造原子函数,确定都有哪些原子块,并且一并写到通用类中。差异的部分在原子类中以空方法形式存在,在子函数中覆写通用类空函数,实现个性化订制。

    var SingleInputView = Talent.ItemView.extend({			onBeforeRender:function(){				this.standLabel();//标准化标签			},			onRender:function(){				this.textMaxlen(this.maxlength);				this.setCheckboxVal(this.minus);				this.SetTextInput();				this.SetCheckboxInput();			},			standLabel:function(){				var label = this.model.get("Label");				if((label.length != 7)&&(label.length>6))				{					this.model.set({"Label":label.substring(0,6)+"…"});				}			},			textAddClass:function(){			},			textMaxlen:function(length){				this.$el.find("input[type='text']").attr("data-rule-maxlength",length);			},			setTextDefaultVal:function(){			},			setTextVal:function(){				var isDefault = this.model.get("IsDefault");				var searchItems = this.model.get("searchItems");				var defaultVal  = this.model.get("DefaultVal");				if(typeof searchItems !="undefined")				{					if(searchItems.Value!=null)					{						this.$el.find("input[type='text']").val(searchItems.Value[0]);					}				}			},			checkboxAddClass:function(){			},			setCheckboxVal:function(minus){				var searchItems = this.model.get("searchItems");				if((typeof searchItems !="undefined")&&(searchItems.Value!=null)&&(searchItems.Value.length>0)){							_.each(searchItems.Value,function(item,value){								var valLength =searchItems.Value.length-minus;//判断采用何种表达式								if(valLength==value){									if(item){										this.$el.find("input[type='checkbox']").val(item);										if(searchItems.Value[value]=="true")											this.$el.find("input[type='checkbox']").attr("checked","checked");									}else{										this.$el.find("input[type='checkbox']").val("");									}								}							});					}else{						this.$el.find("input[type='checkbox']").val("");					}			},		});

          有些逻辑代码,只是随着视图不同,变量不同,这里在父类中,构造带变量的方法,并在子类中设置属性值,传入父类方法中,如:

    setCheckboxVal:function(minus){				var searchItems = this.model.get("searchItems");				if((typeof searchItems !="undefined")&&(searchItems.Value!=null)&&(searchItems.Value.length>0)){					_.each(searchItems.Value,function(item,value){						var valLength =searchItems.Value.length-minus;//判断采用何种表达式						if(valLength==value){							if(item){								this.$el.find("input[type='checkbox']").val(item);								if(searchItems.Value[value]=="true")									this.$el.find("input[type='checkbox']").attr("checked","checked");								}else{									this.$el.find("input[type='checkbox']").val("");								}							}					});

       在父类中构造了渲染后onRender回调函数,自动调用通用类及子视图方法:

    onRender:function(){				this.textMaxlen(this.maxlength);				this.setCheckboxVal(this.minus);				this.SetTextInput();				this.SetCheckboxInput();			}

                  这里用到两个this.SetTextInput()和this.SetCheckboxInput()两个方法,分别是在子类中实现,用以按照定制化需求,加载执行不同子类函数:

    SetTextInput:function(){				this.textAddClass();				this.setTextDefaultVal();				this.setTextVal();			}

             通用类,还用到一个onBeforeRender回调方法,用以在数据还没有渲染到模板时,对数据进行处理。

    onBeforeRender:function(){				this.standLabel();//标准化标签			}

        这样处理的优势在于,逻辑更清晰,并且充分利用此回调函数时序上的优势。

        通过对以上重构分析,我们可以得出重构的大体方向:

  • 对差异代码模块化,写入通用类的空方法中。
  • 只有变量差异的代码,写入通用类中带参数方法中。
  • 最后调用方法,写在通用类中,并在子类中,构造定制化加载方法如SetTextInput方法的职能
  • 立即学习前端免费学习笔记(深入)”;

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    全国统一发票查询平台入口合集
    全国统一发票查询平台入口合集

    本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

    19

    2026.02.03

    短剧入口地址汇总
    短剧入口地址汇总

    本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

    27

    2026.02.03

    植物大战僵尸版本入口地址汇总
    植物大战僵尸版本入口地址汇总

    本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

    15

    2026.02.03

    c语言中/相关合集
    c语言中/相关合集

    本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

    3

    2026.02.03

    漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
    漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

    本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

    13

    2026.02.03

    Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口
    Yandex官网入口与俄罗斯搜索引擎访问指南 Yandex中文登录与网页版入口

    本专题汇总了俄罗斯知名搜索引擎 Yandex 的官网入口、免登录访问地址、中文登录方法与网页版使用指南,帮助用户稳定访问 Yandex 官网,并提供一站式入口汇总。无论是登录入口还是在线搜索,用户都能快速获取最新稳定的访问链接与使用指南。

    114

    2026.02.03

    Java 设计模式与重构实践
    Java 设计模式与重构实践

    本专题专注讲解 Java 中常用的设计模式,包括单例模式、工厂模式、观察者模式、策略模式等,并结合代码重构实践,帮助学习者掌握 如何运用设计模式优化代码结构,提高代码的可读性、可维护性和扩展性。通过具体示例,展示设计模式如何解决实际开发中的复杂问题。

    3

    2026.02.03

    C# 并发与异步编程
    C# 并发与异步编程

    本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

    2

    2026.02.03

    Python 强化学习与深度Q网络(DQN)
    Python 强化学习与深度Q网络(DQN)

    本专题深入讲解 Python 在强化学习(Reinforcement Learning)中的应用,重点介绍 深度Q网络(DQN) 及其实现方法,涵盖 Q-learning 算法、深度学习与神经网络的结合、环境模拟与奖励机制设计、探索与利用的平衡等。通过构建一个简单的游戏AI,帮助学习者掌握 如何使用 Python 训练智能体在动态环境中作出决策。

    3

    2026.02.03

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号