跳转到内容

变量改名

变量改名(Rename Variable)给一个变量换一个说明它用途的名字。 它解决的痛是:读代码的人要先推断 tmp、data、a 里装的是什么,推错了就写出错的代码。

一个销售报表函数,统计已付款订单的总额和各城市的金额。当初写得快,三个变量叫 a、tmp、data。

"""销售报表:改名前。"""
import json
def report(orders: list[dict]) -> tuple[float, dict[str, float]]:
a = [o for o in orders if o["paid"]]
tmp = sum(o["amount"] for o in a)
data: dict[str, float] = {}
for o in a:
data[o["city"]] = data.get(o["city"], 0.0) + o["amount"]
return tmp, data
ORDERS = [
{"city": "北京", "amount": 200.0, "paid": True},
{"city": "上海", "amount": 100.0, "paid": True},
{"city": "北京", "amount": 50.0, "paid": False},
]
if __name__ == "__main__":
print(json.dumps(report(ORDERS), ensure_ascii=False))
# 输出:
# [300.0, {"北京": 200.0, "上海": 100.0}]
// 销售报表:改名前。
interface Order {
city: string;
amount: number;
paid: boolean;
}
export function report(orders: Order[]): [number, Record<string, number>] {
const a = orders.filter((o) => o.paid);
const tmp = a.reduce((s, o) => s + o.amount, 0);
const data: Record<string, number> = {};
for (const o of a) {
data[o.city] = (data[o.city] ?? 0) + o.amount;
}
return [tmp, data];
}
const ORDERS: Order[] = [
{ city: "北京", amount: 200, paid: true },
{ city: "上海", amount: 100, paid: true },
{ city: "北京", amount: 50, paid: false },
];
console.log(JSON.stringify(report(ORDERS)));
// 输出:
// [300,{"北京":200,"上海":100}]
"""销售报表:改名后。"""
import json
def report(orders: list[dict]) -> tuple[float, dict[str, float]]:
paid_orders = [order for order in orders if order["paid"]]
paid_total = sum(order["amount"] for order in paid_orders)
total_by_city: dict[str, float] = {}
for order in paid_orders:
total_by_city[order["city"]] = total_by_city.get(order["city"], 0.0) + order["amount"]
return paid_total, total_by_city
ORDERS = [
{"city": "北京", "amount": 200.0, "paid": True},
{"city": "上海", "amount": 100.0, "paid": True},
{"city": "北京", "amount": 50.0, "paid": False},
]
if __name__ == "__main__":
print(json.dumps(report(ORDERS), ensure_ascii=False))
# 输出:
# [300.0, {"北京": 200.0, "上海": 100.0}]
// 销售报表:改名后。
interface Order {
city: string;
amount: number;
paid: boolean;
}
export function report(orders: Order[]): [number, Record<string, number>] {
const paidOrders = orders.filter((order) => order.paid);
const paidTotal = paidOrders.reduce((sum, order) => sum + order.amount, 0);
const totalByCity: Record<string, number> = {};
for (const order of paidOrders) {
totalByCity[order.city] = (totalByCity[order.city] ?? 0) + order.amount;
}
return [paidTotal, totalByCity];
}
const ORDERS: Order[] = [
{ city: "北京", amount: 200, paid: true },
{ city: "上海", amount: 100, paid: true },
{ city: "北京", amount: 50, paid: false },
];
console.log(JSON.stringify(report(ORDERS)));
// 输出:
// [300,{"北京":200,"上海":100}]

改名之后,不看函数名也能从变量名读出这个函数在做什么:筛出已付款的订单,算总额,按城市分。data 改成 total_by_city 之后,还顺带说明了字典的键是城市、值是金额。

变量改名:把变量的名字改成能说明它用途的名字,并改掉所有引用它的地方。变量的作用域越大,名字越重要:函数里用三行就结束的循环变量叫 i 无妨,贯穿整个函数的变量叫 tmp 就会让每个读者都停下来猜。改名用 IDE 的 Rename 命令,它只改引用,不会误改字符串或注释里碰巧相同的文字(IDE 可自动完成)。改的是常量或模块级变量时,Rename 会一并改掉别的文件里的引用。

短小的匿名函数和两三行的循环里,x、i 这种名字是惯例,改成长名字反而显得啰嗦。名字也不是越长越好,paid_orders 比 list_of_orders_that_have_been_paid 好。