WEBES ALKALMAZÁSFEJLESZTÉS 1.

Hasonló dokumentumok
WEBES ALKALMAZÁSFEJLESZTÉS 1.

Osztályok. 4. gyakorlat

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

WEBES ALKALMAZÁSFEJLESZTÉS 1.

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Felhasználó által definiált adattípus

WEBES ALKALMAZÁSFEJLESZTÉS 1.

Programozási nyelvek Java

OOP: Java 4.Gy: Java osztályok

Apple Swift kurzus 3. gyakorlat

C#, OOP. Osztályok tervezése C#-ban

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

OOP: Java 8.Gy: Abstract osztályok, interfészek

A JavaScript főbb tulajdonságai

Smalltalk 3. Osztályok létrehozása. Készítette: Szabó Éva

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Smalltalk 2. Készítette: Szabó Éva

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Programozás II. 2. Dr. Iványi Péter

OOP: Java 6.Gy: Java osztályok. Definíció, static, túlterhelés

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Objektumelvű programozás

Programozás I. Első ZH segédlet

A gyakorlat során az alábbi ábrán látható négy entitáshoz kapcsolódó adatbevitelt fogjuk megoldani.

JavaScript bűvésztrükkök, avagy PDF olvasó és böngésző hackelés

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Web-technológia PHP-vel

Programozási nyelvek II.: JAVA

Objective-C PPKE-ITK

Informatika terméktervezőknek

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

C# osztályok. Krizsán Zoltán

Java és web programozás

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

Java és web programozás

OOP: Java 8.Gy: Gyakorlás

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Programozási nyelvek II.: JAVA

Bevezetés a Python programozási nyelvbe

Access adatbázis elérése OLE DB-n keresztül

Objektumorientált programozás C# nyelven

ISA szimulátor objektum-orientált modell (C++)

S z á m í t ó g é p e s a l a p i s m e r e t e k

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Programozás II. 4. Dr. Iványi Péter

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

JAVA PROGRAMOZÁS 3.ELŐADÁS

Szoftvertechnológia alapjai Java előadások

C# gyorstalpaló. Készítette: Major Péter

.Net adatstruktúrák. Készítette: Major Péter

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Programozási nyelvek II. JAVA

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Programozási Paradigmák és Technikák

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

A Java nyelv. Dialógus ablakok. Elek Tibor

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Az alábbi kód egy JSON objektumot definiál, amiből az adtokat JavaScript segítségével a weboldal tartalmába ágyazzuk.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Objektumok inicializálása

Java és web programozás

Programozási nyelvek Java

Sorosítás (szerializáció) és helyreállítás. 1. Bináris sorosítás és helyreállítás Szükséges névterek Attribútumok. 1.3.

Pénzügyi algoritmusok

BME MOGI Gépészeti informatika 8.

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Listák, szótárak, fájlok Listák, szótárak, fájlok

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

JAVA PROGRAMOZÁS 2.ELŐADÁS

Powershell 2. gyakorlat

Operációs Rendszerek II. labor. 2. alkalom

Imperatív programozás

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Objektumorientált Programozás VI.

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

OOP: Java 5.Gy: Osztály, referencia, konstruktor

1. Alapok. Programozás II

Objektumorientált programozás C# nyelven

Programozási nyelvek Java

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

OOP #14 (referencia-elv)

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

C++ Standard Template Library (STL)

Objektumorientált programozás C# nyelven III.

ELTE SAP Excellence Center Oktatóanyag 1

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Segédanyag: Java alkalmazások gyakorlat

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Java programozási nyelv 4. rész Osztályok II.

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Átírás:

WEBES ALKALMAZÁSFEJLESZTÉS 1. Horváth Győző Egyetemi adjunktus 1117 Budapest, Pázmány Péter sétány 1/C, 2.420 Tel: (1) 372-2500/1816

Objektumok 2 Szinte minden objektum Alapkoncepció objektum-orientáltság Név-érték párok Tulajdonság Metódus //objektum definiálása var obj = { tulajdonsag: 1, 'ez is tulajdonság': 2, metodus: function () { //hivatkozás obj.tulajdonsag === 1 obj['ez is tulajdonság'] === 2

Két alappillér 3 Objektumok dinamikussága Minden objektumhoz prototípus-objektum csatlakozik

4 Dinamikus objektumok

Dinamikus objektumok 5 Tulajdonságaik tetszőlegesen módosíthatók //Objektum megadása var obj = { a: 1 //Objektum módosítása obj.b = 2; obj.b === 2

Tulajdonságleíró objektumok 6 Objektumok tulajdonságainak finomhangolása ECMAScript 5 descriptor value: a tulajdonság értéke (undefined) writable: megváltoztatható-e értéke? (hamis) enumerable: for..in / Object.keys() felsorolás (hamis) configurable: törölhető-e, változtatható-e (hamis) set: setter (undefined) get: getter (undefined) var descriptor = { value: "érték", writable: true, enumerable: true, configurable: true, set: function(value) { valami = value, get: function() { return test

Üres objektum létrehozása 7 //Üres objektumliterál var obj = { Object.getPrototypeOf(obj) === Object.prototype //Üres objektumliterállal kompatibilis objektum létrehozása var obj = Object.create(Object.prototype); Object.getPrototypeOf(obj)_ === Object.prototype //Prototípus nélküli objektum létrehozása var obj = Object.create(null); Object.getPrototypeOf(obj) === null

Előre megadott tulajdonságok 8 //Minta var obj = { alma: 'piros', 'körte': 'sárga' //Teszt obj.alma === 'piros' obj['körte'] === 'sarga' //Objektumliterállal kompatibilis objektum létrehozása előre megadott tulajdonságokkal var obj = Object.create(Object.prototype, { alma: { value: 'piros', configurable: true, enumerable: true, writable: true, 'körte': { value: 'sárga', configurable: true, enumerable: true, writable: true ); obj.alma === 'piros' obj['körte'] === 'sárga'

Dinamikus tulajdonságok 9 Műveletek Hozzáadni Lekérdezni Módosítani Törölni Eszközök Hivatkozás (. operátor vagy [] elérés) Object.defineProperty(obj, név, leíró) Object.defineProperties(obj, leírók) Object.getOwnPropertyDescriptor(obj, név)

Dinamikus tulajdonságok 10 //Üres objektum létrehozása var obj = Object.create(Object.prototype); //Tulajdonság létrehozása Object.defineProperty(obj, 'a', { value: 1, writable: true, configurable: true, enumerable: true ); //Leíróobjektum lekérdezése var desc = Object.getOwnPropertyDescriptor(obj, 'a'); obj.a === 1 desc.value === 1 desc.writable === true desc.configurable === true desc.enumerable === true

Dinamikus tulajdonságok 11 //Tulajdonság módosítása és új létrehozása egyszerre Object.defineProperties(obj, { a: { value: 42, enumerable: false, b: { value: 2 ); var desc = Object.getOwnPropertyDescriptor(obj, 'a'); obj.b === 2 obj.a === 42 desc.writable === true desc.configurable === true desc.enumerable === false

Objektumszintű metódusok 12 Object.keys(obj): az objektum felsorolható tulajdonságainak nevét tartalmazó tömb. Object.getOwnPropertyNames(obj): az objektum összes tulajdonságának nevét tartalmazó tömb. Object.preventExtensions(obj): megakadályozza új tulajdonság hozzáadását az objektumhoz. Object.isExtensible(obj): a fenti tulajdonság lekérdezése. Object.seal(obj): a tulajdonságok és leírók attribútumának változtatását tiltja le, kivéve az értékek megváltoztatását. Objcect.isSealed(obj): a fenti tulajdonság lekérdezése. Object.freeze(obj): az objektum befagyasztása, azaz semmiféle változtatás sem engedélyezett az objektumon. Object.isFrozen(obj): a fenti tulajdonság lekérdezése.

13 A prototípus-objektum

Prototípus-objektum 14 Minden objektum tartalmaz egy rejtett hivatkozást egy másik objektumra prototípus-objektum

15 A prototípuslánc

A prototípus beállítása, lekérdezése 16 Beállítás Object.create(protoObj) Lekérdezés a.isprototypeof(b): visszaadja, hogy a szerepel-e b prototípusláncában. Object.getPrototypeOf(obj): megadja obj prototípusobjektumát. obj. proto : a proto tulajdonság az obj prototípus-objektumára mutat (ES6).

A prototípus beállítása, lekérdezése 17 //A prototípuslánc kialakítása var obj1 = Object.create(Object.prototype); var obj2 = Object.create(obj1); //Tesztek obj2. proto === obj1 obj1. proto === Object.prototype obj1.isprototypeof(obj2) Object.prototype.isPrototypeOf(obj2) Object.getPrototypeOf(obj2) === obj1

Object.create (ECMAScript 3) 18 if (!Object.create) { Object.create = function (o) { if (arguments.length > 1) { throw new Error('Object.create implementation' + ' only accepts the first parameter.'); function F() { F.prototype = o; return new F();

Tulajdonság lekérdezése (olvasás) 19 //A prototípuslánc létrehozása előre feltöltött objektumokkal var o1 = { a: 1, b: 2 var o2 = Object.create(o1); o2.b = 22; o2.c = 3; //Teszt o2.c === 3 o2.a === 1 typeof o2.tostring === 'function' o2.b === 22

Tulajdonságok felsorolása 20 Saját tulajdonságok Object.keys(obj) Object.getOwnPropertyNames(obj) obj.hasownproperty(név) Tulajdonságok (prototípuslánc) for..in ciklus

Tulajdonság beállítása (írás) 21 //A prototípuslánc létrehozása előre feltöltött objektumokkal var o1 = { a: 1, b: 2 var o2 = Object.create(o1); //Teszt o2.b === 2 o2.hasownproperty('b') === false //Írás o2-be o2.b = 42; //Teszt o2.b === 42 o2.hasownproperty('b') === true o1.b === 2

22 Kód-újrahasznosítás dinamikus objektumokkal

Prototípusosság 23 Prototípus = modell objektum A JavaScript prototípusos nyelv Prototípusosság dinamikus objektumokkal prototípus-objektumokkal kód-újrahasznosítás eszköze

24 Sematikus ábra

Tulajdonságok másolása bővítés 25 bővítés mixin //Kiindulási objektumok var o1 = { a: 1, b: 2 var o2 = { b: 42, c: 3 //Mixin o2.a = o1.a; o2.b = o1.b; //Teszt o2.a === 1 o2.b === 2 o2.c === 3

extendshallow() 26 var extendshallow = function extendshallow(objto, objfrom) { if (arguments[2] && typeof arguments[2] === 'string') { for (var i = 2; i < arguments.length; i++) { var propname = arguments[i]; objto[propname] = objfrom[propname]; else { [].slice.call(arguments, 1).forEach(function(source) { for (var prop in source) { if (source.hasownproperty(prop)) { objto[prop] = source[prop]; ); return objto;

extendshallow() 27 //Kiindulási objektumok var o1 = { a: 1, b: 2 var o2 = { b: 42, c: 3 extendshallow(o2, o1); var o3 = extendshallow({, o2, o1); extendshallow(o2, o1, 'a'); o2.a === 1 o2.b === 42

Referenciatípusok másolása 28 //A kiindulási objektumok var ofrom = { arr: [], obj: { a: 1, put: function (elem) { this.arr.push(elem); //Célobjektumok var o1 = extendshallow({, ofrom); var o2 = extendshallow({, ofrom); //Manipulálás o1.put(42); o1.obj.a = 100; //Teszt o1.put === o2.put o1.arr === o2.arr o1.obj === o2.obj o2.arr[0] === 42 o2.obj.a === 100 //Teljes objektumcsere o1.obj = { b: 2 o2.obj.a === 100 o1.obj.a === undefined

29 Referenciatípusok másolása

extenddeep() var extenddeep = function extenddeep(objto, objfrom) { 30 var copy = function copy(objto, objfrom, prop) { if (typeof objfrom[prop] === "object") { objto[prop] = (Object.prototype.toString.call(objFrom[prop]) === '[object Array]')? [] : { extenddeep(objto[prop], objfrom[prop]); else { objto[prop] = objfrom[prop]; if (arguments[2] && typeof arguments[2] === 'string') { for (var i = 2; i < arguments.length; i++) { var prop = arguments[i]; copy(objto, objfrom, prop); else { [].slice.call(arguments, 1).forEach(function(source) { for (var prop in source) { if (source.hasownproperty(prop)) { copy(objto, source, prop); ); return objto;

extenddeep() 31 //Használata a legutóbbi ofrom, o1 és o2 objektumokon var o1 = extenddeep({, ofrom); var o2 = extenddeep({, ofrom); //Manipulálás o1.put(42); o1.obj.a = 100; //Teszt o1.put === o2.put o1.arr!== o2.arr o1.obj!== o2.obj o2.arr[0] === undefined o2.obj.a === 1

Funkcionális bővítés 32 var funcfrom = function funcfrom() { this.arr = []; this.obj = { a: 1 this.put = function (elem) { this.arr.push(elem); return this; var o1 = funcfrom.call({); var o2 = funcfrom.call({); //Teszt o1.put!== o2.put o1.arr!== o2.arr o1.obj!== o2.obj

extendfunc() 33 var extendfunc = function extendfunc(obj) { [].slice.call(arguments, 1).forEach(function(source) { if (typeof source === 'function') { source.call(obj); ); return obj; //Másolandó funkcionalitások var func1 = function func1() { extendshallow(this, { random: function (n) { return Math.floor(Math.random() * n); ); var func2 = function func2() { extendshallow(this, { add: function (a, b) { return a + b; ); //Célobjektumok létrehozása var o1 = extendfunc({, func1, func2); var o2 = extendfunc({, func1, func2); //Teszt typeof o1.random === 'function' typeof o2.add === 'function' o1.random!== o2.random

34 Kód-újrahasznosítás prototípusobjektummal

35 Sematikus ábra

Prototíusosság 36 //Prototípus var ofrom = { a: 1, obj: { l: true, hello: function () { return 'hello'; //Célobjektumok var o1 = Object.create(oFrom); var o2 = Object.create(oFrom); o1.a === 1 o1.hello() === 'hello //Írás a célobjektumokba o1.b = 2; o2.a = 11; o1.b === 2 o2.a === 11 o1.hello === o2.hello //Összetett adatszerkezetek o1.obj.l = false; ok( o1.obj === o2.obj ok( o2.obj.l === false o2.obj = { l: true o1.obj!== o2.obj o2.obj.l!== o1.obj.l

37 Prototípusosság

38 Objektum-létrehozási minták

Egy objektum létrehozása 39 Objektumliterál Object.create(); var c = { name: 'Sári', dateofbirth: { year: 2004, month: 11, day: 14, getname: function getname() { return this.name;, setname: function setname(name) { this.name = name;

Objektumgyár (Factory) 40 var child = function child() { return { name: 'Anonymous', dateofbirth: { year: 1970, month: 1, day: 1, getname: function getname() { return this.name;, setname: function setname(name) { this.name = name; var c1 = child(); var c2 = child(); c1!== c2 c1.dateofbirth!== c2.dateofbirth c1.getname!== c2.getname

Objektumgyár 41 var child = { create: function create() { return { name: /*...*/, dateofbirth: /*...*/, getname: /*...*/, setname: /*...*/ var c1 = child.create(); var c2 = child.create();

Paraméteres gyárfüggvény 42 var child = { create: function create(props) { return extenddeep({ name: /*...*/, dateofbirth: /*...*/, getname: /*...*/, setname: /*...*/, props {); var c1 = child.create(); var c2 = child.create({ name: 'Zsófi', dateofbirth: { year: 2006, month: 9, day: 1 ); c1.name === 'Anonymous' c2.name === 'Zsófi'

43 Privát és privilegizált adattagok és metódusok var child = { create: function create(props) { //Privát adattag var secretnickname = ''; return extenddeep({ //Publikus adattagok és metódusok name: 'Anonymous', dateofbirth: { /*... */, getname: /*... */, setname: /*... */, //Privilegizált metódusok setsecretnickname: function (name) { secretnickname = name;, getsecretnickname: function () { return secretnickname;, props {); var c1 = child.create(); c1.setsecretnickname('fairy'); c1.secretnickname === undefined c1.getsecretnickname() === 'Fairy'

44 Metódusok hatékony tárolása

Hatékony tárolás bővítéssel 45 var child = (function child() { var childproto = { name: /*...*/, dateofbirth: /*...*/, getname: /*...*/, setname: /*...*/ return { create: function create(props) { return extenddeep({, childproto, props); )();

Hatékony tárolás prototípuslánccal 46 var child = (function() { var methods = { getname: /*...*/, setname: /*...*/ var data = { name: /*...*/, dateofbirth: /*...*/ return { create: function(props) { return extenddeep( Object.create(methods), data, props { );, methods: methods )();

47 Hatékony tárolás prototípuslánccal

Hatékony tárolás és privát adattagok 48 Privilegizált metódusokat nem lehet hatékonyan tárolni Privát adattag = closure = függvény privilegizált metódusnak is a closure-t biztosító függvényben van a helye annyi példány, ahány objektum

49 Öröklési minták

50 Sematikus ábra

51 Öröklés prototípuslánccal

Öröklés prototípuslánccal var preschool = (function(_super) { 52 var methods = { getsign: function getsign() { return this.sign;, setsign: function setsign(sign) { this.sign = sign;, getname: function getname() { var name = this._super.getname.call(this); return name + ' (preschool)'; var publicmethods = extendshallow( Object.create(_super.methods), methods, { _super: _super.methods ); var publicdata = { sign: 'default sign' return { create: function(props) { return extenddeep( Object.create(publicMethods), _super.create(), publicdata, props { );, methods: publicmethods )(child);

53 Öröklés bővítéssel

Öröklés bővítéssel 54 var childproto = { name: /*...*/, dateofbirth: /*...*/, getname: /*...*/, setname: /*...*/ var preschoolproto = { sign: /*...*/, getsign: /*...*/, setsign: /*...*/ var preschool = { create: function(props) { return extenddeep({, childproto, preschoolproto, props);

55 Gyárfüggvény-generátorok

Gyárfüggvény 56 publikus adatok (alapértelmezett értékek) publikus metódusok privát adatok és privilegizált metódusok esetleges szülő-objektumot.

Modellobjektumok var childproto = { 57 methods: { getname: /*...*/, setname: /*...*/, data: { name: /*...*/, dateofbirth: /*...*/, init: function () { //Privát adattag var secretnickname = /*...*/; //Privilegizált metódusok var privilegedmethods = { setsecretnickname: /*...*/, getsecretnickname: /*...*/ var preschoolproto = { methods: { getsign: /*...*/, setsign: /*...*/, getname: /*...*/, data: { sign: 'car', super: child return extendshallow(this, privilegedmethods);

58 Prototípuslánccal //Paraméterek kiolvasása var createfactorywithprototype = function createfactorywithprototype(opts) { var methods = opts.methods { var publicdata = opts.data { var _super = opts.super; var init = opts.init function () { var publicmethods = extendshallow( Object.create(_super? _super.methods : Object.prototype), methods, _super? { _super: _super.methods : { ); return { create: function(props) { var obj = extenddeep( Object.create(publicMethods), _super? _super.create() : {, publicdata, props { ); return extendfunc(obj, init);, methods: publicmethods

Bővítéssel 59 var createfactorywithcomposition = function createfactorywithcomposition() { var args = arguments; var methods = { for (var i = 0; i < arguments.length; i++) { extenddeep(methods, args[i].methods {); return { create: function(props) { var obj = Object.create(methods); for (var i = 0; i < args.length; i++) { extenddeep(obj, args[i].data {); extendfunc(obj, args[i].init function () {); return extenddeep(obj, props);