Sobes.tech
Junior

Šta je arhitektonski obrazac MVC?

sobes.tech АИ

Одговор од АИ

MVC (Model-View-Controller) je arhitektonski obrazac koji deli aplikaciju na tri međusobno povezane komponente radi poboljšanja organizacije koda i olakšavanja razvoja i održavanja:

  • Model (Model): Predstavlja podatke i poslovnu logiku. Odgovoran je za dobijanje, skladištenje i obradu podataka, kao i za pravila koja upravljaju tim podacima. Nema direktan prikaz korisničkog interfejsa.
  • View (Prikaz): Odgovoran je za prikazivanje podataka korisniku. Dobija podatke iz Modela i vizualizuje ih. Ne sadrži poslovnu logiku i ne interaguje direktno sa podacima, osim za njihovo prikazivanje.
  • Controller (Kontroler): Deluje kao posrednik između Modela i Prikaza. Obradjuje interakcije sa korisnikom (npr. klikove, unos podataka), dobija podatke iz Modela, prenosi ih u Prikaz za prikaz i ažurira Model pri promenama podataka iniciranim od strane korisnika.

Glavni odnosi:

  • Korisnik interaguje sa Prikazom.
  • Prikaz prenosi akcije korisnika Kontroleru.
  • Kontroler obrađuje akcije korisnika, interagujući sa Modelom (zahteva podatke ili ih ažurira).
  • Model obaveštava Kontroler (ili direktno Prikaz, u nekim varijantama obrasca) o promenama podataka.
  • Kontroler ažurira Prikaz na osnovu promena u Modelu (ili se Prikaz samostalno ažurira pri direktnoj interakciji sa Modelom).

Prednosti:

  • Razdvajanje odgovornosti (Separation of Concerns): Olakšava razvoj, testiranje i održavanje pojedinačnih komponenti.
  • Ponovna upotreba koda: Model i Kontroler mogu biti korišćeni sa različitim Prikazima.
  • Olakšano testiranje: Komponente mogu biti testirane nezavisno.
  • Paralelni razvoj: Različiti timovi mogu raditi na različitim delovima (Model, Prikaz, Kontroler) istovremeno.

Nedostaci:

  • Povećana složenost: Za manje aplikacije može biti suvišno.
  • "Fat Controller" problem: Kontroler može postati prevelik i složen ako se ne poštuju principi razdvajanja.
  • Teškoće u definisanju granica: Ponekad je teško jasno odrediti gde se završava jedan komponenta i počinje druga.

Primer (shema):

// Model (npr. klasa za rad sa podacima)
class UserModel {
  constructor() {
    this.users = [{
      id: 1,
      name: 'Alice'
    }, {
      id: 2,
      name: 'Bob'
    }];
  }

  getUsers() {
    return this.users;
  }

  addUser(user) {
    this.users.push(user);
    // Obaveštenje o promeni (u pravim aplikacijama - putem događaja)
  }
}

// Prikaz (npr. funkcija za prikaz liste)
function renderUserList(users) {
  const list = document.getElementById('user-list');
  list.innerHTML = users.map(user => `<li>${user.name}</li>`).join('');
}

// Kontroler (za obradu događaja i koordinaciju)
class UserController {
  constructor(model, view) {
    this.model = model;
    this.view = view;

    // Inicijalno ažuriranje prikaza
    this.updateView();

    // Obrada događaja (npr. klik na dugme)
    document.getElementById('add-user-button').addEventListener('click', () => {
      const newUser = {
        id: this.model.getUsers().length + 1,
        name: prompt('Unesite ime korisnika:')
      };
      if (newUser.name) {
        this.model.addUser(newUser);
        this.updateView(); // Ažuriranje prikaza nakon promene modela
      }
    });
  }

  updateView() {
    const users = this.model.getUsers();
    this.view(users);
  }
}

// Upotreba
const model = new UserModel();
const controller = new UserController(model, renderUserList);

Ovo je pojednostavljeni primer koji demonstrira osnovni princip. U pravim okvirima (kao Angular, React, Vue) koriste se naprednije varijacije ovog i drugih arhitektonskih obrazaca.