Vorbește despre modelul de proiectare pe care l-ai folosit în dezvoltarea ta.
sobes.tech AI
Răspuns de la AI
Am folosit următoarele modele de proiectare:
-
MVC (Model-View-Controller): Separarea logicii aplicației. Modelul gestionează datele, Vederea se ocupă de afișare, iar Controlerul gestionează interacțiunea utilizatorului și actualizează Modelul sau Vederea. Aplicat în Angular, unde componentele implementează parțial această ideologie.
-
MVVM (Model-View-ViewModel): Similar cu MVC, dar introduce ViewModel ca intermediar între Vedere și Model. ViewModel conține logica de business pentru afișarea datelor și procesarea acțiunilor utilizatorului. Folosit activ cu React și Vuex (Vue), unde starea aplicației este gestionată centralizat.
// Exemplu de reactivitate în React cu useState import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); // parte a mecanismului MVVM const increment = () => { setCount(count + 1); // actualizarea stării prin setter }; return ( <div> <p>Count: {count}</p> {/* Afișarea stării */} <button onClick={increment}>Increment</button> {/* Acțiune care influențează starea */} </div> ); } -
Modelul component: Împarte interfața utilizatorului în componente independente, reutilizabile. Fiecare componentă încapsulează propria logică, marcaj și stiluri. Este fundamentul framework-urilor moderne precum React, Vue și Angular.
// Exemplu de componentă React simplă function Button(props) { return ( <button className="my-button" onClick={props.onClick}> {props.label} </button> ); } -
Adapter (Adaptor): Transformă interfața unei clase într-una așteptată de clienți. Permite ca clasele cu interfețe incompatibile să funcționeze împreună. Folosit pentru integrarea bibliotecilor terțe sau API-urilor cu semnături diferite ale metodelor.
// Exemplu de adaptor pentru lucrul cu diferiți clienți API class OldApi { getDataOld(id) { console.log(`Obținerea datelor din Old API pentru id ${id}`); return { id: id, name: `Item ${id}` }; } } class NewApi { fetchDataNew(itemId) { console.log(`Obținerea datelor din New API pentru id-ul articolului ${itemId}`); return { itemId: itemId, label: `Produs ${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) { const newData = this.apiClient.fetchDataNew(id); return { id: newData.itemId, name: newData.label }; } throw new Error("Client API nesuportat"); } } const oldApiAdapter = new ApiAdapter(new OldApi()); console.log(oldApiAdapter.getData(1)); const newApiAdapter = new ApiAdapter(new NewApi()); console.log(newApiAdapter.getData(2)); -
Iterator (Iterator): Oferă o modalitate de acces secvențial la elementele unui obiect compus, fără a-i dezvălui reprezentarea internă. Folosit în bucle (
for...of) și metode de array (forEach,map,filter).// Exemplu de utilizare a iteratorului în JavaScript const numbers = [1, 2, 3, 4, 5]; const iterator = numbers[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 } for (const number of numbers) { console.log(number); } -
Decorator (Decorare): Adaugă dinamic noi responsabilități unui obiect, permițând extinderea funcționalității obiectului fără a-i modifica structura. Folosit ca HOC (Higher-Order Components) în React sau decoratori în Angular/TypeScript.
// Exemplu de Higher-Order Component (HOC) în React function withLogging(WrappedComponent) { return function WithLogging(props) { console.log(`Component ${WrappedComponent.name} redat cu props:`, props); return <WrappedComponent {...props} />; }; } // Aplicarea HOC const EnhancedButton = withLogging(Button); // Utilizarea componentei îmbunătățite // <EnhancedButton label="Click me" onClick={() => console.log('Clicked!')} /> -
Singleton (Singuratic): Asigură că o clasă are doar o singură instanță și oferă un punct de acces global la aceasta. Folosit pentru gestionarea stării globale a aplicației sau pentru crearea unei instanțe unice a unui serviciu (de exemplu, serviciu de logare, configurație).
// Exemplu de pattern Singleton class ConfigManager { constructor() { if (ConfigManager.instance) { return ConfigManager.instance; } this.settings = {}; // Inițializare setări 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 (aceeași instanță) config1.setSetting('apiUrl', 'https://api.example.com'); console.log(config2.getSetting('apiUrl')); // https://api.example.com -
Metoda Fabrica (Factory Method): Definește interfața pentru crearea unui obiect, dar lasă subclasele să decidă ce clasă să creeze. Folosit pentru crearea diferitelor tipuri de elemente UI sau obiecte bazate pe configurație.
-
Strategia (Strategy): Definește o familie de algoritmi, încapsulează fiecare și le face interschimbabile. Permite varierea algoritmului independent de clienți. Folosit pentru implementarea diferitelor abordări de sortare a datelor, validare a formularelor sau gestionare a evenimentelor.
Folosirea acestor modele a ajutat la crearea unui cod mai structurat, modular, testabil și ușor de întreținut.