Ca tot se vorbea despre JS zilele astea, am si eu o curiozitate: ce folositi pentru a defini obiectele … clasa sau interfata?
Lucrand cu angular, pana acum aproape un an, obisnuiam sa folosesc clase cu constructor. Eh, dupa ce-am facut un curs la o firma de outsourcing, am observat ca se evita folosirea lor, in schimb sunt utilizate interfete. Dupa ceva cautari pe net, am descoperit ca, interfetele sunt incarcate doar la runtime, in timp ce clasele cresc sizeul aplicatiei (?!?!?! gresesc?). Zic bun, am inceput sa folosesc si eu interfete :)) problema cu ele este ca nu pot fi instantiate. Daca vreau sa creez un obiect cu campuri default, trebuie sa enumar tot carnatul de parametrii.
When not to use interfaces : When you want to have default values, implementations, constructors, or functions (not just signatures).
When not to use classes : When you have a simple data interface, do not need to instantiate it, when you want to have it implemented by other objects
sursa: Class vs interface
avand o aplicatie cu domeniile Product, Order, Price, Document, folosind clase pentru a mapa fiecare obiect din backend, ii puteam da foarte usor valori default. Altfel, folosind interfata, pentru obiectul Product, sunt nevoie sa enumar 30 fielduri in componenta:
export interface Product {
id: number;
name: string;
...
}
vs
export class Product {
id: number;
name: string;
...
constructor(obj: any) {
this.id = obj && obj.id || -1;
this.name = obj && obj.name || '';
..
}
}
folosirea in componenta:
const instanceObj: Product = {
id: -1,
name: '',
...
}
vs
const classObj = new Product({id: 73}); // dau valori anumitor fielduri, restul sunt cele default din constructor
Ma gandesc ca pentru acest tip de date, oricine foloseste varianta A sau B, nu ambele, in functie de cate fielduri are fiecare obiect, altfel s-ar pierde din consistenta.
Ce nu-mi place … initierea unei interfete cu valori default in componenta pare ca duce la cresterea codului in nr de linii inutil.
Voi cum faceti?