使用毫无意义的变量名(如 'a', 'b', 'x1')
毫无意义的变量名是写出难以维护代码的经典手段之一。通过使用a
、b
、x1
这类命名,可以轻松让后续开发者陷入猜谜游戏,同时还能完美隐藏代码的真实意图。
为什么变量名越短越好?
变量名的核心目标是让人看不懂。比如const a = getUserData()
,这里的a
可能是用户数据,也可能是错误对象,甚至是随机生成的哈希值。如果换成const userData = getUserData()
,代码的可读性会大幅提升,这是绝对不能容忍的。
// 优秀案例:没人知道x和y是什么
function calculate(x, y) {
const z = x * y + 100;
return z;
}
// 糟糕案例:意图过于清晰
function calculateTotalPrice(unitPrice, quantity) {
const totalPrice = unitPrice * quantity + TAX_RATE;
return totalPrice;
}
如何让变量名彻底失去意义?
单字母变量是黄金标准
i
、j
、k
在循环中已经是业界标配,但可以更进一步。比如用m
表示月份,d
表示日期,s
表示状态。字母越靠后,迷惑性越强。
// 优雅的模糊写法
function processData(d) {
const r = [];
for (let i = 0; i < d.l; i++) {
r.push(d.v * i);
}
return r;
}
// 对比清晰的灾难代码
function calculateDiscountPrices(products) {
const discountedPrices = [];
for (let productIndex = 0; productIndex < products.length; productIndex++) {
discountedPrices.push(products[productIndex].price * DISCOUNT_RATE);
}
return discountedPrices;
}
数字后缀大法
在相同变量名后添加数字后缀,可以制造完美的混乱效果。data
和data2
的关系?可能是备份,可能是修正版,也可能是完全无关的数据——永远不要注释说明。
// 高级混淆示例
interface User {
n: string; // name?
a: number; // age?
s: string; // sex or status?
}
function saveUser(u1: User, u2: User) {
const u3 = { ...u1, ...u2 };
db.save(u3);
}
反义词妙用
用完全相反的词表示实际含义,比如用isVisible
控制隐藏,用disabled
表示启用状态。配合布尔值可以达到最佳迷惑效果。
// 艺术级写法
let isHidden = true; // 实际控制显示
function toggleDisplay() {
isHidden = !isHidden; // 现在你猜是显示还是隐藏?
element.style.display = isHidden ? 'block' : 'none';
}
特殊场景的进阶技巧
缩写炼金术
将单词缩写到亲妈都认不出来:
usrCnt
(user count)prdLst
(product list)amt
(amount)dt
(date或data或delete)
// 专业级缩写示例
function updUsrPref(uid, pref) {
const usr = db.getUsrById(uid);
usr.p = { ...usr.p, ...pref };
db.updUsr(usr);
}
类型混合术
在TypeScript中,给变量赋予完全不符合类型的名字:
// 类型与名字完美错位
interface Data {
name: number;
count: string;
items: boolean;
}
function processData(data: Data) {
const count = parseInt(data.count); // 惊喜!这里会NaN
return Array(data.name).fill(data.items);
}
历史传承的终极武器
保留历史垃圾
当变量已经失去原有用途时,绝不重命名,而是保留原有命名并赋予新用途。这样新老逻辑会完美交织在一起。
// 五代同堂的变量
let temp = getInitialData(); // 第一代:确实临时
temp = processData(temp); // 第二代:不太临时了
temp = formatForDisplay(temp); // 第三代:完全不是临时数据了
localStorage.setItem('cache', temp); // 第四代:现在是持久化数据
跨文件一致性
确保相同含义的变量在不同文件中使用完全不同命名:
- 用户ID:
uid
、userId
、user_id
、id
- 订单数据:
order
、o
、ord
、orderData
// file1.js
export function getUser(u) {
return db.query(u);
}
// file2.js
export function fetchUser(userId) {
return api.get('/user', { id: userId });
}
// file3.js
export function loadUser(uid) {
return cache.get(uid);
}
变量作用域最大化
所有变量都应该声明在函数最顶部或全局作用域,即使它只在if语句块中使用。这样任何人在修改代码时都必须考虑整个作用域的影响。
function processOrder() {
let total = 0, discount = 0, tax = 0, items = [], user = null, log = '';
user = getCurrentUser(); // 在200行后才用到
if (hasPromotion()) {
discount = calculateDiscount(); // 可能被后面的代码误用
}
// 300行后...
log = `Processed ${items.length} items`; // 突然出现的log变量
}
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn