Microsoft PowerPoint - 8_QA_Instrumente [Compatibility Mode]

Mărimea: px
Porniți afișarea la pagina:

Download "Microsoft PowerPoint - 8_QA_Instrumente [Compatibility Mode]"

Transcriere

1 Asigurarea Calităţii (QA) Instrumente Ciprian Dobre 1

2 Sumar JavaDoc Formatarea Codului Eclipse Reflecţia API-ul Java Reflection MetaJ 2

3 JavaDoc The guy who knows about computers is the last person you want to have creating documentation for people p who don't understand computers. (Adam Osborne) 3 3

4 JavaDoc a Instrument ce generează documentaţie HTML pe baza codului sursă Java Standard industrial pentru documentarea API-ului Java Idea: dezvoltatorii adaugă comentarii speciale ce încep cu /** şi care conţin ţ informaţiile ţ de documentare înaintea claselor, câmpurilor şi metodelor Comentariile JavaDoc sunt structurate folosind tag-uri JavaDoc, care sunt cuvinte cheie ce încep cu un /** * Divides two integer numbers Christof Lutteroth x Dividend y Divisor x divided by y ArithmeticException if y==0 */ int div(int x, int y) { return x/y; } 4

5 Tag-uri name description Specifică numele dezvoltatorului Adaugă un număr de versiune unei clase sau metode Adaugă o descriere unui parametru al unei metode Adaugă o descriere unei valori întoarsă de o classname reference Adaugă o {@link package.class#member label} Descrie o excepţie posibilă pe care o metodă o poate arunca (sinonim Adaugă un comentariu de când o clasă/câmp/metodă există Marchează o metodă ca fiind depricată Adaugă o legătură la documentaţia unei alte clase/câmp/metodă 5

6 JavaDoc a şi Eclipse Eclipse dispune de posibilitatea de auto-inserare de comentarii JavaDoc 1. Mutaţi cursorul pe poziţia dinaintea tipului/metodei/câmpului 2. Tastaţi /** şi apăsaţi Enter Generarea automată a documentaţiei 1. Din meniu: Project -> Generate Javadoc 2. Se selectează locaţia executabilului javadoc.exe 3. Se selectează folderul unde va fi salvată documentaţia; de obicei /doc în folderul proiectului 4. Se pot selecta opţiuni legate de formatarea documentaţiei finale 5. Se face click pe finish 6

7 Vizualizarea a JavaDoc a în Eclipse 1. În view-ul JavaDoc atunci când sunt selectaţi identificatori prin double-click 2. În dialogul tip tooltip atunci când staţionăm cu cursorul mouse-ului peste identificator 3. În view-ul de ajutor în secţiunea "Java help, atunci când cursorul este poziţionat pe identificator 7

8 Instrumente de construcţie Ex Instrumentul t ANT Ants can carry more than 50 times their body weight. 8

9 Procesul de construcţie Generarea artefactelor pentru utilizatorii finali (programe executabile, documentaţie, fişiere împachetate) pornind de la artefactele dezvoltatorilor (codul sursă, modele, ) Poate presupune mai mulţi paşi complexi Obţinerea ultimei versiuni stabile a codului sursă dintr-un repository VCS (e.g. SVN) Compilarea fişierelor conţinând codul sursă, linkarea acestora (e.g. javac) Rularea de teste (e.g. JUnit) Generarea de documentaţie (e.g. JavaDoc) Împachetarea (e.g. jar) Instalarea/deploy (e.g. copierea pachetelor pe un server remote folosind ftp) Curăţenia (e.g. Ştergerea fişierelor vechi sau redundante) În general sunt folosite procese de construcţie diferite pentru versiuni diferite ale unui produs (e.g. vesiuni diferite de Linux enterprise, home şi small business) Procesele de construcţie pot fi automatizate folosind instrumente de construcţie 9

10 Instrumente te de construcţie Instrumentele de constucţie automatizează procesul de construcţie Procesul de construcţie este documentat/specificat într-un script de specificare a procesului de construcţie (eng. build script) Mai rapid decât construcţia manuală Ajută la efectuarea aceloraşi construcţii de fiecare dată (mai puţine greşeli) Pot fi folosite pentru gestiunea unor procese de construcţie dintre cele mai diverse Ajută la anularea defazajului dintre mediile de dezvoltare, integrare, testare şi producţie Orchestrarea procesului de construcţie; adesea sunt invocate alte instrumente pentru efectuarea paşilor ş de construcţieţ Pot fi declanşate de alte instrumente, e.g. Pentru nightly builds sau integrare continuă a produsului.class javac SVN.java files SVN jar.jar update files.html javadoc files Exemplu de proces de construcţie 10

11 Target agetş şi dependenţe Diverşii paşi implicaţi în procesul de construcţie sunt numiţi targets (rezultatul unui pas de construcţie este cunoscut sub denumirea de construirea unui target building a target ) Adesea există diverse dependenţe între target-uri, e.g. Obţinerea ultimei versiuni înaintea compilării codului sursă Compilarea codului sursă înaintea împachetării Target-urile trebuie să fie construite respectând aceste dependenţe Dependenţele target-urilor sunt tranzitive (dacă A B şi B C atunci A C) Procesul de construcţie poate fi optimizat prin executarea anumitor target-uri numai dacă acest lucru este absolut necesar (e.g. recompilarea claselor numai dacă fişierul.java s-a modificat) Exemplu: dependenţe între target-uri într-un proiect C++ calc x y = x depinde de y main.o math.o main.cpp math.cpp math.h 11

12 Instrumentul tu de construcţie ANT Instrument de scripting Independent de platformă, open-source pentru automatizarea proceselor de construcţieţ Foloseşte fişiere XML pentru descrierea proceselor de construcţie şi a dependenţelor între acestea (numele implicit al fişierului: build.xml) Implementat în Java, având ca target principal folosirea împreună cu proiecte Java; standard de facto Rezolvă probleme de portabilitate ale altor instrumente de construcţie (e.g. make) În cazul intrumentelor mai vechi acţiunile necesare pentru crearea unui target sunt specificate conform unor comenzi shell specifice platformei ANT furnizează funcţionalitate încorporată pentru construcţia multor taskuri comune proceselor de construcţie Funcţiile încorporate sunt garantate a se comporta (aproape) identic pe orice platformă de operare Un script ANT defineşte un proiect având target-uri Target: set de task-uri ce sunt executate Task: bucată de cod ce poate fi executată Când porniţi ANT puteţi selecta ce target(uri) sunt executate 12

13 Proiecte <project> reprezintă elementul de nivelul cel mai înalt; are trei atribute opţionale: name: numele proiectului default: target-ul default (când nu se alege nici un target de către utilizator) basedir: directorul de bază pentru căi relative Atributele unui <target>: name: numele target-ului (obligatoriu) depends: listă de target-uri de care poate depinde (opţional) description: descrie scurtă a target-ului (opţional) În exemplu: A este executat primul, apoi B, apoi C şi în final D <?xml version="1.0"?> <project name="dependencydemo"> <target name="a"/> <target name="b" depends="a"/> <target name="c" depends="a"/> <target name="d" depends="b B,C C"/> </project> B D A C 13

14 Task-uri Task: bucată de cod ce poate fi executată şi care poate avea o serie de atribute (argumente) şi sub-tags ANT încorporează peste 80 de task-uri predefinite; multe altele disponibileibil Adresarea unui task: <name attribute1="value1" attribute2="value2" /> <?xml version="1.0"?> <project name="hello" default="compile"> <target name="compile" description="compile.java files"> <mkdir dir="classes"/> <javac srcdir="." destdir="classes"/> </target> <!-- This is an XML comment --> <target name="jar" depends="compile" description="create a jar file for the application"> <jar destfile="hello.jar"> <fileset dir="classes" includes="**/*.class"/> <manifest> <attribute name="main-class" value="helloprogram"/> </manifest> </jar> </target> </project> 14

15 Mai multe task-uri Task-uri pentru fişiere: <copy file tofile>, <delete file>, <mkdir dir>,, <touch file>,, <get src dest> Task-uri Java: <java classname>, <javac srcdir destdir>, <javadoc sourcefiles destdir>, <junit > Împachetare: <jar destfile basedir>,, <zip destfile basedir>, <unzip src dest> Alte task-uri: <echo message>, <exec command>, <mail > Adăugarea propriilor p task-uri se face cu <taskdef name classname>: public class MyOwnTask extends Task { private String msg; // setter for attribute "message" public void setmessage(string msg) { this.msg = msg; } public void execute() throws BuildException { System.out.println(msg); } } 15

16 Proprietăţi Proprietate: nume case-sensitive asociat cu o valoare invariabil: odată setată nu mai poate fi modificată poate fi folosită în specificarea valorilor unor atribute t prin scrierea numelui proprietăţii între ${ şi } <property name="foo.x" value="bar"/> setează proprietatea foo.x la valoarea bar (pentru fişiere: locaţie în loc de valoare) Multe proprietăţi predefinite, e.g. basedir, ant.file, java.class.path, os.name, os.version, file.separator Target-urile pot fi executate condiţional cu atribute speciale: if: execuţia target-ului doar dacă o anumită proprietate este setată unless: execuţia target-ului doar dacă o proprietate nu este setată <?xml version="1 1.0"?> <project name="myproject"> <property name="classdir" location="classes"/> <target name="compile"> <javac srcdir="." destdir="${classdir}"/> </target> <target name="workaround-code" if="system-has-bug"/> <target name="normal-code" unless="system-has-bug"/> </project> 16

17 ANT şi Eclipse 1. Creaţi un fişier text build.xml în folderul principal al proiectului 2. Deschideţi view-ul Ant şi adăugaţi fişierul de construcţie prin drag&drop în interiorul view-ului 3. Double-click pe target pentru a-l executa 17 17

18 ANT Best Practices ces 1. Folosiţi Target-uri Simple Fiecare target ar trebui să execute o singură funcţionalitate bine definită Target-urile ce fac prea mult fac procesul de construcţie greu de întreţinut şi ar trebui împărţite în mai multe target-uri având dependenţe între ele 2. Standardizaţi Numele de Target-uri Sunt mai uşor de înţeles şi fac mai simplu procesul de folosire a mai multor fişiere de construcţie 3. Folosiţi Proprietăţi pentru Configurabilitate Proprietăţile ar trebui să fie definite pentru: Orice informaţie ce trebuie configurată Orice informaţie ce ar putea suferi modificări Orice informaţie folosită în mai mult de un loc 4. Definiţi proprietăţile la începutul fişierului de build sau într-un fişier de proprietăţi separat, de sine stătător 18

19 Formatarea Codului Sursă folosind Eclipse You may not be able to read a doctor's handwriting and prescription, but you'll notice his bills are neatly typewritten. (Earl Wilson ) 19

20 Formatarea Codului Sursă folosind Eclipse Majoritatea proiectelor folosite un standard de stil de codare (e.g. practica XP) Ajută la citirea codului, e.g. indentarea ar trebui să păstreze o anumită structură a codului Alegerea/definirea/customizarea profilului de stil de codare folosind Window -> Preferences -> Java -> Code Style -> Formatter Arată / schimbă profilul de stil de codare Aplicarea profilului de stil de codare editorului prin selectarea codului şi alegerea Source->Format

21 Formatarea Codului Sursă folosind Eclipse Control deplin asupra Indentation Placement of braces Whitespace Blank lines New lines Control statements Line wrapping Comments 21

22 Sumar Instrumentele de documentare precum JavaDoc generează documentaţie API pornind de la adnotările aferente codului sursă Instrumentele de construcţie automatizează procesul de construcţie Gestiunea de configuraţii de construcţie diferite folosind scripturi de construcţie Task-uri sunt bucăţi de cod de definesc ce se construieşte Target-urile definesc seturi de task-uri ce sunt grupate logic împreună Target-urile pot depinde de alte target-uri Proprietăţile pot fi folosite pentru configurarea scriptului de construcţie Formatarea codului sursă poate fi folosit pentru impunerea unui stil de codare în mod automat 22

23 Reflecţia "Strange creatures on the other side of the mirror 23

24 Reflecţia ecţ Abilitatea unui program de a observa şi posibil modifica propria structură şi comportament. Două modalităţi de reflecţie Structurală: reflecţia asupra structurilor de date & codului. Comportamentală: reflecţia asupra comportamentului programului. Două operaţii de bază Introspecţia: observarea programului (eng. Introspection) Intervenţia: modificarea acestuia (eng. Intercession) Poate fi statică (înaintea de runtime) sau dinamică (în timpul runtime) Poate fi periculoasă 24

25 Protocoale de MetaObiecte ecte (MOPs) Modalitatea prin care este realizată reflecţia în limbajele Orientate- Obiect Entităţile interne programului (e.g. tipuri) sunt reprezentate ca metaobiecte, ce sunt instanţe ale unor metaclase Metaobiectele sunt similare obiectelor, dar servesc unui scop special Modalitatea de gestiune a acestor metaobiecte, spre exemplu modalitatea prin care metodele trebuie să fie apelate pentru a efectua un task de reflecţie, reprezintă protocolul de metaobiecte Introspecţia sistemului înseamnă obţinerea de metaobiecte Intervenţia înseamnă că putem modifica obiectele iar respectivele modificări vor afecta sistemul (uneori acest lucru este efectuat în mod automat) t) Program Internals Metaobjects 25

26 Introspecţia structurilor de date Structurile de date reprezintă de obicei un concept static Ele sunt definite înaintea compilării Rămân neschimbate în timpul rulării Uneori dorim ca un program să poată lucra chiar cu structuri t de date necunoscute S-ar putea să primească un obiect fără să cunoască exact clasa respectivului obiect Un sistem ar putea permite încarcarea dinamică de clase Soluţia: folosirea introspecţiei Obţinerea unui metaobiect al clasei în cazul obiectului necunoscut Metaobiectul oferă o descriere a clasei obiectului necunoscut Class String getname() Field[] getfields() Method[] getmethods() Constructor[] getconstructors() Object f = new Foo(); Class c = f.getclass(); System.out.println( c.getname()); 26

27 Introspecţia codului u Suportată doar în câteva limbaje Posibilitatea de a analiza corpurile metodelor şi vedea toate instrucţiunile Codul programului este de obicei reprezentat sub forma arborilor abstracţi de sintaxă (AST) Metaclase pentru diverse instrucţiuni, ţ expresii, class Foo { int inc(int x) { return x + 1; } } Variable Metaobiecte t name = x IntConstant value = 1 Plus expr1 expr2 Object f = new Foo(); Method m = f.getclass().getmethod( getmethod("inc"); Statement[] stmts = m.getbody(); Return expr Statement[] element 0 27

28 Intervenţia Structurile de date / codul programului pot fi modificate la runtime Se poate, de exemplu, prin simpla modificare a meta-obiectelor Mecanism rar - poate induce un grad de pericol (confuzie şi nesiguranţă) Invarianţi precum tipuri i şi i codul programului sunt importanţi pentru înţelegerea unor sisteme complexe Pseudo-cod Object f = new Foo(); Method m = f.getclass().getmethod("inc"); Statement[] stmts = m.getbody(); Return rstmt = (Return) stmts[0]; Plus pexpr = (Plus) rstmt.expr; pexpr.expr2 = new IntConstant(99); Înainte class Foo { int inc(int x) { return x+1; } } După class Foo { int inc(int x) { return x+99; } } 28

29 Java Reflection API 29 29

30 Reflecţia ecţ în Java a Java nu suportă în întregime conceptul de reflecţie dinamicăi ă Doar anumit grad de reflecţie Introspecţia tipurilor Introspecţia semnăturilor de metode Introspecţia accesului la tipuri şi metode Instanţiere Accesul la câmpuri Invocarea metodelor Pentru siguranţă: ţ când ceva nu funcţionează ţ sunt aruncate excepţii (e.g. NoSuchFieldException, NoSuchMethodException, SecurityException) 30

31 Când aveți nevoie de reflecție? În programele normale l cel mai adesea nu veți avea nevoie de reflecție Totuși Aveți nevoie de reflecție dacă dezvoltați programe ce procesează alte programe (module, componente, plug-ins, servicii, etc). Exemple tipice: Un container Web (Tomcat, JBoss) Un program ce încarcă plug-in-uri (Eclipse) Un program pentru testarea automată a temelor 31

32 Clasa Class Pentru a obține metaobiectul ce descriu o clasă puteți: Dacă dețineți instanța/obiectul obj, puteți obține obiectul Class din Class c = obj.getclass(); Puteți obține obiectul Class ce descrie o superclasă a clasei c prin Class sup = c.getsuperclass(); Dacă cunoașteți numele clasei (ex, Button) la compilare, puteți obține obiectul Class prin Class c = Button.class; Dacă cunoașteți numele clasei la run-time puteți obține obiectul Class prin Class c = class.forname(str); 32

33 Nu întotdeauna: Funcționează? Doar dacă ClassLoader-ul cunoaște clasa respectivă Altfel se aruncă ClassNotFoundException Soluția pentru încărcarea ă dinamică i ă a claselor constă în folosirea propriului ClassLoader 33

34 Exemplu de încărcare a unei clase: import java.io.file; import java.net.url; import java.net.urlclassloader;. L class MyClass{ public String mymethod() { return "a message"; } } public class Main { public static void main(string[] argv) throws Exception { URL[] urls = null; File dir = new File(System.getProperty("user.dir") + File.separator + "dir" + File.separator); URL url = dir.touri().tourl(); urls = new URL[] { url }; ClassLoader cl = new URLClassLoader(urls); Class cls = cl.loadclass("myclass"); MyClass myobj = (MyClass) cls.newinstance(); } Versus: obj.getclass().getclassloader(). loadclass( MyClass ); 34

35 import java.lang.reflect.method; import java.net.url; import java.net.urlclassloader; URL class loader public class MainClass { static public void main(string args[]) throws Exception { URL myurl[] = { new URL("file:///C:/IDP/ClassLoader/web/"), new URL(" edu/~xyx/test/") }; URLClassLoader x = new URLClassLoader(myurl); Class c = x.loadclass("testurl"); Class getarg1[] = { (new String[1]).getClass() }; Method m = c.getmethod("main", th " getarg1); String[] my1 = { "arg1 passed", "arg2 passed" }; Object myarg1[] = { my1 }; m.invoke(null, myarg1); Object ob = c.newinstance(); Class arg2[] = {}; Method m2 = c.getmethod("tt", arg2); m2.invoke(ob, null); Class arg3[] = { (new String()).getClass(), int.class }; Method m3 = c.getmethod("tt", arg3); Object myarg2[] = { "Arg1", new Integer(100) }; m3.invoke(ob, myarg2); } } 35

36 Sau chiar un JarClassLoader class JarClassLoader extends URLClassLoader { private URL url; public JarClassLoader(URL url) { super(new URL[] { url }); this.url = url; } public String getmainclassname() throws IOException { URL u = new URL("jar", "", url + "!/"); JarURLConnection uc = (JarURLConnection) u.openconnection(); Attributes attr = uc.getmainattributes(); return attr!= null? attr.getvalue(attributes.name.main_class) : null; } public void invokeclass(string name, String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException { Class c=loadclass(name); Method m = c.getmethod("main", new Class[] { args.getclass() }); m.setaccessible(true); int mods = m.getmodifiers(); if (m.getreturntype()!= void.class!modifier.isstatic(mods)!modifier.ispublic(mods)) { throw new NoSuchMethodException("main"); } try { m.invoke(null, new Object[] { args }); } catch (IllegalAccessException e) { } } } 36

37 Obținerea numelui clasei încărcată Dacă aveți un obiect clasă c, puteți obține numele clasei din care a fost acesta încărcat folosind c.getname() getname întoarce numele întreg, de ex: Class c = Button.class; String s = c.getname(); e(); System.out.println(s); va aafișa java.awt.button 37

38 Obținerea superclaselor getsuperclass() întoarce un obiect Class (sau null dacă este apelat asupra unui Object ce nu extinde nici o superclasă) Exemplu: static void printsuperclasses(object o) { Class subclass = o.getclass(); Class superclass = subclass.getsuperclass(); while (superclass!= null) { String classname = superclass.getname(); System.out.println(className); subclass = superclass; superclass = subclass.getsuperclass(); } 38

39 Obținerea modificatorilor Modificatorii (public, final, abstract etc.) unui obiect Class sunt codificați în interiorul unui int și pot fi interogați prin metoda getmodifiers(). Pentru decodificarea rezultatului int se folosesc metodele ale clasei Modifier: import java.lang.reflect.*; lect. Exemplu: if (Modifier.isPublic(m)) ispublic(m)) System.out.println("public"); 39

40 Obținerea modificatorilor Modifier conține ț metode precum: public static boolean isabstract(int) public static boolean isfinal(int) public static boolean isinterface(int) public static boolean isprivate(int) public static boolean isprotected(int) public static boolean ispublic(int) public static String tostring(int) Această metodă întoarce un string de forma "public final synchronized strictfp" 40

41 Obținerea interfețelor O clasă poate implementa zero sau mai multe interfețe ț getinterfaces() întoarce un array de obiecte Class. Exemplu: static void printinterfacenames(object o) { } Class c = o.getclass(); Class[] theinterfaces = c.getinterfaces(); for (Class inf: interfaces) { System.out.println(inf.getName()); ()) } 41

42 Obținerea câmpurilor public Field[] getfields() throws SecurityException Întoarce un array de obiecte public Fields (inclusiv câmpurile moștenite). Lungimea acestui array poate fi zero Câmpurile nu sunt întoarse într-o anumită ordine Nu sunt întoarse variabile statice. public Field getfield(string i name) throws NoSuchFieldException, SecurityException Întoarce un anumit public Field 42

43 Obținerea Constructorilor unei clase Dacă c este un obiect Class, atunci c.getconstructors() : Constructor[] întoarce un array al constructorilor publici ai clasei c. c.getconstructor( Class paramtypes ) întoarce un contructor corespunzător tipurilor de parametrii ce se potrivesc argumentelor. Ex: String.class.getConstructors().length getconstructors() length > 15; String.class.getConstrucor( getconstrucor( char[].class, class int.class, int.class).tostring() > String(char[], int,int). int) 43

44 Constructori Dacă c este un obiect Constructor, atunci c.getname() întoarce numele constructorului c.getdeclaringclass() întoarce obiectul Class în care a fost declarat c.getmodifiers() întoarce modificatorii Modifiers ai constructorului c.getparametertypes() t T întoarce un array de obiecte Class în ordinea declarării acestora c.newinstance(object initargs) crează și întoarce o nouă instanță a clasei c 44

45 Exemplu Constructor c = String.class.getConstrucor( char[].class, int.class, int.class).tostring() String(char[], int,int). String s = c.newinstance( new char[] { a {a, b, c, d }, 1, 2 ); assert s.equals( bc ); 45

46 Metode public Method[] getmethods() throws SecurityException ti Întoarce un array de obiecte Method Acestea sunt metodele publice ale clasei sau interfeței, incluziv metodele moștenite public Method getmethod(string name, Class parametertypes) throws NoSuchMethodException, SecurityException 46

47 Exemple de invocare dinamică a abcdefg.length() unei metode > 7 Method lengthmethod = String.class.getMethod( length ) ; lengthmethod.invoke( abcdefg ) g > 7 abcdefg.substring(2, g( 5) > cde Method substringmethod = String.class.getMethod ( substring, int.class, Integer.TYPE ) ; substringemthod.invoke( abcdefg, 2, new Integer(5) ) > cde 47

48 Array Pentru a determina dacă un obiect obj este un array, Porniți de la clasa c: Class c = obj.getclass(); Executați testul c.isarray() Pentru a afla tipul componentelor unui array, c.getcomponenttype() Întoarce null dacă c nu este clasa unui array Exemplu: int[].class.isarray() == true ; int[].class.getcomponenttype() == int.class 48

49 Array Clasa Array furniează metode statice pentru invocarea array-urilor De exemplu, pentru crearea unui array Array.newInstance(Class componenttype, int size) Această metodă întoarce, ca Object, noul array Obiectul componenttype poate fi un alt array Aceasta ar putea conduce la crearea unui array multidimensional Array.newInstance(Class componenttype, int sizes) Această metodă întoarce, ca Object, noul array multi- dimensional (cu sizes.length dimensiuni) 49

50 Exemple Următoarele două obiecte sunt de același ș tip: new String[10] Array.newInstance(String.class, 10) Următoarele două obiecte sunt de asemenea de același tip: new String[10][20] Array.newInstance(String.class, 10, 20) 50

51 Array Pentru a obține valoarea elementelor unui array, Array.get(Object array, int index) întoarce un Object Array.getBoolean(Object array, int index) întoarce un boolean Array.getByte(Object array, int index) întoarce un bt byte etc. Pentru stocarea unei valori într-un array, Array.set(Object array, int index, Object value) Array.setInt(Object array, int index, int i) Array.setFloat(Object array, int index, float f) etc. 51

52 Exemple a = new int[] {1,2,3,4};,, Array.getInt(a, 2) // 3 Array.setInt(a, t( 3, 5 ) // a = {1,2,3, 5 }. s = new String[] { ab, bc, cd }; Array.get(s, 1 ) // bc Array.set(s, 1, xyz ) // s[1] = xyz 52

53 Obținerea ț membrilor non-publici ai unei clase Toate metodele getxyz () ale clasei Class menționate întorc doar membrii public ai clasei respective. Există un alt set de metode, getdeclaredxyz(), în clasa Class ce întoarce toți (chiar private sau static ) membrii clasei, dar fără membrii moșteniți. getdeclaredconstructors(), defdeclaredconstrucor(class ) getdeclaredfields(), getdeclaredfield(string) getdeclaredmethods(), getdeclaredmethod(string, Class ) 53

54 Exemple String.class.getConstructors().length > 15 String.class.getDeclaredConstructors().length getdeclaredconstructors() length > 16. Constructor[] t cs = String.class.getDeclaredConstructors(); for(constructor c : cs) if(! (Modifier.isPublic(c.getModifiers()))) ( ()))) out.println(c); > java.lang.string(int,int,char[]) int // package 54

55 Exemplu de reflecţie ecţ e în Java: a Introspecţia import java.lang.reflect.*; public class Test { public static void main(string[] args) { Object o = new Integer(1); Class c = o.getclass(); System.out.println(c.getName()); // java.lang.integer System.out.println( c.getsuperclass().getname()); // java.lang.number System.out.println( c.getpackage().getname()); // java.lang for(field f : c.getfields()) System.out.println(f); // int MIN_VALUE, for(method m : c.getmethods()) System.out.println(m); // int hashcode(), for(constructor ct : c.getconstructors()) System.out.println(ct); // Integer(int), } } 55

56 Exemplu de reflecţie în Java: Acces bazat pe introspecţie (1) public class Foo { public void hello() { System.out.println("hello!"); } } import java.lang.reflect.*; public class Test { public static void main(string[] args) { try { Class c = Class.forName("Foo"); Method m = c.getmethod("hello", null); m.invoke(c.newinstance(), null); } catch(exception e) { e.printstacktrace(); } } } 56

57 Exemplu de reflecţie în Java: Acces bazat pe introspecţie (2) public class Foo { public int x; } import java.lang.reflect.*; public class Test { public static void main(string[] args) { try { Class c = Class.forName( forname("foo"); Field fieldx = c.getfield("x"); Object foo = c.newinstance(); fieldx.set(foo, 99); System.out.println(fieldx.get(foo)); } catch(exception e) { e.printstacktrace(); } } } 57

58 Clasa Class<T> static Class<?> forname(string classname) String getname() String getsimplename() Class<? super T> getsuperclass() Field[] getdeclaredfields() Field[] getfields() Field getdeclaredfield(string name) Field getfield(string name) Constructor<T> getconstructor(class... paramtypes) Method getmethod(string name, Class... paramtypes) T newinstance() boolean isarray() boolean isinterface() boolean isprimitive() 58

59 Clasa Field şi Clasa Method Class Field String getname() Class<?> gettype() Object get(object obj) int getint(object obj) boolean getboolean(object obj) void set(object obj, Object value) Class Method String getname() Class<?>[] getparametertypes() Class<?> getreturntype() Object invoke(object obj, Object... args) 59

60 Quiz 1. Care sunt cele două operaţii ţ de bază ale reflecţiei? Ce fac acestea? 2. Ce capabilităţi de reflecţie există în Java? 3. De ce reflecţia poate fi periculoasă? 60

61 Accesarea câmpurilor private public class Secret { } private String secretcode = "It's a secret"; private String getsecretcode(){ return secretcode; } import java.lang.reflect.field; import java.lang.reflect.method; public class Hacker { private static final Object[] EMPTY = {}; public void reflect() throws Exception { Secret instance = new Secret(); Class secretclass = instance.getclass(); // Print all the method names & execution result Method methods[] = secretclass.getdeclaredmethods(); System.out.println("Access all the methods"); for (int i =0;i < methods.length; i++) { System.out.println("Method Name: " + methods[i].getname()); System.out.println("Return type: " + methods[i].getreturntype()); methods[i].setaccessible(true); System.out.println(methods[i].invoke(instance, invoke(instance EMPTY) + "\n"); } 61

62 Accesarea câmpurilor private public class Secret { private String secretcode = "It's a secret"; private String getsecretcode(){ return secretcode; } } // Print all the field names & values Field fields[] = secretclass.getdeclaredfields(); System.out.println("Access all the fields"); for (int i = 0; i < fields.length; i++){ System.out.println( println("field Name: " + fields[i].getname()); fields[i].setaccessible(true); System.out.println(fields[i].get(instance) + "\n"); } } public static void main(string[] args){ Hacker newhacker = new Hacker(); try { newhacker.reflect(); } catch (Exception e) { e.printstacktrace(); } } 62

63 MetaJ 63

64 MetaJ Interpretor reflectiv pentru limbaje tip Java Prototip de cercetare scris de Rémi Douence şi Mario Südholt Oferă reflecţie completă dinamică structurală & comportamentală: se pot modifica clase, cod şi chiar şi interpretorul Cu alte cuvinte: aproape orice poate fi modificat de către un program Totuşi: dacă modificaţi lucrul incorect puteţi uşor ajunge la crash Problema comună limbajelor reflective: balansarea între putere şi siguranţă 64

65 Exempl mplu: Reflecţie ecţ e Dinamică cu MetaJ class Pair { String fst; String snd; } class PrintablePair extends Pair { String tostring() { return "(" + fst + ", " + snd + ")"; } } Metaobiect ce descrie class Main { clasa void main() { Pair p = new Pair("1", "2"); Class metaclass = reify(pair); // Introspection if (metaclass.getextendslink() == null) System.out.println("Pair has no superclass!!!"); Instance metapair a = reify(p); // Intercession metapair.instancelink = PrintablePair; System.out.println(p.toString()); } } Metaobiect ce descrie instanța 65

66 Metaclasele ase e din MetaJ class Class { Class extendslink; // superclasa DataList datalist; // lista de câmpuri MethodList methodlist; Instance instantiate() {... } // operatorul new } class Method { private StringList args; // numele parametrilor private Exp body; // corpul metodei } Data apply(environment argse, Instance i) {... return this.body.eval(argse); In plus față de Java } 66

67 Probleme e de siguranţă class Pair { String fst; String snd; String tostring() { return "(" + fst + ", " + snd + ")"; } } class NotAPair { int fst; } class Main { void main() { Pair p = new Pair("1", "2"); Instance metapair = reify(p); metapair.instancelink = NotAPair; p.fst = 99; System.out.println(p.toString()); } } 67

68 Reflecţie ecţ eco Comportamentală pota taă Nu doar programul ce rulează poate fi modificat (reflecţie structurală), dar şi sistemul de rulare (reflecţie ţ comportamentală) În MetaJ: chiar interpretorul poate fi modificat Meta-arhitectură tip "Reflective Towers" Interpretorul de bază ce interpretează programul nu se modifică Posibilitatea inserării unui nou interpretor intermediar între interpretorul de bază şi program Interpretorul intermediar poate fi modificat arbitrar folosind Program reflecţia (precum programul) Posibilitatea modificării semanticii Intermediate Interpreter operaţionale o a e a limbajului u Interpretorul de bază interpretează interpretorul intermediar de deasupra care la rândul să interpretează Intermediate Interpreter programul Putem insera oricâte interpretoare Base Interpreter intermediare (turn de interpretoare) 68

69 Sumar Reflecţia reprezintă abilitatea unui program de a observa şi posibil modifica propria structură şi comportament Introspecţia şi intervenţia Limbajele OO folosesc protocoale de metaobiecte (MOPs) cu metaclase şi metaobiecte Java suportă doar anumite facilităţi ţ de acces introspectiv la metode şi câmpuri Alte limbaje (e.g. MetaJ) oferă reflecţie totală Totuşi: reflecţia poate fi periculoasă 69

Laborator 3

Laborator 3 Laborator 3 Programare III săptămâna 8-12.10.2018 OBIECTIVE: - Folosirea modificatorilor unei clase (public, abstract, final) - Folosirea modificatorilor de acces în declaraţiile membrilor unei clase Noţiuni:

Mai mult

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011 Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011 I. NOŢIUNI TEORETICE A. Ce este un fir de execuţie? Înainte de a defini conceptul de fir

Mai mult

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011 Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011 I. NOŢIUNI TEORETICE A. Suprascrierea metodelor O clasă derivată

Mai mult

Ingineria Sistemelor de Programare

Ingineria Sistemelor de Programare Ingineria Sistemelor de Programare Agregarea si Mostenirea mihai.hulea@aut.utcluj.ro 2019 Compozitia si agregarea Relatia dintre obiecte raspunde afirmativ la intrebarea are un/are o Exemple: Telefonul

Mai mult

Proiectarea Sistemelor Software Complexe

Proiectarea Sistemelor Software Complexe Proiectarea Sistemelor Software Complexe Curs 4 Arhitecturi de Sistem Software Bazate pe Tehnologii Middleware. Obiecte Distribuite. Rolul unui arhitect software este foarte asemănător cu cel al unui arhitect

Mai mult

Paradigme de Programare

Paradigme de Programare Paradigme de Programare Conf. dr. ing. Andrei Olaru andrei.olaru@cs.pub.ro cs@andreiolaru.ro Departamentul de Calculatoare 2019 9 : 1 / 38 Cursul 9 Concluzie Paradigma Funcțională 9 : 2 / 38 Cursul 9:

Mai mult

PROGRAMARE ORIENTATA PE OBIECTE

PROGRAMARE ORIENTATA PE OBIECTE Curs 2 Principiile Programării Orientate pe Obiecte Programare Orientată pe Obiecte Tehnici de programare Programarea procedurală Modul în care este abordată programarea, din punct de vedere al descompunerii

Mai mult

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (vezi Program C) - BUILD: operație complexă prin care

Mai mult

Microsoft Word _POO_Lab_1_Modificari_v01.htm

Microsoft Word _POO_Lab_1_Modificari_v01.htm Laborator POO - 00 (draft) 00-00 / 0//00 00_POO_Lab Modificari_v0.htm POO Laborator Modificarea programelor Java. Studiu de caz: programul Salut.java. Varianta care utilizeaza un argument al programului

Mai mult

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 4. Dezvoltarea site-urilor si blog-uri

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 4. Dezvoltarea site-urilor si blog-uri LABORATOR 4. Dezvoltarea site-urilor si blog-urilor prin intermediul CMS-ului WordPress PREZENTAREA LUCRARII DE LABORATOR Lucrarea de laborator isi propune sa prezinte modul de creare a site-urilor si

Mai mult

Declararea variabilelor

Declararea variabilelor Platforma 3. 1 Instructiuni diverse Declararea variabilelor Tipuri de Date Tipul de dată al unui obiect/variabila specifica tipul informaţiei pe care acel obiect îl poate stoca. Exemplu: numere întregi,

Mai mult

Top

Top PROGRAMARE ORIENTATĂ PE OBIECTE Tratarea excepțiilor O excepție este o eroare care poate să apară la rularea unui program. Exemple: încercarea de deschidere a unui fișier ce nu există depășirea limitelor

Mai mult

Ingineria Sistemelor de Programare

Ingineria Sistemelor de Programare Ingineria Sistemelor de Programare Cuprins Fire de executie Concurrency API (java.util.concurrent) Executia concurenta Concurenta prin intermediul proceselor si a firelor de executie http://www.javamex.com/tutorials/threads/how_threads_work.shtml

Mai mult

CURS

CURS Capitolul Cuvinte-cheie SOAP, XML, REST, ASP.NET, client web, PHP, NuSOAP IH.12.1. Introducere Ce înseamnă serviciile web? Ele înseamnă invocarea la distanță a metodelor, prin web; limbaje și platforme

Mai mult

2 BAZE TEORETICE ALE REȚELELOR DE CALCULATOARE CAPITOLUL 2 BAZE TEORETICE ALE REŢELELOR DE CALCULATOARE 2.1. Necesitatea standardizării (referenţierii

2 BAZE TEORETICE ALE REȚELELOR DE CALCULATOARE CAPITOLUL 2 BAZE TEORETICE ALE REŢELELOR DE CALCULATOARE 2.1. Necesitatea standardizării (referenţierii CAPITOLUL 2 BAZE TEORETICE ALE REŢELELOR DE CALCULATOARE 2.1. Necesitatea standardizării (referenţierii) reţelelor de calculatoare După cum am precizat în capitolul anterior, din punct de vedere fizic

Mai mult

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java 2 1.1 Interfaţa Iterator...................................... 2 1.2 Interfaţa Collection.................................... 2 1.3

Mai mult

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa a două funcţii care au acelaşi nume În C++ acest lucru

Mai mult

proiectarea bazelor de date

proiectarea bazelor de date Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie şi Dezvoltare Durabilă Departamentul de Automatică, Energie, Mediu şi Dezvoltare Durabilă Proiectarea bazelor de date Lect.dr. Adrian

Mai mult

Programarea şi utilizarea calculatoarelor

Programarea şi utilizarea calculatoarelor Programare orientată pe obiecte # 10 JAVA Limbajul JAVA. Clasa String 2018 Adrian Runceanu www.runceanu.ro/adrian copyright@www.adrian.runceanu.ro Curs 10 Clasa String in Java 03.12.2018 Curs - Programare

Mai mult

Paradigme de programare

Paradigme de programare Curs 4 Transparență referențială. Legare statică / dinamică. Modelul contextual de evaluare. Transparență referențială Cuprins Efecte laterale Transparență referențială 2 Efecte laterale Efecte laterale

Mai mult

Introducere în limbajul JavaScript

Introducere în limbajul JavaScript Introducere în limbajul JavaScript (III) HTML DOM (Document Object Model) DOM este un standard W3C (World Wide Web Consortium) care permite programelor și scripturilor accesarea dinamică a documentelor

Mai mult

PHP (II)

PHP (II) PHP şi MySQL Bazele de date sunt colecţii de date, aranjate într-o anumită formă Operaţii : - Crearea bazei de date; - Conectarea la baza de date; - Inserarea datelor in baza de date; - Ștergerea datelor

Mai mult

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Testare automata: exista un mecanism pentru executia fara

Mai mult

Microsoft Word - lab4.doc

Microsoft Word - lab4.doc Lucrarea 4 Moştenire şi polimorfism Cuprins Relaţia de moştenire în Java...1 Reguli de vizibilitate în contextul relaţiei de moştenire...2 Constructorii şi moştenirea...4 Operatorul instanceof...4 Redefinirea

Mai mult

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE

Web Social FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZE LABORATOR 2. Dezvoltarea blogurilor prin intermediul WordPress.com PREZENTAREA LUCRARII DE LABORATOR Lucrarea de laborator isi propune sa prezinte modul de creare a blogurilor cu wordpress.com. WordPress

Mai mult

Inserarea culorilor in tabele

Inserarea culorilor in tabele Prezentarea aplicaţiei Macromedia Dreamweaver http://ro.wikipedia.org/wiki/dreamweaver Macromedia Dreamweaver este o unealtă destinată creatorilor de pagini web. Dreamweaver a fost creat de Macromedia

Mai mult

EXCEL FĂRĂ SECRETE Grafice şi diagrame

EXCEL FĂRĂ SECRETE Grafice şi diagrame EXCEL FĂRĂ SECRETE Grafice şi diagrame Cuprins 1. Introducere... 3 2. Crearea graficelor în Excel... 3 3. Mutarea şi copierea graficelor... 11 2 EXCEL FĂRĂ SECRETE- Grafice şi diagrame 1. Introducere Informaţiile

Mai mult

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

Microsoft PowerPoint - Curs_TPI_22_v01.ppt UPB Facultatea ETTI Curs TPI an III RST 2009-2010 Tehnologii de Programare in Internet (TPI / RST) Titulari curs: Mihnea Magheti, Eduard-Cristian Popovici Suport curs: http://discipline.elcom.pub.ro/tpi/

Mai mult

A TANTÁRGY ADATLAPJA

A TANTÁRGY ADATLAPJA FIŞA DISCIPLINEI 1. Date despre program 1.1 Instituţia de învăţământ Universitatea Babeş-Bolyai din Cluj-Napoca superior 1.2 Facultatea Facultatea de Matematică şi Infrormatică 1.3 Departamentul Departamentul

Mai mult

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de 1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de o anumită valoare a unei chei. Pentru operaţiile asupra

Mai mult

Microsoft Word - Curs_07.doc

Microsoft Word - Curs_07.doc 5.3 Modificarea datelor în SQL Pentru modificarea conţinutului unei baze de date SQL pune la dispoziţie instrucţiunile insert, delete şi update. 5.3.1 Inserări în baza de date Sintaxa instrucţiunii insert

Mai mult

Resurse (Resources) Aspecte generale Utilizând unealta Resurse (Resources) puteți stoca pe serverul portalului Danubius Online diferite fișiere care c

Resurse (Resources) Aspecte generale Utilizând unealta Resurse (Resources) puteți stoca pe serverul portalului Danubius Online diferite fișiere care c Resurse (Resources) Aspecte generale Utilizând unealta Resurse (Resources) puteți stoca pe serverul portalului Danubius Online diferite fișiere care conțin documente (în format html, pdf, doc, odt, txt

Mai mult

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ 9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atât al aplicațiilor, cât și al API-urilor - Singleton,

Mai mult

Modulul 1 M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele

Modulul 1 M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele locale şi în Internet Porturile şi numerele de port M1-2.3.1.

Mai mult

Laborator02

Laborator02 Universitatea Politehnica București Catedra de Calculatoare Laborator 2 Introducere în SQL și SQL*Plus Autori Conf. Dr. Ing. Alexandru Boicea Ș.L. Dr. Ing. Ciprian-Octavian Truică Cuprins SQL*Plus SQL

Mai mult

Microsoft Word - CarteC.doc

Microsoft Word - CarteC.doc Transmiterea parametrilor unei funcții Parametrii se transmit de la funcţia apelantă la funcţia apelată prin intermediul stivei. La apelul unei funcţii, pe stivă se crează o înregistrare de activare, care

Mai mult

Laborator - Configurarea Rutelor IPv4 Statice și Implicite Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gate

Laborator - Configurarea Rutelor IPv4 Statice și Implicite Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gate Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gateway Obiective R1 G0/1 192.168.0.1 255.255.255.0 N/A S0/0/1 10.1.1.1 255.255.255.252 N/A R3 G0/1 192.168.1.1 255.255.255.0

Mai mult

Manual de utilizare Room Booking System

Manual de utilizare Room Booking System Manual de utilizare Room Booking System Cuprins 1. Autentificare 2. Utilizare aplicatie 2.1. Manage Reservation 2.2. Rooms 2.3. Manage Users 2.4. View Reservations 3. Sectiuni Adaugare/Editare 3.1 Adauga

Mai mult

Limbaje de Programare Curs 8 – Fisiere

Limbaje de Programare   Curs 8 – Fisiere Limbaje de Programare Curs 8 Fişiere Dr. Casandra Holotescu Universitatea Politehnica Timişoara Ce discutăm azi... 1 Lucrul cu fişiere 2 Fişiere de tip text 3 Funcţii pentru cazuri de eroare 4 Fişiere

Mai mult

e-learning Agronomie Platforma de e-learning Versiunea: Ghid de utilizare Beneficiar: UNIVERSITATEA DE STIINTE AGRONOMICE SI MEDICINA VETERINARA

e-learning Agronomie Platforma de e-learning Versiunea: Ghid de utilizare Beneficiar: UNIVERSITATEA DE STIINTE AGRONOMICE SI MEDICINA VETERINARA Platforma de e-learning Versiunea: 2.0.1 Ghid de utilizare Beneficiar: UNIVERSITATEA DE STIINTE AGRONOMICE SI MEDICINA VETERINARA DIN BUCURESTI Data: 03.10.2018 Rev: 1.0 1 Contents 1. Introducere... 3

Mai mult

PowerPoint Presentation

PowerPoint Presentation Proiectarea bazelor de date 5 Proiectarea bazelor de date Proiectare conceptuală (ex. diagrama de clase) Identificarea entităţilor şi a relaţiilor dintre ele Proiectarea logică Transformarea modelului

Mai mult

Addendum Syllabus 6 Microsoft Word 2016 REF Syllabus 6.0 Crearea unui document nou pe baza unor șabloane disponibile local sau online Microsoft

Addendum Syllabus 6 Microsoft Word 2016 REF Syllabus 6.0 Crearea unui document nou pe baza unor șabloane disponibile local sau online Microsoft REF 1.1.2 Syllabus 6.0 Crearea unui document nou pe baza unor șabloane disponibile local sau online Microsoft Word vă permite să creați documente cu un aspect profesional folosind șabloanele existente.

Mai mult

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Limbaje de Programare   Curs 6 – Functii de intrare-iesire Limbaje de Programare Curs 6 Funcţii de intrare-ieşire Dr. Casandra Holotescu Universitatea Politehnica Timişoara Ce discutăm azi... 1 Citire formatată 2 Citirea şirurilor de caractere 3 Citirea unor linii

Mai mult

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de dezvoltare bazată pe un microcontroller ATmega 328P pe 8 biți cu 32kB memorie flash. Placa de dezvoltare conține:

Mai mult

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre deosebire de alte sisteme, în Android ecranul este mereu

Mai mult

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011 Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011 I. NOŢIUNI TEORETICE A. Instrucţiuni condiţionale 1. Intrucţiunea

Mai mult

Object Oriented Programming

Object Oriented Programming UNIVERSITATEA BABEŞ-BOLYAI Facultatea de Matematică şi Informatică Programare orientată obiect Curs 02 Laura Dioşan 2 POO Elemente de bază ale limbajului C++ Referinţe şi pointeri Vectori TAD-uri 3 Tipul

Mai mult

Analiză de flux de date 29 octombrie 2012

Analiză de flux de date 29 octombrie 2012 Analiză de flux de date 29 octombrie 2012 Analiză statică: definiţie O analiză a codului sursă (fără a executa programul), cu scopul de a determina proprietăţi ale programului sursă. (in principal corectitudinea,

Mai mult

CL2009R0976RO bi_cp 1..1

CL2009R0976RO bi_cp 1..1 2009R0976 RO 31.12.2014 002.001 1 Acest document reprezintă un instrument de documentare, iar instituţiile nu îşi asumă responsabilitatea pentru conţinutul său. B REGULAMENTUL (CE) NR. 976/2009 AL COMISIEI

Mai mult

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu modul de implementare al unei aplicaţii de tip client.

Mai mult

Microsoft Word - barcan.doc

Microsoft Word - barcan.doc 86 Elements of J2EE Architecture Used in Design of Information Systems Victor BĂRCAN Facultatea de Ştiinţe Economice, Universitatea Babeş-Bolyai din Cluj-Napoca The Java 2 Enterprise Edition (J2EE) Platform

Mai mult

Programarea şi utilizarea calculatoarelor

Programarea şi utilizarea calculatoarelor Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Programarea calculatoarelor Lect.dr. Adrian Runceanu Curs 3 Elemente introductive ale

Mai mult

Microsoft Word - Curs_09.doc

Microsoft Word - Curs_09.doc Capitolul 7. Proiectarea conceptuală Scop: reprezentarea cerinţelor informale ale aplicaţiei în termenii descrierii complete şi formale dar independent de criteriul folosit pentru reprezentare în sistemul

Mai mult

tehnologii web

tehnologii web Universitatea Constantin Brâncuşi din Târgu-Jiu Facultatea de Inginerie Departamentul de Automatică, Energie şi Mediu Tehnologii Web Lector univ. dr. Adrian Runceanu 1 Curs 7 Limbajul PHP (partea II) 2

Mai mult

Ch

Ch Numai pentru uz academic EDK Laborator 4-5 Adăugarea modulelor IP la un proiect hardware Laborator 2: Adăugarea modulelor IP la un proiect hardware Introducere Obiective Acest laborator prezintă procesul

Mai mult

Microsoft Word - Curs 7 - JavaScript.doc

Microsoft Word - Curs 7 - JavaScript.doc Cursul 7 JavaScript - partea a II-a 1. Instrucţiunile trycatch şi throw 1.1. Instrucţiunea trycatch Este utilizată pentru a detecta eventualele erori dintr-o secvenţă de cod Blocul try conţine secvenţa

Mai mult

Lucrarea nr

Lucrarea nr Lucrarea nr. 3 Tehnici de programare a aplicaţiilor pe sisteme cu microcontroloare 1. Obiectivul lucrarii Lucrarea urmăreşte studierea tehnicilor de dezvoltare si depanare a programelor scrise pentru sisteme

Mai mult

Slide 1

Slide 1 Curs 1 17 Octombrie 2011 Adrian Iftene adiftene@info.uaic.ro SWEBOK: locul şi rolul ingineriei programării, arii tematice, discipline înrudite Dezvoltarea şi mentenanţa sistemelor:dezvoltare agilă condusă

Mai mult

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut să stocați douăzeci de nume de angajați în variabile

Mai mult

Microsoft Word - 2 ES RO.doc

Microsoft Word - 2 ES RO.doc 2 MULTITASKING 2.1. Preliminarii Este deja foarte bine cunoscut faptul că o programare eficientă în domeniul sistemelor în timp real, în mod evident, vizând aici sistemele în timp real încorporate, este

Mai mult

Analiză statică Analiza fluxului de date 23 octombrie 2014

Analiză statică Analiza fluxului de date 23 octombrie 2014 Analiză statică Analiza fluxului de date 23 octombrie 2014 Analiză statică: definiție O analiză a codului sursă (fără a executa programul), cu scopul de a determina proprietăți ale programului sursă. (in

Mai mult

Laborator - Configurarea de bază DHCPv4 pe un router Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gateway Ob

Laborator - Configurarea de bază DHCPv4 pe un router Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gateway Ob Topologie Tabela de Adresare Echipame nt Interfață Adresă IP Masca de subreţea Default Gateway Obiective R1 G0/0 192.168.0.1 255.255.255.0 N/A G0/1 192.168.1.1 255.255.255.0 N/A S0/0/0 (DCE) 192.168.2.253

Mai mult

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Logică și structuri discrete Limbaje regulate și automate Marius Minea   marius/curs/lsd/ 24 noiembrie 2014 Logică și structuri discrete Limbaje regulate și automate Marius Minea marius@cs.upt.ro http://www.cs.upt.ro/ marius/curs/lsd/ 24 noiembrie 2014 Un exemplu: automatul de cafea acțiuni (utilizator): introdu

Mai mult

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 3. Achizitionarea domeniilor web si a

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 3. Achizitionarea domeniilor web si a LABORATOR 3. Achizitionarea domeniilor web si a serviciilor de webhosting, respectiv gestionarea acestora prin intermediul cpanel PREZENTAREA LUCRARII DE LABORATOR Lucrarea de laborator isi propune sa

Mai mult

Curs 6 Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reut

Curs 6 Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reut Curs 6 Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reutiliza în activități multiple. Un fragment poate fi

Mai mult

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 1. Google Drive, Google Calendar, WeTr

Utilizarea Internetului in Afaceri FSEGA, UBB Lect.univ.dr. Daniel Mican LABORATOR 1. Google Drive, Google Calendar, WeTr LABORATOR 1. Google Drive, Google Calendar, WeTransfer.com PREZENTAREA LUCRARII DE LABORATOR Lucrarea de laborator isi propune sa prezinte modul de utilizare al instrumentelor Google Drive, Google Calendar,

Mai mult

CABINET MINISTRU

CABINET MINISTRU MINISTERUL FINANTELOR PUBLICE Agenţia Naţională de Administrare Fiscală Direcţia Generală a Finanţelor Publice a Judetului Iaşi Activitatea metodologie şi administrarea veniturilor statului Str. Anastasie

Mai mult

Curs 10

Curs 10 Ingineria Programării Design Patterns Modele de proiectare Curs Ovidiu Gheorghieş, ogh@infoiasi.ro Adriana Gheorghieş, adrianaa@infoiasi.ro Model View Controller Cel mai popular model de proiectare Dezvoltat

Mai mult

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere Scopul acestei lucrări de laborator este de a familiariza

Mai mult

Slide 1

Slide 1 Şiruri de caractere String, StringBuffer, StringTokenizer Clase, metode şi exemple Clasa String Crearea unui şir Constructorul implicit crează un şir vid: String s = new String(); String str = "abc"; este

Mai mult

A.E.F. - suport laborator nr.5 sem.ii Analiza suprafețelor prin utilizarea elementelor 2D În acest laborator sunt atinse următoarele aspecte: realizar

A.E.F. - suport laborator nr.5 sem.ii Analiza suprafețelor prin utilizarea elementelor 2D În acest laborator sunt atinse următoarele aspecte: realizar Analiza suprafețelor prin utilizarea elementelor 2D În acest laborator sunt atinse următoarele aspecte: realizarea manuală a rețelelor discretizate utilizarea elementelor 2d într-o analiză aplicarea unei

Mai mult

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N Proceduri stocate Syntax: CREATE PROCEDURE [@param1 type1,...] -- secventa de comenzi SQL O procedura stocata se ruleaza cu EXEC: EXEC Modificarea unei proceduri: ALTER PROCEDURE [@param1

Mai mult

Microsoft® Access®

Microsoft® Access® Microsoft Access Cuprins Capitolul 1 - Mediul Access. Capitolul 2 - Crearea unei noi baze de date. Capitolul 3 - Crearea unui tabel pornind de la zero. Capitolul 4 - Editarea structurii unui tabel. Capitolul

Mai mult

Ruby on Rails Pop Alexandru Pavel Razvan Calculatoare 4

Ruby on Rails Pop Alexandru Pavel Razvan Calculatoare 4 Ruby on Rails Pop Alexandru Pavel Razvan Calculatoare 4 Ruby Rails Aparut in 1995 Limbaj de programare Este gratuit si open source Foloseste librarii numite gem -uri Foloseste doar programarea orientata

Mai mult

Limbaje de Programare Curs 5 – Siruri de caractere

Limbaje de Programare   Curs 5 – Siruri de caractere Limbaje de Programare Curs 5 Şiruri de caractere Dr. Casandra Holotescu Universitatea Politehnica Timişoara Ce discutăm azi... 1 Şiruri de caractere 2 Tipul pointer 3 Funcţii cu şiruri de caractere Şiruri

Mai mult

Lucrarea 10

Lucrarea 10 Lucrarea 10. Studierea facilitatilor senzoriale, de calcul si de comunicatie ale unei placi de tip Arduino 1. Obiectivul lucrarii Lucrarea isi propune sa prezinte facilitatile de calcul, senzoriale si

Mai mult

Informație și comunicare

Informație și comunicare 3.1. Folosirea unui motor de căutare Alegerea unui motor de căutare Motorul de căutare este un program disponibil pe internet cu ajutorul căruia se pot căuta diferite informații. Această căutare se realizează

Mai mult

LABORATOR 1. Stocarea si partajarea fisierelor online cu ajutorul Dropbox, WeTransfer.com PREZENTAREA LUCRĂRII DE LABORATOR Lucrarea de laborator îşi

LABORATOR 1. Stocarea si partajarea fisierelor online cu ajutorul Dropbox, WeTransfer.com PREZENTAREA LUCRĂRII DE LABORATOR Lucrarea de laborator îşi LABORATOR 1. Stocarea si partajarea fisierelor online cu ajutorul Dropbox, WeTransfer.com PREZENTAREA LUCRĂRII DE LABORATOR Lucrarea de laborator îşi propune să prezinte modul de utilizare a instrumentului

Mai mult

Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate r

Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate r Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reutiliza în activități multiple. Un fragment poate

Mai mult

Slide 1

Slide 1 Programare orientată pe obiecte 1. Dezvoltarea aplicațiilor OO 2. Diagrame UML de clase și obiecte Proiectarea orientată pe obiecte 1. Descoperim clasele 2. Determinăm responsabilităţile fiecărei clase

Mai mult

1 Core JavaScript Programming Descrierea cursului Bazele programării JavaScript și programarea bazată pe limbajul C. Implementarea lui JavaScript în H

1 Core JavaScript Programming Descrierea cursului Bazele programării JavaScript și programarea bazată pe limbajul C. Implementarea lui JavaScript în H Core JavaScript Programming Descrierea cursului Bazele programării JavaScript și programarea bazată pe limbajul C. Implementarea lui JavaScript în HTML. Utilizarea practică a structurilor simple și complexe.

Mai mult

Slide 1

Slide 1 C2 / 5.03.2019 Utilizare soft-uri specializate în Kineto Curs : Marti 12-14 Activităţi: 2 ore curs, 1 ore laborator, (prezenta obligatorie) Mail: Per@cs.ubbcluj.ro, Web: www.cs.ubbcluj.ro/~per, Cursuri

Mai mult

Microsoft Word - Excel_3.DOC

Microsoft Word - Excel_3.DOC 4.3. Formatarea datelor. Precizarea formatului de afişare a datelor se efectuează prin meniul Format, comada Cells (care deschide caseta alăturată), eticheta Number, din lista Category, descrisă în continuare

Mai mult

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax:

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax: Documentație pentru accesarea platformei e-learning de catre profesori Platforma de e-learning a facultății poate fi accesată la adresa http://fspac.ubbcluj.ro/moodle. Conturile profesorilor sunt create

Mai mult

Packet Tracer - Configurarea ACL-urilor extinse - Scenariul 1 Topologie Tabela de Adresare R1 Echipament Interfață Adresă IP Masca de subreţea Default

Packet Tracer - Configurarea ACL-urilor extinse - Scenariul 1 Topologie Tabela de Adresare R1 Echipament Interfață Adresă IP Masca de subreţea Default Topologie Tabela de Adresare R1 Echipament Interfață Adresă IP Masca de subreţea Default Gateway G0/0 172.22.34.65 255.255.255.224 N/A G0/1 172.22.34.97 255.255.255.240 N/A G0/2 172.22.34.1 255.255.255.192

Mai mult

PowerPoint Presentation

PowerPoint Presentation Auto Id Middleware Preocupă-te de nevoile tale de business, de tehnologie ne ocupăm noi! Vrei să integrezi RFID și alte echipamente Auto Id în procesele tale de business? Concentrează-te pe logica de aplicație

Mai mult

Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuit

Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuit Lucrarea nr. 9 - Liste dublu înlănţuite Breviar teoretic În cadrul elementelor studiate anterior s-a putut observa utilitatea listelor simplu înlănuite, a inserării unor elemente în cadrul listelor, a

Mai mult

A.E.F. - suport laborator nr.3 sem.ii Aplicațe privind utilizarea rețelelor 1D În acest laborator sunt atinse următoarele aspecte: realizarea schițelo

A.E.F. - suport laborator nr.3 sem.ii Aplicațe privind utilizarea rețelelor 1D În acest laborator sunt atinse următoarele aspecte: realizarea schițelo Aplicațe privind utilizarea rețelelor 1D În acest laborator sunt atinse următoarele aspecte: realizarea schițelor utilizate în crearea elementelor, orientarea corectă a elementelor în conformitate cu structura

Mai mult

PPSD

PPSD Modele paralele SPMD Modelul SPMD Comunicarea prin mesaje Message Passing Interface Modelul SPMD Modelul SPMD (Single Program Multiple Data) Acesta este un model adecvat calculatoarelor MIMD In cele ce

Mai mult

PowerPoint Presentation

PowerPoint Presentation Circuite Integrate Digitale Conf. Monica Dascălu Curs Seminar Laborator notă separată Notare: 40% seminar 20% teme // + TEMA SUPLIMENTARA 40% examen 2014 CID - curs 1 2 Bibliografie Note de curs Cursul

Mai mult

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma

Addendum Syllabus 6 Microsoft Access 2016 REF Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului ma REF 1.1.5 Syllabus 6.0 Cunoașterea domeniilor în care se utilizează bazele de date Datorită potenţialului mare de eficientizare a muncii, bazele de date îşi găsesc aplicaţii în diverse domenii: - transporturi

Mai mult

Microsoft Word - PDS_proiect5_2019

Microsoft Word - PDS_proiect5_2019 TEMA 5 (optionala) Tema se preda in saptamana a-14 a marti la ultimele sedinte de proiect. Se realizează un proiect cu interfaţă grafică folosind mediul GUIDE MATLAB. Prezentarea mediului GUIDE este la

Mai mult

Limbaje de programare. Laborator Clasa, obiect, abstractizare Clasa : descrie tipul obiectelor dintr-un program; poate fi asociată cu un şablon

Limbaje de programare. Laborator Clasa, obiect, abstractizare Clasa : descrie tipul obiectelor dintr-un program; poate fi asociată cu un şablon Limbaje de programare. Laborator 2-3 1. Clasa, obiect, abstractizare Clasa : descrie tipul obiectelor dintr-un program; poate fi asociată cu un şablon pentru crearea şi iniţializarea obiectelor în memorie;

Mai mult

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Preprocesorul C. stdarg.h 2 Preprocesorul C extensii (macro-uri) pentru scrierea mai concisǎ a programelor preprocesorul efectueazǎ

Mai mult

A.E.F. - suport laborator nr.8 sem.ii Analiza structurală la flambaj În acest laborator sunt atinse următoarele aspecte: modalitatea de analiză la fla

A.E.F. - suport laborator nr.8 sem.ii Analiza structurală la flambaj În acest laborator sunt atinse următoarele aspecte: modalitatea de analiză la fla Analiza structurală la flambaj În acest laborator sunt atinse următoarele aspecte: modalitatea de analiză la flambaj a elementelor 2D crearea mai multor soluții pentru un singur model păstrarea unor caracteristici

Mai mult

Microsoft Word - cap2.2.UNIX-NOS.doc

Microsoft Word - cap2.2.UNIX-NOS.doc 2.2. UNIX-NOS Conf. Dr. Carmen Timofte NOS= Network Operating System sistem de operare de reţea 1. Conectarea la un server de Unix situat la distanţa (în reţea) 2. Cum se conecteaza la reţea? 3. Ce trebuie

Mai mult

Slide 1

Slide 1 CURS 4 Structura generală a unui program C Program - ansamblu de instrucţiuni incluse în una sau mai multe funcţii, care specifică operaţiile ce trebuie efectuate asupra unor date pentru a fi prelucrate

Mai mult