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.