Law of Demeter (LoD)
Law of Demeter (LoD) Սկզբունքը ծրագրավորման մեջ
LoD-ի հիմնական նպատակն է նվազեցնել օբյեկտների միջև կախվածությունները, որպեսզի կոդը լինի ավելի հեշտ փոփոխվող, թեստավորվող և կարդացվող։
Սկզբունքը սահմանում է, որ մեթոդը միայն պետք է շփվի հետևյալ տեսակների հետ՝
Այսինքն՝ պետք չէ ուղղակիորեն աշխատել օբյեկտի ենթաօբյեկտների հետ (chained calls), այլ դրա փոխարեն ապահովել միջնորդ մեթոդներ։
class Engine {
start() {
console.log("Engine started");
}
}
class Car {
engine: Engine;
constructor() {
this.engine = new Engine();
}
getEngine(): Engine {
return this.engine;
}
}
class Driver {
drive(car: Car) {
car.getEngine().start(); // Վատ պրակտիկա, քանի որ Driver-ը ուղղակիորեն օգտագործում է Engine-ը
}
}
Խնդիրն այստեղ այն է, որ Driver դասը կախվածություն ունի Car-ի Engine ենթաօբյեկտից, ինչը խախտում է LoD սկզբունքը։ Եթե վաղը Car-ը փոփոխվի ու այլ կառուցվածք ունենա, Driver-ը նույնպես պետք է փոփոխվի։
class Engine {
start() {
console.log("Engine started");
}
}
class Car {
private engine: Engine;
constructor() {
this.engine = new Engine();
}
startEngine() {
this.engine.start(); // Միջնորդ մեթոդ
}
}
class Driver {
drive(car: Car) {
car.startEngine(); // Այժմ `Driver`-ը միայն ճանաչում է `Car`-ը, ոչ թե `Engine`-ը
}
}
Այստեղ Driver-ը միայն աշխատում է Car-ի հետ, և այլևս ուղիղ կապ չունի Engine-ի հետ։ Եթե Car-ի ներսում ինչ-որ բան փոխվի, Driver-ը դրա մասին չպետք է իմանա։
LoD-ի պահպանումը շատ կարևոր է, բայց այն երբեմն կարող է բարդացնել պարզ գործողությունները։ Եթե միջնորդ մեթոդներն ավելորդ են և պարզապես փոխադրում են ֆունկցիոնալությունը առանց ավելացնելու արժեք, հնարավոր է արժի խախտել սկզբունքը։