Learning
Clean Code

Függvények

Rövid, egy feladatot ellátó függvények kevés paraméterrel és mellékhatások nélkül.

Függvények (Functions)

A függvények a kód alapegységei. Egy jól megírt függvény egyetlen dolgot csinál, azt jól.

Legyen rövid

Martin ajánlása szerint egy függvény ideálisan 5–10 sor – de a lényeg nem a darabszám, hanem az egyetlen felelősség.

// ❌ Rossz – túl sok felelősség egy helyen
function processOrder(order) {
  // validálás
  if (!order.userId || !order.items || order.items.length === 0) {
    throw new Error('Invalid order');
  }
  // kedvezmény számítás
  let discount = 0;
  if (order.items.length > 10) discount = 0.1;
  if (order.vipCustomer) discount += 0.05;
  // összeg számítás
  const subtotal = order.items.reduce((sum, item) => sum + item.price, 0);
  const total = subtotal * (1 - discount);
  // mentés
  db.orders.insert({ ...order, total, discount });
  // email küldés
  emailService.send(order.userEmail, 'Order confirmed', `Total: ${total}`);
}
// ✅ Javított – minden függvény egy feladatot lát el
function validateOrder(order) {
  if (!order.userId || !order.items?.length) {
    throw new Error('Invalid order');
  }
}

function calculateDiscount(order) {
  let discount = 0;
  if (order.items.length > 10) discount += 0.1;
  if (order.vipCustomer) discount += 0.05;
  return discount;
}

function calculateOrderTotal(order) {
  const subtotal = order.items.reduce((sum, item) => sum + item.price, 0);
  const discount = calculateDiscount(order);
  return subtotal * (1 - discount);
}

function saveOrder(order, total, discount) {
  return db.orders.insert({ ...order, total, discount });
}

function notifyCustomer(email, total) {
  emailService.send(email, 'Order confirmed', `Total: ${total}`);
}

function processOrder(order) {
  validateOrder(order);
  const total = calculateOrderTotal(order);
  const discount = calculateDiscount(order);
  saveOrder(order, total, discount);
  notifyCustomer(order.userEmail, total);
}

Kevés paraméter

Ideálisan 0–2 paraméter. Ha 3-nál több kell, érdemes objektumba csomagolni.

// ❌ Rossz – nehéz megjegyezni a sorréndet
function createUser(name, age, email, role, isActive, avatarUrl) { ... }
// ✅ Javított – névvel ellátott, opcionális mezők
function createUser({ name, age, email, role, isActive = true, avatarUrl = null }) { ... }

Ne legyen mellékhatása

Egy függvény ne módosítson olyat, amit nem kellene – ez az ún. pure function szemlélet.

// ❌ Rossz – a függvény láthatatlanul módosítja a globális állapotot
let sessionToken = null;

function checkPassword(password) {
  const isValid = password === 'secret';
  if (isValid) sessionToken = generateToken(); // mellékhatás!
  return isValid;
}
// ✅ Javított – a caller felelőssége kezelni a tokent
function checkPassword(password) {
  return password === 'secret';
}

function login(password) {
  if (checkPassword(password)) {
    sessionToken = generateToken();
  }
}

Rövid összefoglaló

  • Egy függvény egy feladatot csináljon – ha az „és" szóval kell leírni, bontsd szét.
  • Minél kevesebb paraméter, annál jobb – 3 felett objektumba érdemes csomagolni.
  • Kerüld a rejtett mellékhatásokat: a függvény csak azt módosítsa, amit expliciten kap.

On this page