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

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

本篇文章参考书籍《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教程✨十九、声音 声音 阅读详情

相关推荐

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2782

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

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

不见浅诗的博客 397

船舶轨迹预测中的5个常见坑:基于LSTM单步预测的避坑实践

本文针对船舶轨迹预测中LSTM单步预测的常见问题,系统总结了五个典型陷阱及避坑实践。重点分析了如何正确处理AIS数据的非均匀采样与清洗、对航向角进行周期性编码、采用轨迹级归一化策略、缓解单步滚动预测的误差累积,并设计贴合业务的评估指标。这些实践能有效提升预测模型的准确性与实用性。

cnn8visionary的博客 631

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

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

xdx2578的博客 3702

航空大数据——项目资源汇总及开源(四)

ADS-B项目开源大礼包

cyc头发还挺多的博客 4979

Starlink第三代终端与第二代终端的差异分析

SpaceX星链第三代终端实现显著升级,硬件售价维持599美元不变但性能全面提升。相比第二代产品,第三代终端取消自动调节电机改为手动定向,防水防尘等级提升至IP67,天线面积扩大46%,支持235台设备连接(提升87%),下载速度可达1Gbps(提升4倍),延迟降至20ms以下。新增3个千兆接口和WiFi6支持,同时推出199美元单独路由器选项。这些改进使第三代终端在保持价格优势的同时,更好地满足户外、移动和商业场景需求,标志着SpaceX卫星互联网服务从亏损销售转向盈利模式的重要转折。

通信行业老兵、物联网从业者,做一个有趣的普通人。 3028

C#混淆心得

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

Story_1419的博客 2736

修改yolov8使支持单通道图像输入

默认支持BGR三通道图像输入,但是在很多工业场景下,存在很多灰度图像的场景,因此对yolov8代码做一些修改以支持单通道图像输入,满足项目实际需求。训练时,只需要在 data 的 yaml 文件中,添加 ch=1 即可。

mingo_敏 5779

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

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

Sunblogy的博客 734

新能源汽车电机交流电流测量系统精度全链路分析

通过全链路误差建模与瓶颈分析,结合硬件选型优化与软件算法补偿,可将系统精度从4.2%提升至≤1% FS。本文所述方法论已应用于某800V电驱平台开发,实测电流控制精度达±0.8%,为高性能电机控制奠定基础。为例,深入剖析从互感器采集到CAN报文解析的全链路信号处理流程,揭示各环节误差来源及对最终精度的影响,为研发测试提供理论支撑。:±0.1%(电阻温漂与运放开环增益限制):运放增益带宽积(GBW)不足导致高频衰减。:±0.02%/℃(铁氧体材料温敏特性):±0.5%读数(磁芯饱和效应)

优快云-新能源汽车研发测试专业博主 1492

电路板保险丝如何选型

在电路板保险丝选型过程中,需要考虑多个因素以确保其适合特定的电路需求。最后,经过以上程序选定的样品需要在实际的电路中进行测试,以验证所选择的保险丝是否合适。

weixin_57010826的博客 1310

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

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

xmt1139057136的专栏 876

19、多项式基算术:原理与运算详解

本文深入探讨了有限域 $GF(2^m)$ 中的多项式基算术,详细介绍了加法、减法、乘法和平方运算的原理与实现方法。重点分析了多项式基表示形式、模约简技术以及乘法优化策略,如高基数乘法、并行与顺序乘法器设计,并提到了Karatsuba-Ofman算法在减少乘法次数方面的优势。此外,文章还讨论了多项式基算术在密码学、编码理论等领域的应用前景,并展望了未来在高效算法设计与硬件加速方面的研究方向。

yellow的专栏 150

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

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

qq_21494071的博客 216

visio安装包

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

sqli-labs第十九关

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

fristchoice的博客 388

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

TSINGHUAJOKING 2556

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

开心实习之第十九天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、付费专栏及课程。

余额充值