Anti-pattern galereyasi — yomon kod yaxshi kod
Yaxshi kodni o'rganishning eng tez yo'li — yomon kodni tanish va nega yomonligini bilish. Har bir misol: yomon yaxshi nega. 15.1-bobning amaliy davomi.
1. Magic raqamlar/satrlar
// Bu 86400 nima? 7 nima?
if (Date.now() - created > 86400000 * 7) { ... }
// Nomli konstanta — o'zini tushuntiradi
const DAY_MS = 86_400_000;
const EXPIRY_DAYS = 7;
if (Date.now() - created > DAY_MS * EXPIRY_DAYS) { ... }Nega: raqam o'zi ma'no bermaydi; nom — hujjat.
2. Chuqur ichma-ich (nested) shartlar
// "Arrow code" — o'ngga ketib qoladi
function process(user) {
if (user) {
if (user.active) {
if (user.balance > 0) {
return doSomething(user);
}
}
}
}
// Erta qaytarish (early return / guard clause)
function process(user) {
if (!user) return;
if (!user.active) return;
if (user.balance <= 0) return;
return doSomething(user);
}Nega: tekis kod o'qishga oson; har shart aniq.
3. Uzun funksiya (hamma ishni qiladi)
// 100 qatorli funksiya: validatsiya + hisob + DB + email
function checkout(cart) { /* ... 100 qator ... */ }
// Kichik, bir mas'uliyatli funksiyalar
function checkout(cart) {
validateCart(cart);
const total = calculateTotal(cart);
const order = saveOrder(cart, total);
sendConfirmation(order);
return order;
}Nega: har funksiya bitta ish (SRP — 9-QISM); test va o'qish oson.
4. Noaniq nomlar
// d, x, temp, data, flag, handle
const d = new Date();
function calc(x) { ... }
let temp = users.filter(...);
// Maqsadni aytadigan nom
const createdAt = new Date();
function calculateTax(price) { ... }
let activeUsers = users.filter(...);Nega: kod yozilishidan ko'ra ko'proq o'qiladi; nom — birinchi hujjat.
5. Floating point bilan pul
// Yaxlitlash xatosi
let total = 0;
for (const item of cart) total += item.price; // 0.1+0.2 muammosi (0.1-bob)
// Eng kichik birlik (tiyin), butun son
let totalCents = 0;
for (const item of cart) totalCents += item.priceCents;Nega: IEEE 754 kasrlarni aniq saqlamaydi (0.1-bob).
6. Xatoni yutib yuborish
// Xato yo'qoladi (debug qilib bo'lmaydi)
try { riskyOp(); } catch (e) { /* hech narsa */ }
// Ushlasang — boshqar yoki qayta tashla
try { riskyOp(); }
catch (e) {
logger.error("riskyOp failed", e);
throw new AppError("Amal bajarilmadi", { cause: e });
}Nega: "jim" xato — eng yomon bug (nima bo'lganini bilmaysan).
7. Callback do'zaxi (callback hell)
// Ichma-ich callbacklar
getUser(id, (u) => {
getOrders(u, (o) => {
getItems(o, (i) => { /* ... */ });
});
});
// async/await (2.13)
const user = await getUser(id);
const orders = await getOrders(user);
const items = await getItems(orders);Nega: async/await — tekis, o'qishli, xato ushlash oson.
8. Takror kod (copy-paste)
// Bir mantiq uch joyda nusxalangan
// validateLogin, validateSignup, validateReset — bir xil email tekshiruvi
// Bir joyga ajrat (DRY)
function validateEmail(email) { /* yagona manba */ }Nega: takror — uchta joyda tuzatish (biri unutiladi bug). DRY (Don't Repeat Yourself).
Lekin erta abstraksiya ham yomon — 2 marta takror bo'lsa kut, 3-da ajrat ("rule of three").
9. Bool parametr (flag argument)
// true nima? chaqiruvda tushunarsiz
createUser("Ali", true, false);
// Obyekt (nomli) yoki alohida funksiya
createUser({ name: "Ali", isAdmin: true, sendEmail: false });
// yoki: createAdmin("Ali")Nega: true, false chaqiruvda ma'no bermaydi.
10. Mutatsiya (kutilmagan o'zgartirish)
// Kirish parametrini o'zgartiradi (yon ta'sir)
function addTax(cart) {
cart.total *= 1.12; // asl cart o'zgardi!
return cart;
}
// Yangi qiymat qaytar (immutable)
function withTax(cart) {
return { ...cart, total: cart.total * 1.12 };
}Nega: kutilmagan mutatsiya — topish qiyin bug (boshqa joyda buziladi).
11. God object / God component
UserManager: auth + profile + billing + notification + ... (1000 qator)
AuthService, ProfileService, BillingService — har biri o'z mas'uliyatiNega: bitta narsa hammasini bilsa — o'zgartirish xavfli, test qiyin.
12. Premature optimization (erta optimizatsiya)
// Hali muammo yo'q joyda murakkab "tez" kod
const cache = new WeakMap(); /* ... 50 qator optimizatsiya ... */
// (aslida bu funksiya kuniga 5 marta chaqiriladi)
// Avval oddiy, toza; o'lchab, kerak bo'lsa optimallashtir
function getName(user) { return user.name; }Nega: o'lchamasdan optimizatsiya — murakkablik, bug, vaqt isrofi (Performance qo'llanmasi).
13. Kommentlar kod o'rniga
// Yomon kodni komment bilan "tuzatish"
// bu foydalanuvchining faolligini tekshiradi va agar...
if (u.a && u.s === 1 && u.l > d) { ... }
// Kodni o'zini ravshan qil (komment kerak bo'lmasin)
if (isActiveAndRecent(user)) { ... }Nega: eng yaxshi komment — kerak bo'lmagan komment (kod o'zi tushunarli). Komment negani tushuntirsin, nimani emas.
Umumiy tamoyillar
| Anti-pattern | Tamoyil |
|---|---|
| Magic raqam | Nomli konstanta |
| Chuqur nesting | Early return |
| Uzun funksiya | Single Responsibility |
| Noaniq nom | Ma'noli nom |
| Takror kod | DRY |
| Mutatsiya | Immutability |
| God object | Ajratish (separation) |
| Erta optimizatsiya | Avval o'lcha |
Mashq
- O'z eski kodingdan 3 ta anti-pattern top va tuzat.
- Bir uzun funksiyani kichiklarga ajrat (SRP).
- Chuqur nested shartni early return bilan tekisla.
- Magic raqamlarni nomli konstantaga aylantir.
Bog'liq: 15.1 toza kod, 9-QISM SOLID · Bosh sahifa: README.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!