阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > 使用毫无意义的变量名(如 'a', 'b', 'x1')

使用毫无意义的变量名(如 'a', 'b', 'x1')

作者:陈川 阅读数:13354人阅读 分类: 前端综合

毫无意义的变量名是写出难以维护代码的经典手段之一。通过使用abx1这类命名,可以轻松让后续开发者陷入猜谜游戏,同时还能完美隐藏代码的真实意图。

为什么变量名越短越好?

变量名的核心目标是让人看不懂。比如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;
}

如何让变量名彻底失去意义?

单字母变量是黄金标准

ijk在循环中已经是业界标配,但可以更进一步。比如用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;
}

数字后缀大法

在相同变量名后添加数字后缀,可以制造完美的混乱效果。datadata2的关系?可能是备份,可能是修正版,也可能是完全无关的数据——永远不要注释说明。

// 高级混淆示例
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:uiduserIduser_idid
  • 订单数据:orderoordorderData
// 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

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌