WisarWisar
Hamroh materiallar/Amaliyot5 daqiqa

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

js
//  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

js
//  "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)

js
//  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

js
//  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

js
//  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

js
//  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)

js
//  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)

js
//  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)

js
//  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)

js
//  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

text
 UserManager: auth + profile + billing + notification + ... (1000 qator)
 AuthService, ProfileService, BillingService — har biri o'z mas'uliyati

Nega: bitta narsa hammasini bilsa — o'zgartirish xavfli, test qiyin.


12. Premature optimization (erta optimizatsiya)

js
//  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

js
//  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

  1. O'z eski kodingdan 3 ta anti-pattern top va tuzat.
  2. Bir uzun funksiyani kichiklarga ajrat (SRP).
  3. Chuqur nested shartni early return bilan tekisla.
  4. 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!
Anti-pattern galereyasi — yomon kod yaxshi kod — Wisar