代码要写成别人看不懂的样子(十九)

《道德经》第四十九章 道德经》第四十九章展现了圣人(理想统治者)超越个人好恶、与百姓同心同德的博大胸怀,并提出了“以百姓心为心”的治理原则。 阅读详情

本篇文章参考书籍《JavaScript设计模式》–张容铭

前言

  大家有没有遇到过操作大量节点的情况,比如我们在页面上想要创建一个展示区域,这块区域,需要跟不同的选项来展示不同结构的内容,那我们就需要根据选项来操作不同的节点。首先创建节点,然后创建节点内容,将节点内容插入到创建的节点中,最后将节点插入到父节点中。

  这一套操作下俩,一个节点就需要 4 步,如果节点比较多,那这性能消耗就有点遭不住了。

  为了解决这一个问题,我们可以使用简单模板方法。如果各位接触过模板字符串,那学起来易如反掌。

简单模板模式

  通过格式化字符串拼凑出视图避免创建视图时大量节点操作,优化内存开销。

  举个例子,我们规定一个展示区容器,用来展示不同的信息。

//命名空间 单体对象
var A = A || [];
//主体展示容器区
A.root = document.getElementById('container');
//创建视图方法集合
A.strategy = {
	'listPart': function() {},
	'codePart': function() {},
	'onlyTitle': function() {},
	'guide': function() {}
	//.......
}
//创建视图入口
A.init = function(data) {
	//根据传输的试图类型创建视图
	this.strategy[data.type](data);
}

  接下来是实现 strategy 中的每一种创建算法。(下面代码粗略扫一眼就行)

//文字列表展示
'listPart': function(data) {
	var s = document.createElement('div'),          //模块容器
		h = document.createElement('h2'),           //标题容器
		p = document.createElement('p'),            //描述容器
		ht = document.createTextNode(data.data.h2), //标题内容
		pt = document.createTextNode(data.data.p),  //描述内容
		ul = document.createElement('ul'),          //列表容器
		ldata = data.data.li,                       //列表数据
		//li 列表项容器, strong 列表项标题,span 列表项解释,t 列表项标题内容, c 列表项解释内容
		li, strong, span, t, c;
	//有 id 设置模块 id
	data.id && (s.id = data.id);
	s.className = 'part'; //设置模块类名
	h.appendChild(ht);    //将标题内容放到标题容器
	p.appendChild(pt);    //将描述内容放到描述容器
	s.appendChild(h);     //将标题容器插入模块容器
	s.appendChild(p);     //将描述容器插入模板容器
	//遍历列表数据
	for(var i = 0, len = ldata.length; i < len; i++) {
		li = document.createElement('li');            //创建列表项容器
		strong = document.createElement('strong');    //创建列表项标题容器
		span = document.createElement('span');        //创建列表项解释容器
		t = document.createTextNode(ldata[i].strong); //创建列表项标题内容
		c = document.createTextNode(ldata[i].span);   //创建列表项解释内容
		strong.appendChild(t);       //向列表项标题容器中插入标题内容
		span.appendChild(c);         //向列表项解释容器中插入解释类容
		li.appendChild(strong);      //向列表项中插入列表项标题
		li.appendChild(span);        //向列表项中插入列表项解释
		ul.appendChild(li);          //向列表项中插入列表项
	}
	s.appendChild(ul);     //向模块中插入列表
	A.root.appendChild(s); //展现模块
}

  大家有没有觉得上面的代码,阅读起来总是看串行,虽然整整齐齐,但是看着就头大。这就是我们一开始说的操作各种节点。写起来费劲,读起来费劲,浏览器运行起来也费劲。

  为了解决上面的问题,我们可以试着创建一个模板,用数据去格式化字符串来渲染视图并插入到容器里,这样实现的方案性能上会提高很多,首先需要一个渲染器,比如想用数据对象 ‘{demo: ‘this is a demo’}’ 去格式化 ‘<a>{#demo#}</a>+’ 字符串模板,得到 ‘<a>this is a demo</a>’ 渲染后的模板,便可插入到页面中,不过先要一个渲染模板引擎的方法 formateString 方法,将字符串模板中的 {#demo#} 替换成数据对象中的 demo 属性值。

//渲染模板方法
A.formateString = function(str, data) {
	return str.replace(/\{#(\w+)#\}/g, function(match, key) {return typeof data[key] === undefined ? '' : data[key]});
}

  有了这个方法,我们就可以通过简单模板来渲染出我们需求的视图了。

//文字列表展示
'listPart': function(data) {
	var s = document.creatElement('div'),   //容器模块
		ul = '',                            //列表字符串
		ldata = data.data.li,               //列表数据
		//模块模板
		tpl = [
			'<h2>{#h2#}</h2>',
			'<p>{#p#}</p>',
			'<ul>{#ul#}</ul>'
		].join(''),
		//列表项模板
		liTpl = [
			'<li>',
				'<strong>{#strong#}</strong>',
				'<span>{#span#}</span>',
			'</li>'
		].join('');
	//有 id 设置模块 id
	data.id && (s.id = data.id);
	//遍历列表数据
	for(var i = 0, len = ldata.length; i < len; i++) {
		//如果有列表项数据
		if(ldata[i].em || ldata[i].span) {
			//列表字符串追加一项列表项
			ul += A.formateString(liTpl, ldata[i]);
		}
	}
	//装饰列表数据
	data.data.ul = ul;
	//渲染模块并插入模块中
	s.innerHTML = A.formateString(tpl, data.data);
	//渲染模块
	A.root.appendChild(s);
}

  这样我们的模板就完成了,一行的渲染工作,便完成了上面那么多节点操作。不过这个版本还能优化, tpl 这个模板内部相似的地方还可以提取,这样我们创建一个模板生成器,我们只要传入不同的标签名就可以了。

//模板生成器 name: 标识
A.view = function(name) {
	//模板库
	var v = {
		//代码模板
		code: '<pre><code>{#code#}</code></pre>',
		//图片模板
		img: '<img src="{#src#}" alt="{#alt#}" title="{#title#}" />',
		//带有id和类的模块模板
		part: '<div id="{#id#}" class="{#class#}">{#part#}</div>',
		//组合模板
		theme: [
			'<div>',
				'<h1>{#title#}</h1>',
				'{#content#}',
			'</div>'
		].join('')
	}
	//如果参数是一个数组,则返回多行模板
	if(Object.prototype.toString.call(name) === '[object Array]') {
		//模板缓存器
		var tpl = '';
		for(var i = 0, len = name.length; i < len; i++) {
			//模板缓存器追加模板
			tpl += arguments.callee(name[i]);
		}
		//返回最终模板
		return tpl;
	} else {
		//如果模板库中有该模板则返回该模板,否则返回建议模板
		return v[name] ? v[name] : ('<' + name + '>{#' + name +'#}</' + name + '>');
	}
}

  有了这个小型模板生成器,我们先获取一个模板就简单多了,比如我们想获取一个 ‘<span>{#span#}</span>’ ,就可以通过 A.view(‘span’) 方式来获取。有了它,完成我们的需求就容易多了。

//文字列表展示
'listPart': function(data) {
	//......
		//模块模板
		tpl = A.view(['h2', 'p', 'ul']),
		//列表项模板
		liTpl = A.formateString(A.view('li'), {li: A.view(['strong', 'span'])}),
	//......
}

  模板字符串的应用其实非常广泛,大家一定要好好熟悉这部分内容。




GameFramework教程✨十九、声音 声音 阅读详情

相关推荐

Python实战:5分钟搞定VCF文件中每个样本的SNP统计(附bcftools安装指南)

本文介绍了三种高效统计VCF文件中每个样本SNP数量的Python方法,包括原生解析、结合bcftools的推荐方案以及使用PyVCF3专业库。特别推荐bcftools结合Python的方法,适用于中大型VCF文件,显著提升处理效率。文章还提供了bcftools安装指南和进阶统计技巧,帮助生物信息学分析人员快速完成SNP统计任务。

weixin_30555125的博客 494

代码要写成别人看不懂的样子(九)

本篇文章参考书籍《JavaScript设计模式》–张容铭 文章目录前言模板方法模式 前言   前几节的结构型设计模式,各位学的乱不乱,我个人刚开始接触的时候,也觉得很抽象,不太好理解,尤其是实战的时候,总是不知道在什么情况下使用。记住一点,当我们单纯的创建一个    模板方法模式       ...

不见浅诗的博客 397

LabVIEW与三菱PLC通讯实战:ActiveX控件在FX5U上的应用技巧

本文深入探讨了如何利用三菱MX Component中的ActiveX控件,在LabVIEW中实现与FX5U系列PLC的高效、稳定通讯。文章从环境配置、ActiveX控件生命周期管理、数据读写性能优化及容错机制等实战角度,分享了构建工业级健壮通讯程序的核心技巧与架构设计思路。

qsc9012345的博客 889

如何隐藏自己的代码(很酷)

这里我们可以实现把关键的函数实现与主函数分开,放在不同文件中,不仅方便团队的协作,而且可以使代码更加有条理,但是我们要注意,如果是使用自己的创造的头文件的话,应该用双引号,同时头文件里面放的都是函数的声明,函数的具体实现是在源文件中的。幻想当我们成为一名优秀的程序员,有着各大公司想要买我们的代码,但我们并不想要让他们知道我们代码的实现,毕竟一复制便可以解决,这里我们希望有一种方法可以把我们的核心代码给隐藏掉,那我们又应该怎么去实现呢?接下来让我们一起来看看吧。这是自己的代码,将重要代码放在这个文件中。

xdx2578的博客 3702

相控阵雷达“相控”原理---多张动画示意图完美解释

很容易就能发现,相控阵雷达的天线由无数个小单元天线组成,这些小单元天线叫做“阵元”,对于有源相控阵雷达来说,每一个阵元都是独立控制的,它们既能独立发射雷达波,也能接收雷达波的回波信号。相控阵雷达可以在1秒内关机,1秒内开机,好处是,当军舰遇到依靠雷达信号进行引导的“反雷达导弹”时,可以迅速地把朝向来袭导弹方向的雷达关机,同时,其他方向的雷达保持开启。在过去,军舰上安装有不同种类的雷达,体积庞大、重不说,另一个麻烦是干扰,常常是,一种雷达工作时,另一种雷达就会受到干扰,严重的甚至不能同时工作。

muyangjun的专栏 1万+

《QMT量化实战系列》支持自定义筛选与排序的多因子策略,实测年化收益超100% (1)

公众号推出《QMT量化实战》系列,通过多维度、多策略、多场景讲解QMT量化平台应用,每期附代码解读。本期复现《支持自定义筛选与排序的多因子策略》,策略包含三大核心模块:1. 通过Tushare获取30+财务因子数据;2. 提供灵活筛选机制(支持排除ST股、次新股及特定板块);3. 创新性多因子加权排序系统(支持自定义因子权重组合)。交易逻辑包含动态调仓机制,当持仓标的排名低于阈值时触发卖出。该策略具有高度可配置性,适合不同风险偏好的投资者。(149字)

qq_46262068的博客 1730

C#混淆心得

混淆的本质就是让代码变丑,让别人看不懂。

Story_1419的博客 2736

数字 IC 笔试面试必考点(2)FPGA 开发流程

FPGA 的详细开发流程就是利用 EDA 开发工具对 FPGA 芯片进行开发的过程,所以 FPGA 芯片开发流程讲的并不是芯片的制造流程,区分于 IC 设计制造流程哟(芯片制造流程多麻烦,要好几十亿的费用呢,而且国内也貌似没有哪家像样的 Foundry 厂,除了台湾的 TSMC 在世界有立足之地,Fabless 的 IC 设计公司倒是挺强的如 Hisilicon,这也是它为什么会被 USA 针对的原因)。

新芯设计的博客 2012

一些奇奇怪怪不好理解的代码

intern()方法API的解释当调用intern方法时,如果池已经包含与equals(Object)方法确定的相当于此String对象的字符串,则返回来自常量池的字符串。2、第二句话报错是因为,1.5被默认成是double类型的,double数据类型无法转换成float类型,所以也就也没有被自动装箱,所以也就不是一个Float对象。在做三元运算符的时候,要把整个三元运算符看作一个整体,如果两个的精度不一致,会提高精度,无论输出是谁,但是精度必须是两者中最高的,A02判断以下语句的输出结果。...

Sunblogy的博客 734

基于Simulink的电动汽车电池管理系统热管理优化仿真

电动汽车电池管理系统(Battery Management System, BMS)中的热管理是确保电池性能、安全性和寿命的关键环节。温度过高或过低都会显著影响电池的工作效率和寿命,因此需要对电池组进行精确的热管理。基于MATLAB/Simulink的仿真平台可以用于建模和优化电池热管理系统,包括热分布预测、冷却策略设计以及热平衡控制等。本项目旨在构建一个完整的电动汽车电池热管理优化仿真模型,并通过仿真验证系统的性能。

xiaoheshang_123的博客 461

SEGGER Embedded Studio初体验

先楫HPM5E00EVK开发环境搭建

hywing's blog 1108

手把手教你写出几十种让同事无法维护的代码!

对,你没看错本文就是教你怎么写出让同事无法维护的代码!01程序命名容易输入的变量名。比如:Fred,asdf单字母的变量名。比如:a,b,c, x,y,z(如果不够用,可以考虑a1,a2...

xmt1139057136的专栏 876

vue3+ts+elementui-plus二次封装树形表格实现不同层级展开收起的功能

我只定义了三层数据,就只演示展开了三层,还可以多层,自己设置即可。

蜗牛~~ 2602

十九个子域名,一个被放行的 IP

本文介绍了一种利用泛域名解析和Nginx反向代理构建安全自建服务的方法。作者通过*.example.com泛解析将所有子域名指向同一VPS,结合Docker网络和Nginx Proxy Manager(NPM)实现服务快速部署,仅需填写容器名、端口等基本信息即可完成HTTPS发布。所有服务都通过共享的Docker网络通信,不直接暴露端口。 关键安全措施是在Nginx配置中添加IP白名单(包括网关容器IP和VPS公网IP)和基础认证,形成双重保护。尽管服务都使用公开域名和证书,但实际访问需要满足IP和密码双重

qq_21494071的博客 216

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

sqli-labs第十九关

摘要:本文详细介绍了SQL注入攻击的五个步骤:1)通过抓包分析发现注入点;2)获取数据库名称;3)获取表名;4)查看表列结构;5)最终获取敏感数据。作者使用sqlmap工具结合报错注入技术,通过修改referer头进行闭合测试,最终成功获取数据库中的用户名和密码等关键信息。文章展示了完整的SQL注入流程,包括利用updatexml函数进行报错注入的具体方法。

fristchoice的博客 388

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

没4米不敢上场? 第十九届智能车竞赛镜头组大佬国赛采访大集结

多的,我们还是比较多的,我们这个组别如果说想要提升一秒或者是零点几秒,都需要我们在每一个细节做到最精致,所以我们还是花了很多的时间,我们在今年自制车模上其实遇到过比较大的瓶颈,然后不停的改方案 然后改车模,前前后后应该是至少有7、8辆车模,然后是我们的废弃方案 ,然后最终才确定下 参加国赛的车模,然后这个车模也是在国赛备赛期间,出现过不少问题,整个车从头到尾基本上都有零件坏过,包括主板驱动以及电调,我们也是不停的,就是克服这个重重困难 ,然后最后解决,然后完成了这个比赛。

TSINGHUAJOKING 2556

开心实习之第十九天Matplotlib

更绝的是那个fmt参数,像'o:r'就能直接指定用圆点标记、点线连接、红色显示,不用分开调参数,简直是懒人福音——我第一次试的时候,故意把颜色换成绿色,线条换成虚线,看着自己调出来的图,还挺有成就感。比如subplot(1,2,1),我一开始以为是“1行2列的第2个”,结果画出来位置不对,后来对着PPT里的例子试了几次才明白:哦,原来index是从左到右、从上到下数的,1行2列的话,第一个是左边,第二个是右边。imshow能显示灰度图、彩色图,甚至热力图,我试着用随机数组生成图像,看着那些颜色块还挺神奇。

2401_85800390的博客 295

Git进阶(十九):git revert 导致 merge 代码丢失问题修复

项目开发阶段使用分支是feature_xxx,将feature_xxx分支merge到master之后,这时发现刚代码有bug,需要回版本回退,点击revert按钮。将本地的原分支feature_xxx代码修改后提交到远程分支,发起 Merge 到 Master 的申请会发现,feature_xxx分支和 master 分支的差异 commit 只有 feature_xxx 分支 revert 后的提交记录,之前的代码变动都没有了。

IT全栈 华强工作室 2849

《道德经》第四十九章 治世心法

第四十九章是老子写给统治者的“治世心法”。它告诉我们:最高明的管理,不是控制,而是顺应;不是区分,而是包容;不是用智,而是归朴。圣人无常心,以百姓心为心。这不仅是治国之道,更是做人、做事、做管理的至高心法。当你放下“我”的执念,以他人之心为心,以团队之心为心,以用户之心为心,你便进入了“无为而无不为”的境界。

z1324402468的博客 979

《佛密诸事》第七章:释逸牟尼四十九禅修录(节录十日)

四十九禅是佛祖释迦牟尼经过了六年的苦行修后未得正果,最后四十九禅定法开悟而得圆通。这四十九禅是每天昼夜不断地禅练,有七种坐势、七种手印、七种观想、七种咒语、七种感悟、七种禅眠、最后是七种神通。释祖在菩提树下禅练时,四十九天得开悟,他悟出了四谛、八正道、十二因缘的真谛,洞观全宇。他是怎样入定的呢?禅定四十九天的经历和坐势、手印、观想、咒语、感悟、禅眠、神通释祖从未外传过,但后来在许多法门中有释祖四十

Gareth的专栏 3169

一座海上营业厅,一个女孩独自守望的十九年

福建宁德的近海海湾上,漂浮着一片片的渔排,是渔民们的“海上牧场”。陈巧玲在这座渔排上工作生活了十九年,守着唯一一座营业厅。十九年前,陈巧玲刚刚毕业,成为福建移动的一名工作人员,一开始是乘船去渔民自发聚集形成的渔排上,为他们办理业务、售卖手机和电话卡。后来,渔排上生活打渔的人越来越多,用网需求增大,海上营业厅就应运而生,陈巧玲成为留在渔排上工作的人之一。渔排上日子苦闷,新鲜蔬菜都很难买到,每两周才能...

脑极体 433

三十岁之前不必在乎的二十九件事

三十岁之前不必在乎的二十九件事 1.放弃   把握的反面就是放弃,选择了一个机会,就等于放弃了其它所有的可能。当新的机会摆在面前的时候,敢于放弃已经获得的一切,这不是功亏一篑,这不是半途而废,这是为了谋求更大的发展空间;或者什么都不为,只因为喜欢这样做,因为,年轻就是最大的机会。人,只有在三十岁之前才会有这个胆量,有这个资本,有这个资格.    2.失恋   不是不在乎...

weixin_34248118的博客 158

十九

 《道德经到底在说什么》(十九)百姓皆谓我自然 伯阳 ·  太上,下知有之;其次,亲之誉之;其次,畏之;其次,侮之。 上一章讲,有道圣王致虚极守静笃,归根复命,倚着造化之门观万物生生不息,守常不妄,故能使万化定安,天下太平。 本章接着上一章,把百姓从万物中独立出来,进一步具体的阐述,有道圣王应该如何效法天道,顺应自然的去对待天下百姓。 太上,下知有之;对这句的解读,历来众说

zouzufeng的专栏 408

Kubernetes(K8s)从入门到精通系列之十九:Operator模式

Operator 是 Kubernetes 的软件扩展,它利用自定义资源来管理应用程序及其组件。Operator 遵循 Kubernetes 原则,特别是控制循环。

zhengzaifeidelushang的博客 1615

android逆向之路十九

有些同学十分的沉迷于游戏,无论是电脑游戏还是手机游戏,一言不合就各种充钱,即使是手机单机的还是这样子无脑充钱。然后现在来学习一下简单的单机或者弱网游破解游戏。首先我们得先明白一些游戏平台的关键字代码。破解游戏也称之为内购。以下是一些平台内购的一些关键代码。联通游戏搜索:OnPayResult腾讯游戏:midaspaycallback和游戏搜索方法名onResult,onchinabilling,r...

luoawai的博客 661

Selenium自行整理【三十九】

7.2、Junit 单元测试框架解析 相信通过上一节的学习我们已经对 Junit 了初步的认识,起码已经知道了用它写自动化测试用例是什么样子。这一节我们将更详细的学习 Junit 单元测试框架。 什么是单元测试?单元测试负责对最小的软件设计单元(模块)进行验证,它使用软件设计文档中对模块的描述作为指南,对重要的程序分支进行测试以发现模块中的错误。在 Java...

断情音的博客 228
上一篇: 代码要写成别人看不懂的样子(十八)
下一篇: 代码要写成别人看不懂的样子(二十)
不见浅诗~
博客等级 码龄7年 506粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值