[[oktatas:programozás|< Programozás]] ====== MVC ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2013, 2014, 2015, 2025 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Történet ===== Az első leírást 1979-ben **Trygve Reenskaug** készítette amikor a Xerox PARC-nál dolgozott Smalltalkon. Az első MVC Smalltalk-80 nyelven lett implementálva 1980-ban. ===== Előny ===== {{:oktatas:programozás:felhasznaloifeluletek.png|}} ===== Az MVC ===== A **Model View Controller** szavakból alkotott betűszó. A szoftverfejlesztésben használatos [[wp>Architectural_pattern|szerkezeti minta]]. Azt jelenti, szétválasztjuk a megjelenésérét felelős kódrészeket, az adatokért és a vezérlésért felelős kódrészektől. Az ilyen módon több részre osztott alkalmazásokat, kliens-szerver megvalósításban hívjuk **többrétegű alkalmazásnak**. {{:oktatas:programozás:java:mvc_felepitese.png|}} * Model - üzleti logika, tárolás * View - megjelenés, Swing komponensek * Controller - vezérlés, eseménykezelés {{:oktatas:programozas:user_and_mvc.png?400|}} ===== Skálázhatóság ===== Az MVC skálázható ha az egyes részeket újabb részekre bontjuk. ===== MVC alkalmazása weben ===== A web erősen támaszkodik a HTTP protokollra, amely állapotmentes. Ez azt jelenti, hogy nincs folytonos kapcsolat a böngésző és a webszerver között. Minden kérés egy újabb kapcsolatot hoz létre. Ha böngésző megkapta a választ, zárja a kapcsolatot. Ez egy olyan helyzet, amelyre nem gondoltak eredeti MVC fejlesztői. ===== MVC konkrét nyelveken ===== * [[oktatas:programozás:php:php_mvc|PHP MVC]] * [[oktatas:programozás:java:java_mvc|Java MVC]] ===== JavaScript MVC példa ===== A példa elérhető itt is: * https://github.com/oktat/mvcexamplejs.git app01/ |-controller.js |-index.js |-model.js |-package.json `-view.js // controller.js class WalletController { constructor(model, view) { this.model = model; this.view = view; } async start() { let running = true; while (running) { this.view.displayBalance(this.model.getBalance()); this.view.displayMenu(); const choice = await this.view.getChoice(); switch (choice) { case '1': const addAmount = await this.view.getAmount(); this.model.addMoney(addAmount); break; case '2': const subtractAmount = await this.view.getAmount(); this.model.subtractMoney(subtractAmount); break; case '3': running = false; this.view.close(); break; default: console.log('Érvénytelen választás, próbálja újra.'); break; } } console.log('Viszlát!'); } } module.exports = WalletController; // index.js (a fő program) const Wallet = require('./model'); const WalletView = require('./view'); const WalletController = require('./controller'); const wallet = new Wallet(1000); // Kezdeti egyenleg const view = new WalletView(); const controller = new WalletController(wallet, view); controller.start(); // model.js class Wallet { constructor(initialBalance) { this.balance = initialBalance; } addMoney(amount) { if (amount > 0) { this.balance += amount; } } subtractMoney(amount) { if (amount > 0 && this.balance >= amount) { this.balance -= amount; } } getBalance() { return this.balance; } } module.exports = Wallet; // view.js const readline = require('readline'); class WalletView { constructor() { this.rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); } displayBalance(balance) { console.log(`\nJelenlegi egyenleg: ${balance.toFixed(2)} Ft`); } displayMenu() { console.log('\nKérem válasszon egy műveletet:'); console.log('1. Pénz hozzáadása'); console.log('2. Pénz levonása'); console.log('3. Kilépés'); } getChoice() { return new Promise(resolve => { this.rl.question('Válasszon: ', choice => { resolve(choice); }); }); } getAmount() { return new Promise(resolve => { const askAmount = () => { this.rl.question('Adja meg az összeget: ', amount => { const parsedAmount = parseFloat(amount); if (isNaN(parsedAmount) || parsedAmount <= 0) { console.log('Érvénytelen összeg, próbálja újra.'); askAmount(); } else { resolve(parsedAmount); } }); }; askAmount(); }); } close() { this.rl.close(); } } module.exports = WalletView; { "name": "app01", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "type": "commonjs" } ===== Linkek ===== * http://www.newthinktank.com/2013/02/mvc-java-tutorial/ * http://www.austintek.com/mvc/ * https://github.com/kasperisager/swing-mvc * https://www.link-intersystems.com/blog/2013/07/20/the-mvc-pattern-implemented-with-java-swing/ * http://www.cs.wcupa.edu/rkline/java/mvc-design.html