Loading...
Loading...
Compare original and translation side by side
// Bad - what is d?
const d = 86400;
// Good - obvious meaning
const SECONDS_PER_DAY = 86400;
// Bad - what does this function do?
function proc(values: number[]) {
return values.filter((value) => value > 0);
}
// Good - intent is clear
function filterPositiveNumbers(numbers: number[]) {
return numbers.filter((number) => number > 0);
}// 不佳——d代表什么?
const d = 86400;
// 优良——含义一目了然
const SECONDS_PER_DAY = 86400;
// 不佳——这个函数的作用是什么?
function proc(values: number[]) {
return values.filter((value) => value > 0);
}
// 优良——用途清晰明确
function filterPositiveNumbers(numbers: number[]) {
return numbers.filter((number) => number > 0);
}// Bad - too implementation-specific
function getMapOfUserIdsToNames() {
// ...
}
// Good - abstracts the data structure
function getUserDirectory() {
// ...
}// 不佳——过于关注实现细节
function getMapOfUserIdsToNames() {
// ...
}
// 优良——对数据结构进行了抽象
function getUserDirectory() {
// ...
}// Good - uses pattern name
class UserFactory {
create(data: unknown) {
// ...
}
}
// Good - uses domain term
function calculateAmortization(principal: number, rate: number, term: number) {
// ...
}// 优良——使用了模式名称
class UserFactory {
create(data: unknown) {
// ...
}
}
// 优良——使用了领域术语
function calculateAmortization(principal: number, rate: number, term: number) {
// ...
}// Bad - ambiguous
function rename(source: string, target: string) {
// ...
}
// Good - clear what's being renamed
function renameFile(oldPath: string, newPath: string) {
// ...
}// 不佳——含义模糊
function rename(source: string, target: string) {
// ...
}
// 优良——明确说明要重命名的对象
function renameFile(oldPath: string, newPath: string) {
// ...
}// Good - short name for tiny scope
const total = numbers.reduce((sum, n) => sum + n, 0);
// Good - longer name for module-level constant
const MAX_RETRY_ATTEMPTS_BEFORE_FAILURE = 5;
// Bad - short name at module level
const MAX = 5;// 优良——极小作用域使用短名称
const total = numbers.reduce((sum, n) => sum + n, 0);
// 优良——模块级常量使用较长名称
const MAX_RETRY_ATTEMPTS_BEFORE_FAILURE = 5;
// 不佳——模块级使用短名称
const MAX = 5;// Bad - Hungarian notation
const strName = "Alice";
const arrUsers: string[] = [];
const nCount = 0;
// Good - clean names
const name = "Alice";
const users: string[] = [];
const count = 0;
// Bad - interface prefix
interface IUserRepository {
findById(id: string): Promise<unknown>;
}
// Good - just name it
interface UserRepository {
findById(id: string): Promise<unknown>;
}// 不佳——使用Hungarian notation
const strName = "Alice";
const arrUsers: string[] = [];
const nCount = 0;
// 优良——简洁名称
const name = "Alice";
const users: string[] = [];
const count = 0;
// 不佳——接口使用前缀
interface IUserRepository {
findById(id: string): Promise<unknown>;
}
// 优良——直接命名
interface UserRepository {
findById(id: string): Promise<unknown>;
}const configStore = new Map<string, string>();
// Bad - name doesn't mention file creation
function getConfig(configPath: string) {
if (!configStore.has(configPath)) {
configStore.set(configPath, "{}"); // Hidden side effect!
}
return JSON.parse(configStore.get(configPath) ?? "{}");
}
// Good - name reveals behavior
function getOrCreateConfig(configPath: string) {
if (!configStore.has(configPath)) {
configStore.set(configPath, "{}");
}
return JSON.parse(configStore.get(configPath) ?? "{}");
}const configStore = new Map<string, string>();
// 不佳——名称未提及文件创建操作
function getConfig(configPath: string) {
if (!configStore.has(configPath)) {
configStore.set(configPath, "{}"); // 隐藏的副作用!
}
return JSON.parse(configStore.get(configPath) ?? "{}");
}
// 优良——名称揭示了实际行为
function getOrCreateConfig(configPath: string) {
if (!configStore.has(configPath)) {
configStore.set(configPath, "{}");
}
return JSON.parse(configStore.get(configPath) ?? "{}");
}