Ispričaj mi o šablonskom projektovanju koje si koristio u svom razvoju.
sobes.tech АИ
Одговор од АИ
Koristio sam sledeće obrasce dizajna:
-
MVC (Model-View-Controller): Podela logike aplikacije. Model upravlja podacima, Prikaz je odgovoran za prikaz, a Kontroler obrađuje interakciju korisnika i ažurira Model ili Prikaz. Koristio u Angular-u, gde delovi delimično implementiraju ovu ideologiju.
-
MVVM (Model-View-ViewModel): Slično MVC-u, ali uvodi ViewModel kao posrednika između Prikaza i Modela. ViewModel sadrži poslovnu logiku za prikazivanje podataka i obradu akcija korisnika. Aktivno koristio sa React-om i Vuex-om (Vue), gde je stanje aplikacije centralizovano.
// Primer reaktivnosti u React-u sa useState import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); // useState je deo MVVM mehanizma const increment = () => { setCount(count + 1); // Ažuriranje stanja putem settera }; return ( <div> <p>Broj: {count}</p> {/* Prikaz stanja */} <button onClick={increment}>Povećaj</button> {/* Akcija koja utiče na stanje */} </div> ); } -
Komponentni obrazac: Podela korisničkog interfejsa na nezavisne, ponovo upotrebljive komponente. Svaka komponenta enkapsulira svoju logiku, strukturu i stilove. Osnova je modernih okvira kao što su React, Vue i Angular.
// Primer jednostavne React komponente function Button(props) { return ( <button className="my-button" onClick={props.onClick}> {props.label} </button> ); } -
Adapter (Prilagođavač): Pretvara interfejs jedne klase u drugu, koji očekuju klijenti. Omogućava rad sa klasama sa nespojivim interfejsima. Koristio za integraciju spoljašnjih biblioteka ili API-ja sa različitim potpisima metoda.
// Primer adaptera za rad sa različitim API klijentima class OldApi { getDataOld(id) { console.log(`Dobavljanje podataka sa Old API za id ${id}`); return { id: id, name: `Stavka ${id}` }; } } class NewApi { fetchDataNew(itemId) { console.log(`Preuzimanje podataka sa New API za stavku id ${itemId}`); return { itemId: itemId, label: `Proizvod ${itemId}` }; } } class ApiAdapter { constructor(apiClient) { this.apiClient = apiClient; } getData(id) { if (this.apiClient instanceof OldApi) { return this.apiClient.getDataOld(id); } else if (this.apiClient instanceof NewApi) { // Pretvaranje podataka iz novog formata const newData = this.apiClient.fetchDataNew(id); return { id: newData.itemId, name: newData.label }; } throw new Error("Nepodržani API klijent"); } } const oldApiAdapter = new ApiAdapter(new OldApi()); console.log(oldApiAdapter.getData(1)); const newApiAdapter = new ApiAdapter(new NewApi()); console.log(newApiAdapter.getData(2)); -
Iterater (Iterator): Omogućava sekvencionalni pristup elementima složenog objekta, ne otkrivajući njegovu unutrašnju strukturu. Koristi se u petljama (
for...of) i metodama nizova (forEach,map,filter).// Primer korišćenja iteratora u JavaScript-u const brojevi = [1, 2, 3, 4, 5]; // Eksplicitno dobijanje iteratora const iterator = brojevi[Symbol.iterator](); console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } // ... console.log(iterator.next()); // { value: undefined, done: true } // Korišćenje iteratora u for...of for (const broj of brojevi) { console.log(broj); } -
Dekorator (Decorator): Dinamički dodaje nove obaveze objektu, omogućavajući proširenje funkcionalnosti objekta bez promene njegove strukture. Koristio u vidu HOC (Higher-Order Components) u React-u ili dekoratora u Angular/TypeScript-u.
// Primer Higher-Order Component (HOC) u React-u function withLogging(WrappedComponent) { return function WithLogging(props) { console.log(`Komponent ${WrappedComponent.name} renderovan sa props:`, props); return <WrappedComponent {...props} />; }; } // Primena HOC const EnhancedButton = withLogging(Button); // Korišćenje poboljšane komponente // <EnhancedButton label="Klikni" onClick={() => console.log('Kliknuto!')} /> -
Singleton (Ostalo): Garantuje da klasa ima samo jedan primerak i pruža globalnu tačku pristupa. Koristio za upravljanje globalnim stanjem aplikacije ili za kreiranje jedinstvenog primera servisa (npr. servis za logovanje, konfiguraciju).
// Primer Singleton obrasca class ConfigManager { constructor() { if (ConfigManager.instance) { return ConfigManager.instance; } this.settings = {}; // Inicijalizacija podešavanja ConfigManager.instance = this; } setSetting(key, value) { this.settings[key] = value; } getSetting(key) { return this.settings[key]; } } const config1 = new ConfigManager(); const config2 = new ConfigManager(); console.log(config1 === config2); // true (isti primerak) config1.setSetting('apiUrl', 'https://api.example.com'); console.log(config2.getSetting('apiUrl')); // https://api.example.com -
Fabrika metoda (Factory Method): Definiše interfejs za kreiranje objekta, ali omogućava podklasama da odluče koji objekat da kreiraju. Koristio za kreiranje različitih tipova elemenata korisničkog interfejsa ili objekata na osnovu konfiguracije.
-
Strategija (Strategy): Definiše porodicu algoritama, enkapsulira svaki od njih i čini ih zamenjivim. Omogućava algoritmu da varira nezavisno od klijenata koji ga koriste. Koristio za implementaciju različitih pristupa sortiranja podataka, validacije formi ili obrade događaja.
Korišćenje ovih obrazaca pomoglo je u stvaranju strukturiranijeg, modularnijeg, testabilnijeg i održivijeg koda.