使用JavaScript开发一个自修改代码

话说在25年前,我刚刚开始从事软件开发。在工作中,我遇到一个叫Dave的朋友,他曾在一家大型保险公司工作过几年,他的工作重点是开发支持一个名为“个人人寿保险”的产品程序代码。比如人们向代表该公司代理商购买了个人人寿保险,Dave写的代码就在后台运行支撑着这条业务线的需求。

我和Dave讨论关于他最近完成的任务,他说最近的任务是移除在大型机上运行多年的个人人寿保险产品系列的“自修改代码(self modify code)“。

什么是自修改代码?维基百科上是这么说的:

“自修改代码是在执行时改变自己命令的代码,通常是为了减少命令和路径长度并提高性能,或者近单纯地减少重复的代码,从而简化维护复杂性。“

自修改代码是被用来在运行时改变程序逻辑,以便最大化服务器上内存的使用效率。我记得以前的老板说过,在他开发计算机技术的那几年,他们购买主机时只有8k内存。

所以,在这个感恩节,我想用JavaScript来开发一个自修改代码的程序。

JavaScript实例

在2017年11月23日星期四,是美国庆祝感恩节的日子,在这一天出生的朋友也很幸运。大多数美国公司都视作是假期,为员工提供了感恩的机会。想到这一点,我写下了如下的JavaScript代码:

selfModifyingCode = function(){

var turkeyDay = new Date(“November 23,2017 01:00:00”);

var date = new Date();

if(date.getDate()=== turkeyDay.getDate()){

selfModifyingCode = function(){

console.log(“吃火鸡”);

};

} else {

selfModifyingCode = function(){

console.log(“去工作”);

};

}

selfModifyingCode();

};

selfModifyingCode();

当selfModifyingCode函数开始初始化运行时,它的值相当于以下函数:

function selfModifyingCode(){

var turkeyDay = new Date(“November 23,2017 01:00:00”);

var date = new Date();

if(date.getDate()=== turkeyDay.getDate()){

selfModifyingCode = function(){

console.log(“吃火鸡”);

};

} else {

selfModifyingCode = function(){

console.log(“去工作”);

};

}

selfModifyingCode();

}

当通过selfModifyingCode()命令调用该函数时,将设置两个日期变量(turkeyDay和date),然后对其进行评估,判断日期时间戳是否相等。

如果两个日期匹配,则意味着今天是感恩节,selfModifyingCode函数被重写为如下所示代码:

function selfModifyingCode(){

console.log(“吃火鸡”);

}

如果两个日期不匹配(代表今天不是感恩节),selfModifyingCode函数将被重写为如下所示:

function selfModifyingCode(){

console.log(“去工作”);

}

因此,当程序逻辑调用selfModifyingCode()函数时,结果将会不同,这取决于调用程序的日期。

小结

自修改代码是处理需要在运行时进行逻辑评估的有效方法,建议仅在有意义的情况下使用。

在我前老板购买服务器的时代,他们不得不用自修改代码来最大化可用于处理请求的内存数量。一旦内存问题解决,我的朋友Dave就被要求去掉这个逻辑,因为太难支持和维护。

上面我写的这个简单例子也一样,要实现例子中的最终结果,还有很多更好的方法。当然,如果有人支持我的例子,那么在一年中的每一天(除了一天)之外,selfModifyingCode()函数中的函数代码都是一样的。

祝您有个美好一天!

编译:前端老白

作者:John Vester

地址:https://dzone.com/articles/using-self-modifying-code-in-javascript

本文来自企鹅号 - 21CTO媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jed的技术阶梯

Java设计模式之命令模式

假设某个项目组分为需求组(Requirement Group,简称RG)、美工组(Page Group,简称PG)、代码组(Code Group,简称CG),还...

763
来自专栏狮乐园

【译】Understanding SOLID Principles - Dependency Inversion

当我们在读书,或者在和一些别的开发者聊天的时候,可能会谈及或者听到术语SOILD。在这些讨论中,一些人会提及它的重要性,以及一个理想中的系统,应当包含它所包含的...

943
来自专栏java一日一条

在Java 8下更好地利用枚举

在我们的云使用分析API中,返回了格式化过的分析数据(这里指生成分析图)。最近,我们添加了一个特性,允许用户选择时间段(最开始只可以按天选择)。问题是,代码中每...

1391
来自专栏java一日一条

有经验的Java开发者和架构师容易犯的10个错误(上)

首先允许我们问一个严肃的问题?为什么Java初学者能够方便的从网上找到相对应的开发建议呢?每当我去网上搜索想要的建议的时候,我总是能发现一 大堆是关于基本入门的...

782
来自专栏编程

如何提高Python运行效率 超实用的四种提速方法

Python增长势头一直非常迅猛,它虽然是脚本语言,但容易学,同时,还有非常多优秀的深度学习库可用,也有越来越多的人将Python学习列入计划。Python是一...

2557
来自专栏java一日一条

书写高质量代码之状态维护

我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。

681
来自专栏儿童编程

儿童编程“控制”部分学习总结

在任何编程语言中,控制部分都是非常重要的,也是体现编程语言神奇之处。在Scratch中同样如此。初次学习肯定会感觉有些抽象,但是在实际应用之中,则会体现出其功能...

882
来自专栏take time, save time

python 爬虫 入门 commit by commit -- commit5

代码你可以在https://github.com/rogerzhu/relwarcDJ 上得到,并且带有我完整的commit记录。

610
来自专栏Java学习网

书写高质量代码之状态维护

状态之始 我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。 编程相对于人类历史的进程而言,不过是个六七岁孩...

2894
来自专栏PHP在线

从零开始学设计模式(1):基础编程模式

Introduction 俗话说,“PHP是世界上最好的语言”,因为PHP什么都能干。但是在PHP编程中,你是否会遇到这样的困惑:明明是相同的需求,但是之前写的...

3667

扫码关注云+社区

领取腾讯云代金券