话说在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
领取专属 10元无门槛券
私享最新 技术干货