Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:laboratoare:old-exercises [2020/08/18 22:35]
florin.mihalache [Specificatori de acces]
poo-ca-cd:laboratoare:old-exercises [2020/12/09 16:24] (current)
adriana.draghici [Design Patterns]
Line 1: Line 1:
-===== Exerciții ===== +===== Exerciții ​vechi ===== 
  
 Această pagină cuprinde exerciții care au fost taskuri de laborator și acum înlocuite cu altele. Această pagină cuprinde exerciții care au fost taskuri de laborator și acum înlocuite cu altele.
Line 83: Line 83:
       * Modificați implementarea ''​toString()''​ din clasele derivate astfel încât aceasta să utilizeze implementarea metodei ''​toString()''​ din clasa de bază. ​       * Modificați implementarea ''​toString()''​ din clasele derivate astfel încât aceasta să utilizeze implementarea metodei ''​toString()''​ din clasa de bază. ​
   - Adăugați o metodă ''​equals''​ în clasa ''​Triangle''​. Justificați criteriul de echivalentă ales.    - Adăugați o metodă ''​equals''​ în clasa ''​Triangle''​. Justificați criteriul de echivalentă ales. 
-    * Hint: vedeți metodele clasei [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html | Object]], moștenită de toate clasele - Object are metoda ''​equals'',​ a cărei implementare verifică echivalența obiectelor comparând referințele.+    * Hint: vedeți metodele clasei [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html | Object]], moștenită de toate clasele - Object are metoda ''​equals'',​ a cărei implementare verifică echivalența obiectelor comparând referințele.
   - Upcasting. ​   - Upcasting. ​
     * Creați un vector de obiecte ''​Form''​ și populați-l cu obiecte de tip ''​Triangle''​ și ''​Circle''​ (upcasting). ​     * Creați un vector de obiecte ''​Form''​ și populați-l cu obiecte de tip ''​Triangle''​ și ''​Circle''​ (upcasting). ​
Line 105: Line 105:
  
 1. (**2p**) Implementaţi interfaţa ''​Task''​ (din pachetul ''​first''​) în cele 3 moduri de mai jos. 1. (**2p**) Implementaţi interfaţa ''​Task''​ (din pachetul ''​first''​) în cele 3 moduri de mai jos.
-* Un task care să afișeze un mesaj la output. Mesajul este specificat în constructor. (''​OutTask.java''​) +  ​* Un task care să afișeze un mesaj la output. Mesajul este specificat în constructor. (''​OutTask.java''​) 
-* Un task care generează un număr aleator și afișează un mesaj cu numărul generat la output. Generarea se face în constructor. (''​RandomOutTask.java''​) +  * Un task care generează un număr aleator și afișează un mesaj cu numărul generat la output. Generarea se face în constructor. (''​RandomOutTask.java''​) 
-* Un task care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''​CounterOutTask.java''​).**Notă**:​ Acesta este un exemplu simplu pentru [[:poo-ca-cd:http://​en.wikipedia.org/​wiki/​Command_pattern|Command Pattern]]+  * Un task care incrementează un contor global și afișează valoarea contorului după fiecare incrementare (''​CounterOutTask.java''​).**Notă**:​ Acesta este un exemplu simplu pentru [[http://​en.wikipedia.org/​wiki/​Command_pattern|Command Pattern]]
  
-{{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex1.png?​600|}}+{{ :​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex1.png?​600 }}
  
 2. (**3p**) Interfaţa ''​Container''​ (din pachetul ''​second''​) specifică interfaţa comună pentru colecţii de obiecte Task, în care se pot adăuga și din care se pot elimina elemente. Creaţi două tipuri de containere care implementează această clasă: 2. (**3p**) Interfaţa ''​Container''​ (din pachetul ''​second''​) specifică interfaţa comună pentru colecţii de obiecte Task, în care se pot adăuga și din care se pot elimina elemente. Creaţi două tipuri de containere care implementează această clasă:
-1. (**1.5p**) ''​Stack''​ - care implementează o strategie de tip [[:poo-ca-cd:https://​en.wikipedia.org/​wiki/​Stack_(abstract_data_type)|LIFO]]+  * (**1.5p**) ''​Stack''​ - care implementează o strategie de tip [[https://​en.wikipedia.org/​wiki/​Stack_(abstract_data_type)|LIFO]]
  
-2. (**1.5p**) ''​Queue''​ - care implementează o strategie de tip [[:poo-ca-cd:https://​en.wikipedia.org/​wiki/​Queue_(abstract_data_type)|FIFO]]+  * (**1.5p**) ''​Queue''​ - care implementează o strategie de tip [[https://​en.wikipedia.org/​wiki/​Queue_(abstract_data_type)|FIFO]]
  
 **Evitaţi codul similar** în locuri diferite! **Evitaţi codul similar** în locuri diferite!
  
-**Hint**: Puteţi reţine intern colecţia de obiecte, utilizând clasa [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​ArrayList.html|ArrayList]] din SDK-ul Java. Iată un exemplu de iniţializare pentru șiruri:+**Hint**: Puteţi reţine intern colecţia de obiecte, utilizând clasa [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​ArrayList.html|ArrayList]] din SDK-ul Java. Iată un exemplu de iniţializare pentru șiruri:
  <​code java>  <​code java>
 ArrayList<​String>​ list = new ArrayList<​String>​();​ ArrayList<​String>​ list = new ArrayList<​String>​();​
Line 126: Line 126:
  
 3. (**2p**) Implementaţi interfaţa ''​IFactory''​ (clasa ''​ContainerFactory'',​ din pachetul ''​third''​) care conţine o metodă ce primește ca parametru o strategie (enum ''​Strategy''​) și care întoarce un container asociat acelei strategii. Din acest punct înainte, în programul vostru veţi crea containere folosind doar această clasă (nu puteţi crea direct obiecte de tip Stack sau Queue). **Evitaţi** instanţierea clasei Factory implementate de voi la fiecare creare a unui container! 3. (**2p**) Implementaţi interfaţa ''​IFactory''​ (clasa ''​ContainerFactory'',​ din pachetul ''​third''​) care conţine o metodă ce primește ca parametru o strategie (enum ''​Strategy''​) și care întoarce un container asociat acelei strategii. Din acest punct înainte, în programul vostru veţi crea containere folosind doar această clasă (nu puteţi crea direct obiecte de tip Stack sau Queue). **Evitaţi** instanţierea clasei Factory implementate de voi la fiecare creare a unui container!
-**Notă**:​Acest mod de a crea obiecte de tip Container elimină problema care apare în momentul în care decidem să folosim o implementare diferită pentru un anumit tip de strategie și nu vrem să facem modificări și în restul programului. De asemenea o astfel de abordare este utilă când avem implementări care urmăresc scopuri diferite (putem avea un Factory care să creeze containere optimizate pentru viteză sau un Factory cu containere ce folosesc minimum de memorie). șablonul acesta de programare poartă denumirea de [[:poo-ca-cd:http://​en.wikipedia.org/​wiki/​Factory_method_pattern|Factory Method Pattern]].+**Notă**:​Acest mod de a crea obiecte de tip Container elimină problema care apare în momentul în care decidem să folosim o implementare diferită pentru un anumit tip de strategie și nu vrem să facem modificări și în restul programului. De asemenea o astfel de abordare este utilă când avem implementări care urmăresc scopuri diferite (putem avea un Factory care să creeze containere optimizate pentru viteză sau un Factory cu containere ce folosesc minimum de memorie). șablonul acesta de programare poartă denumirea de [[http://​en.wikipedia.org/​wiki/​Factory_method_pattern|Factory Method Pattern]].
  
-{{:​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex3.png?​250|}}+{{  :​poo-ca-cd:​laboratoare:​clase-abstracte-interfete:​ex3.png?​250 ​ }}
  
 4. (**3p**) Extindeţi clasa ''​AbstractTaskRunner''​ (din pachetul ''​fourth''​) în 3 moduri: 4. (**3p**) Extindeţi clasa ''​AbstractTaskRunner''​ (din pachetul ''​fourth''​) în 3 moduri:
-* (**1p**) ''​PrintTimeTaskRunner''​ - care afișează un mesaj după execuţia unui task în care se specifică ora la care s-a executat task-ul (vedeți clasa [[:poo-ca-cd:https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Calendar.html|Calendar]]). +  ​* (**1p**) ''​PrintTimeTaskRunner''​ - care afișează un mesaj după execuţia unui task în care se specifică ora la care s-a executat task-ul (vedeți clasa [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Calendar.html|Calendar]]). 
-* (**1p**) ​ ''​CounterTaskRunner''​ -  incrementează un contor local care ţine minte câte task-uri s-au executat. +  * (**1p**) ​ ''​CounterTaskRunner''​ -  incrementează un contor local care ţine minte câte task-uri s-au executat. 
-* (**1p**) ''​RedoBackTaskRunner''​ - salvează fiecare task executat într-un container în ordinea inversă a execuţiei și are o metodă prin care se permite reexecutarea task-urilor.+  * (**1p**) ''​RedoBackTaskRunner''​ - salvează fiecare task executat într-un container în ordinea inversă a execuţiei și are o metodă prin care se permite reexecutarea task-urilor.
  
-Schelet: {{ :​laboratoare:​old-exercises:​lab4_schelet_2018.zip ​|}}+Schelet: {{ :poo-ca-cd:​laboratoare:​old-exercises:​lab4_schelet_2018.zip }}
  
 ==== Clase interne ==== ==== Clase interne ====
   ​   ​
- ​Implementați un terminal bash simplu pornind de la {{ :​laboratoare:​old-exercises:​clase-interne-skel.zip |scheletul de cod}}. Comenzile pe care va știi să le execute sunt: **echo, cd, ls și history**. Bash-ul va citi comenzi de la tastatură până când va primi comanda **exit** când se va închide (programul se termină). ​+ ​Implementați un terminal bash simplu pornind de la {{:poo-ca-cd:​laboratoare:​old-exercises:​clase-interne-skel.zip |scheletul de cod}}. Comenzile pe care va știi să le execute sunt: **echo, cd, ls și history**. Bash-ul va citi comenzi de la tastatură până când va primi comanda **exit** când se va închide (programul se termină). ​
       * În clasa **BashUtils** din pachetul **bash** vom implementa fiecare comandă ca o clasă internă. ​       * În clasa **BashUtils** din pachetul **bash** vom implementa fiecare comandă ca o clasă internă. ​
       * În clasa **Bash** din pachetul **bash** vom citi comenzi de la tastatură și le vom trimite spre **BashUtils** spre a fi executate. ​       * În clasa **Bash** din pachetul **bash** vom citi comenzi de la tastatură și le vom trimite spre **BashUtils** spre a fi executate. ​
-      * Mecanismul de funcționare va fi de tipul [[:​poo-ca-cd: ​https://​en.wikipedia.org/​wiki/​Publish%E2%80%93subscribe_pattern | Publisher-Subscriber ]]. +      * Mecanismul de funcționare va fi de tipul [[https://​en.wikipedia.org/​wiki/​Publish%E2%80%93subscribe_pattern | Publisher-Subscriber ]]. 
  
- ​{{ ​ :​laboratoare:​clase-interne:​publish_subscribe.gif ​ ?  | Publisher-Subscriber ​ }} + ​{{  ​:poo-ca-cd:​laboratoare:​clase-interne:​publish_subscribe.gif ​ ?  | Publisher-Subscriber ​ }} 
  
           * Concret: Bash-ul va citi comenzile de la tastatură și le va **publica** către toți subscriberii săi. Bash-ul va funcționa ca un **Publisher**. ​           * Concret: Bash-ul va citi comenzile de la tastatură și le va **publica** către toți subscriberii săi. Bash-ul va funcționa ca un **Publisher**. ​
           * Utilitarele,​ **ls, echo, cd și history**, care știu cum să execute comenzile se vor înregistra la **Publisher** folosind metoda **subscribe** a acestuia și vor fi anunțate când o nouă comandă este primită. Ele vor funcționa ca **Subscriberi**. ​           * Utilitarele,​ **ls, echo, cd și history**, care știu cum să execute comenzile se vor înregistra la **Publisher** folosind metoda **subscribe** a acestuia și vor fi anunțate când o nouă comandă este primită. Ele vor funcționa ca **Subscriberi**. ​
   ​   ​
- ​{{ ​ :​laboratoare:​clase-interne:​publish_subscribe_details_v3.png ​ ?  | BashCommands Publisher-Subscriber ​ }} + ​{{  ​:poo-ca-cd:​laboratoare:​clase-interne:​publish_subscribe_details_v3.png ​ ?  | BashCommands Publisher-Subscriber ​ }} 
   ​   ​
       * În scheletul de cod veți găsi 2 interfețe: ​       * În scheletul de cod veți găsi 2 interfețe: ​
Line 161: Line 161:
   ​   ​
     1. **(1.5p)** Din clasa **Bash** vom **publica** comenzile prin interfața **CommandPublisher**. În acest sens în clasa **Bash** vom crea o clasă internă **BashCommandPublisher** ce implementează interfața **CommandPublisher**.  ​     1. **(1.5p)** Din clasa **Bash** vom **publica** comenzile prin interfața **CommandPublisher**. În acest sens în clasa **Bash** vom crea o clasă internă **BashCommandPublisher** ce implementează interfața **CommandPublisher**.  ​
-        * În această clasă creați o [[:​poo-ca-cd: ​https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​ArrayList.html | listă ]] de elemente de tip CommandSubscriber.  ​+        * În această clasă creați o [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​ArrayList.html | listă ]] de elemente de tip CommandSubscriber.  ​
         * Apoi va trebui să implementați metodele: ​         * Apoi va trebui să implementați metodele: ​
             * **subscribe**-prin care adăugăm un subscriber în lista de subscrieri ​             * **subscribe**-prin care adăugăm un subscriber în lista de subscrieri ​
Line 167: Line 167:
   ​   ​
     2. **(1p)** Un obiect de tipul **Bash** va avea:  ​     2. **(1p)** Un obiect de tipul **Bash** va avea:  ​
-          * un director current reținut în membrul **currentDirectory** care este de tipul [[:​poo-ca-cd: ​https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​nio/​file/​Path.html | Path ]]   +          * un director current reținut în membrul **currentDirectory** care este de tipul [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​nio/​file/​Path.html | Path ]]   
-          * un istoric al comenzilor care este de tipul [[:​poo-ca-cd: ​https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​StringBuffer.html | StringBuffer ]] .   +          * un istoric al comenzilor care este de tipul [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​StringBuffer.html | StringBuffer ]] .   
  <​note>​ De ce este mai util să folosim un StringBuffer și nu un String simplu? ​  <​note>​ De ce este mai util să folosim un StringBuffer și nu un String simplu? ​
- [[:​poo-ca-cd: ​http://​www.javaworld.com/​article/​2076072/​build-ci-sdlc/​stringbuffer-versus-string.html | Sting vs StringBuffer ]]?  ​+ ​[[http://​www.javaworld.com/​article/​2076072/​build-ci-sdlc/​stringbuffer-versus-string.html | String ​vs StringBuffer ]]?  ​
  </​note> ​  </​note> ​
-         * În constructorul clasei **Bash** vom inițializa **history** și apoi **currentDirectory** cu calea către directorul curent "​."​. Hint: [[:​poo-ca-cd: ​https://​docs.oracle.com/​javase/​tutorial/​essential/​io/​pathOps.html | Paths.get ]] +         * În constructorul clasei **Bash** vom inițializa **history** și apoi **currentDirectory** cu calea către directorul curent "​."​. Hint: [[https://​docs.oracle.com/​javase/​tutorial/​essential/​io/​pathOps.html | Paths.get ]] 
          * Instantiati și obiectul de tip **CommandPublisher** definit la exercițiul anterior. Prin intermediul lui vom publica comenzi din **Bash** în sistem. ​          * Instantiati și obiectul de tip **CommandPublisher** definit la exercițiul anterior. Prin intermediul lui vom publica comenzi din **Bash** în sistem. ​
   ​   ​
-    3. **(2p)** În metoda **start** din Bash vom citi de la tastatură comenzi pe câte o linie folosind [[:poo-ca-cd:https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Scanner.html | Scanner]]. ​+    3. **(2p)** În metoda **start** din Bash vom citi de la tastatură comenzi pe câte o linie folosind [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Scanner.html | Scanner]]. ​
      * Când se citește string-ul **exit** programul se termină. ​      * Când se citește string-ul **exit** programul se termină. ​
-     * Pentru orice altă comandă vom crea un nou [[:poo-ca-cd:https://​docs.oracle.com/​javase/​tutorial/​essential/​concurrency/​runthread.html | Java Thread]] de pe care vom **publica** comanda către subscriberi prin instanța de **CommandPublisher** creată la exercițiul 1. +     * Pentru orice altă comandă vom crea un nou [[https://​docs.oracle.com/​javase/​tutorial/​essential/​concurrency/​runthread.html | Java Thread]] de pe care vom **publica** comanda către subscriberi prin instanța de **CommandPublisher** creată la exercițiul 1. 
         * Creați și instantiati o clasă internă anonimă ce **extinde** clasa **Thread**. Clasa va trebui să implementeze metoda **run** prin care îi spunem thread-ului ce să facă (în cazul nostru să apeleze metoda **publish**). ​         * Creați și instantiati o clasă internă anonimă ce **extinde** clasa **Thread**. Clasa va trebui să implementeze metoda **run** prin care îi spunem thread-ului ce să facă (în cazul nostru să apeleze metoda **publish**). ​
  <​note important> ​  <​note important> ​
Line 204: Line 204:
      * Metoda **executeCommand** va trebui să:       * Metoda **executeCommand** va trebui să: 
          * verifice dacă comanda primită începe cu "​cd"​. ​          * verifice dacă comanda primită începe cu "​cd"​. ​
-         * să schimbe variabila **currentDirectory** cu noua cale. Funcția **cd** va face **append** la calea deja existentă în **currentDirectory**. Hint: [[:​poo-ca-cd: ​https://​docs.oracle.com/​javase/​tutorial/​essential/​io/​pathOps.html | Paths.get ]] +         * să schimbe variabila **currentDirectory** cu noua cale. Funcția **cd** va face **append** la calea deja existentă în **currentDirectory**. Hint: [[https://​docs.oracle.com/​javase/​tutorial/​essential/​io/​pathOps.html | Paths.get ]] 
      * Creați un obiect de tipul clasei **Cd** în constructorul clasei **Bash**. Înregistrați obiectul ca **subscriber** la instanța de **CommandPublisher** folosind metoda **subscribe**. ​      * Creați un obiect de tipul clasei **Cd** în constructorul clasei **Bash**. Înregistrați obiectul ca **subscriber** la instanța de **CommandPublisher** folosind metoda **subscribe**. ​
      * Testați rulând metoda **main** din clasa **LinuxOS**. ​      * Testați rulând metoda **main** din clasa **LinuxOS**. ​
Line 212: Line 212:
      * Metoda **executeCommand** va trebui să:       * Metoda **executeCommand** va trebui să: 
          * verifice dacă comanda primită este "​ls"​ fără parametrii. ​          * verifice dacă comanda primită este "​ls"​ fără parametrii. ​
-         * să itereze prin conținutul directorului curent și să afișeze numele fișierelor la consolă, pe câte o linie fiecare. Hint: [[:​poo-ca-cd: ​http://​stackoverflow.com/​questions/​1844688/​read-all-files-in-a-folder | cum citim conținutul unui director în Java? ]] +         * să itereze prin conținutul directorului curent și să afișeze numele fișierelor la consolă, pe câte o linie fiecare. Hint: [[http://​stackoverflow.com/​questions/​1844688/​read-all-files-in-a-folder | cum citim conținutul unui director în Java? ]] 
          * **currentDirectory** are tipul **Path**. Putem obține un obiect de tip **File** astfel: ​          * **currentDirectory** are tipul **Path**. Putem obține un obiect de tip **File** astfel: ​
  <​code java>​File folder = currentDirectory.toFile();</​code> ​    <​code java>​File folder = currentDirectory.toFile();</​code> ​  
Line 224: Line 224:
      * Clasa va trebui să implementeze interfața **CommandSubscriber**. ​      * Clasa va trebui să implementeze interfața **CommandSubscriber**. ​
      * Metoda **executeCommand** va trebui să:       * Metoda **executeCommand** va trebui să: 
-         * să adauge fiecare comanda primită în StringBuffer-ul **history** Hint: [[:poo-ca-cd:https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​StringBuffer.html | StringBuffer append]] ​+         * să adauge fiecare comanda primită în StringBuffer-ul **history** Hint: [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​StringBuffer.html | StringBuffer append]] ​
          * dacă comandă primită este "​history",​ să afișeze la consolă conținutul lui **history** ​          * dacă comandă primită este "​history",​ să afișeze la consolă conținutul lui **history** ​
      * Creați un obiect de tipul clasei **History** în constructorul clasei **Bash**. Înregistrați obiectul ca **subscriber** la instanța de **CommandPublisher** folosind metoda **subscribe**. ​      * Creați un obiect de tipul clasei **History** în constructorul clasei **Bash**. Înregistrați obiectul ca **subscriber** la instanța de **CommandPublisher** folosind metoda **subscribe**. ​
      * Testați rulând metoda **main** din clasa **LinuxOS**. ​      * Testați rulând metoda **main** din clasa **LinuxOS**. ​
  
-== Visitor pattern, Overriding, Overloading == +==== Visitor pattern, Overriding, Overloading ​==== 
-  - Scheletul de laborator conține implementarea folosind pattern-ul Visitor a scenariului Employee-Manager descris [[:​poo-ca-cd:​.:visitor#scenariu-visitor| in laborator]]. Spre deosebire de exemplele din laborator, clasa Employee conține și câmpul extraHours, relevant pentru exercițiul 3.+  - Scheletul de laborator conține implementarea folosind pattern-ul Visitor a scenariului Employee-Manager descris [[:​poo-ca-cd:​laboratoare:visitor#scenariu_visitor| in laborator]]. Spre deosebire de exemplele din laborator, clasa Employee conține și câmpul extraHours, relevant pentru exercițiul 3.
          * a) Rulați codul și observați comportamentul și interacțiunea dintre obiectele vizitate și obiectul de tip Visitor.          * a) Rulați codul și observați comportamentul și interacțiunea dintre obiectele vizitate și obiectul de tip Visitor.
          * b) Nu mai suprascrieți metoda ''​accept''​ din //​Manager//,​ rulați și explicați rezultatul execuției.          * b) Nu mai suprascrieți metoda ''​accept''​ din //​Manager//,​ rulați și explicați rezultatul execuției.
Line 245: Line 245:
        ​{{:​poo-ca-cd:​laboratoare:​visitor:​employee-manager-visitor.jpg?​500|}}        ​{{:​poo-ca-cd:​laboratoare:​visitor:​employee-manager-visitor.jpg?​500|}}
    - Găsiți folosind ''​java.nio''​ toate fișierele cu extensia "​.class"​ dintr-un director. ​    - Găsiți folosind ''​java.nio''​ toate fișierele cu extensia "​.class"​ dintr-un director. ​
-       * implementați un [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​index.html?​java/​nio/​file/​FileVisitor.html | FileVisitor]],​ extinzând [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​nio/​file/​SimpleFileVisitor.html | SimpleFileVisitor]] în care suprascrieți metoda de vizitare a fișierelor  +       * implementați un [[http://​docs.oracle.com/​javase/​8/​docs/​api/​index.html?​java/​nio/​file/​FileVisitor.html | FileVisitor]],​ extinzând [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​nio/​file/​SimpleFileVisitor.html | SimpleFileVisitor]] în care suprascrieți metoda de vizitare a fișierelor  
-        * un exemplu similar găsiți în [[:poo-ca-cd:http://​docs.oracle.com/​javase/​tutorial/​essential/​io/​walk.html | acest tutorial]]+        * un exemplu similar găsiți în [[http://​docs.oracle.com/​javase/​tutorial/​essential/​io/​walk.html | acest tutorial]]
         * Clasele din API-ul //​nio// ​ folosite pentru acest exercițiu sunt disponibile începând cu jdk7.         * Clasele din API-ul //​nio// ​ folosite pentru acest exercițiu sunt disponibile începând cu jdk7.
  
-* {{.:​visitor:​skel-visitor-manager-employee.zip| Schelet cod}}+  ​* {{:​poo-ca-cd:​laboratoare:​visitor:​skel-visitor-manager-employee.zip| Schelet cod}}
  
 ==== Colecții ==== ==== Colecții ====
Line 262: Line 262:
     - Prelucraţi implementarea de mai sus astfel încât colecţia sǎ reprezinte o tabelǎ de dispersie, care calculează codul de dispersie al elementelor dupǎ un criteriu ales de voi (puteţi suprascrie funcţia **hashCode**).     - Prelucraţi implementarea de mai sus astfel încât colecţia sǎ reprezinte o tabelǎ de dispersie, care calculează codul de dispersie al elementelor dupǎ un criteriu ales de voi (puteţi suprascrie funcţia **hashCode**).
        * În ''​Student''​ suprascrieți metoda ''​equals''​ astfel încât să se ţină cont de câmpurile clasei, şi încercaţi din nou. Ce observaţi?        * În ''​Student''​ suprascrieți metoda ''​equals''​ astfel încât să se ţină cont de câmpurile clasei, şi încercaţi din nou. Ce observaţi?
-    * //Hint:// [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Set.html#​add(E)|Set.add]],​ [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html#​equals(java.lang.Object)|Object.equals]],​ [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html#​hashCode()|Object.hashCode]]+    * //Hint:// [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Set.html#​add(E)|Set.add]],​ [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html#​equals(java.lang.Object)|Object.equals]],​ [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Object.html#​hashCode()|Object.hashCode]]
   - Plecând de la implementarea exerciţiului anterior, realizaţi urmǎtoarele modificǎri:​   - Plecând de la implementarea exerciţiului anterior, realizaţi urmǎtoarele modificǎri:​
      * Supraîncǎrcaţi,​ în clasa ''​Student'',​ metoda ''​equals'',​ cu o variantǎ care primeşte un parametru ''​Student'',​ şi care întoarce întotdeauna ''​false''​.      * Supraîncǎrcaţi,​ în clasa ''​Student'',​ metoda ''​equals'',​ cu o variantǎ care primeşte un parametru ''​Student'',​ şi care întoarce întotdeauna ''​false''​.
Line 270: Line 270:
       - Cheile pot avea valori de la 0 la 10 (corespunzǎtoare mediilor posibile). Verificați acest lucru la adăugare.       - Cheile pot avea valori de la 0 la 10 (corespunzǎtoare mediilor posibile). Verificați acest lucru la adăugare.
       - Valoarea asociată fiecǎrei chei va fi o listǎ (''​List''​) care va reţine toţi studenţii cu media rotunjitǎ egalǎ cu cheia. Considerǎm cǎ un student are media rotunjitǎ 8 dacǎ media sa este în intervalul [7.50, 8.49].       - Valoarea asociată fiecǎrei chei va fi o listǎ (''​List''​) care va reţine toţi studenţii cu media rotunjitǎ egalǎ cu cheia. Considerǎm cǎ un student are media rotunjitǎ 8 dacǎ media sa este în intervalul [7.50, 8.49].
-     - Implementați un [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Comparator.html|Comparator]] pentru stabilirea ordinii cheilor. Gradebook va primi un parametru de tip ''​Comparator''​ în constructor și îl va da mai departe constructorului clasei moștenite.+     - Implementați un [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Comparator.html|Comparator]] pentru stabilirea ordinii cheilor. Gradebook va primi un parametru de tip ''​Comparator''​ în constructor și îl va da mai departe constructorului clasei moștenite.
      - Definiţi în clasǎ metoda ''​add(Student)'',​ ce va adǎuga un student în lista corespunzǎtoare mediei lui. Dacǎ, în prealabil, nu mai existǎ niciun student cu media respectivǎ (rotunjitǎ),​ atunci lista va fi creatǎ la cerere.      - Definiţi în clasǎ metoda ''​add(Student)'',​ ce va adǎuga un student în lista corespunzǎtoare mediei lui. Dacǎ, în prealabil, nu mai existǎ niciun student cu media respectivǎ (rotunjitǎ),​ atunci lista va fi creatǎ la cerere.
     - Testați clasa:     - Testați clasa:
       - instanțiați un obiect Gradebook și adăugați in el câţiva studenţi.       - instanțiați un obiect Gradebook și adăugați in el câţiva studenţi.
-      - iteraţi pe Gradebook şi sortaţi alfabetic fiecare listǎ de studenţi pentru fiecare notă. Pentru a sorta, se va folosi metoda [[:poo-ca-cd:https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Collections.html#​sort-java.util.List-|Collections.sort]],​ iar clasa Student va implementa o interfață care specifică modul în care sunt comparate elementele. +      - iteraţi pe Gradebook şi sortaţi alfabetic fiecare listǎ de studenţi pentru fiecare notă. Pentru a sorta, se va folosi metoda [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Collections.html#​sort-java.util.List-|Collections.sort]],​ iar clasa Student va implementa o interfață care specifică modul în care sunt comparate elementele. 
-        * clasa ''​Student''​ va implementa interfaţa [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Comparable.html|Comparable]],​ suprascriind metoda [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Comparable.html#​compareTo(T)|compareTo]].+        * clasa ''​Student''​ va implementa interfaţa [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Comparable.html|Comparable]],​ suprascriind metoda [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​lang/​Comparable.html#​compareTo(T)|compareTo]].
   - Creaţi o clasǎ care moşteneşte ''​HashSet<​Integer>''​.   - Creaţi o clasǎ care moşteneşte ''​HashSet<​Integer>''​.
     * Definiţi în aceastǎ clasǎ o variabilǎ membru care reţine numǎrul total de elemente adǎugate. Pentru a contoriza acest lucru, suprascrieți metodele ''​add''​ şi ''​addAll''​. Pentru adǎugarea efectivǎ a elementelor,​ folosiţi implementǎrile din clasa pǎrinte (''​HashSet''​).     * Definiţi în aceastǎ clasǎ o variabilǎ membru care reţine numǎrul total de elemente adǎugate. Pentru a contoriza acest lucru, suprascrieți metodele ''​add''​ şi ''​addAll''​. Pentru adǎugarea efectivǎ a elementelor,​ folosiţi implementǎrile din clasa pǎrinte (''​HashSet''​).
     * Testaţi, folosind atât ''​add''​ cât şi ''​addAll''​. Ce observaţi? Corectaţi dacǎ este cazul.     * Testaţi, folosind atât ''​add''​ cât şi ''​addAll''​. Ce observaţi? Corectaţi dacǎ este cazul.
     * Modificaţi implementarea astfel încât clasa voastrǎ sǎ moşteneascǎ ''​LinkedList<​Integer>''​. Ce observaţi? Ce **concluzii** trageţi?     * Modificaţi implementarea astfel încât clasa voastrǎ sǎ moşteneascǎ ''​LinkedList<​Integer>''​. Ce observaţi? Ce **concluzii** trageţi?
-    * Hint: [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Collection.html#​add(E)|Collection.add]],​ [[:poo-ca-cd:http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Collection.html#​addAll(java.util.Collection)|Collection.addAll]]. +    * Hint: [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Collection.html#​add(E)|Collection.add]],​ [[http://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Collection.html#​addAll(java.util.Collection)|Collection.addAll]]. 
-    * Hint: implementarea ''​addAll''​ din sursele pentru [[:poo-ca-cd:http://​grepcode.com/​file/​repository.grepcode.com/​java/​root/​jdk/​openjdk/​8u40-b25/​java/​util/​HashSet.java#​HashSet|HashSet]] şi [[:poo-ca-cd:http://​grepcode.com/​file/​repository.grepcode.com/​java/​root/​jdk/​openjdk/​8u40-b25/​java/​util/​LinkedList.java#​LinkedList|LinkedList]].+    * Hint: implementarea ''​addAll''​ din sursele pentru [[http://​grepcode.com/​file/​repository.grepcode.com/​java/​root/​jdk/​openjdk/​8u40-b25/​java/​util/​HashSet.java#​HashSet|HashSet]] şi [[http://​grepcode.com/​file/​repository.grepcode.com/​java/​root/​jdk/​openjdk/​8u40-b25/​java/​util/​LinkedList.java#​LinkedList|LinkedList]].
  
  
 ==== Excepții ==== ==== Excepții ====
  
-  - **(2p)** ​ Scrieţi o metodă (scurtă) care să genereze [[:poo-ca-cd:http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​OutOfMemoryError.html|OutOfMemoryError]] şi o alta care să genereze [[:poo-ca-cd:http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​StackOverflowError.html|StackOverflowError]]. ​ Verificaţi posibilitatea de a continua rularea după interceptarea acestei erori. Comparaţi răspunsul cu posibilitatea de a realiza acelaşi lucru într-un limbaj compilat, ce rulează direct pe platforma gazdă (ca C).+  - **(2p)** ​ Scrieţi o metodă (scurtă) care să genereze [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​OutOfMemoryError.html|OutOfMemoryError]] şi o alta care să genereze [[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​StackOverflowError.html|StackOverflowError]]. ​ Verificaţi posibilitatea de a continua rularea după interceptarea acestei erori. Comparaţi răspunsul cu posibilitatea de a realiza acelaşi lucru într-un limbaj compilat, ce rulează direct pe platforma gazdă (ca C).
   - **(2p)** Demonstraţi într-un program execuţia blocului ''​finally''​ chiar şi în cazul unui ''​return''​ din metoda.   - **(2p)** Demonstraţi într-un program execuţia blocului ''​finally''​ chiar şi în cazul unui ''​return''​ din metoda.
  
Line 294: Line 294:
 Exercițiile din această secțiune și din urmatoarea au ca temă comună realizarea unui joc controlat din consolă. Jocul constă dintr-o lume (aka hartă) în care se plimbă eroi de trei tipuri, colectează comori și se bat cu monștri. În acestă secțiune trebuie să implementați o parte din funcționalitățile jocului folosind patternurile //​Singleton//,​ //Factory// și //​Observer//,​ urmând ca în secțiunea următoare să terminați implementarea. Exercițiile din această secțiune și din urmatoarea au ca temă comună realizarea unui joc controlat din consolă. Jocul constă dintr-o lume (aka hartă) în care se plimbă eroi de trei tipuri, colectează comori și se bat cu monștri. În acestă secțiune trebuie să implementați o parte din funcționalitățile jocului folosind patternurile //​Singleton//,​ //Factory// și //​Observer//,​ urmând ca în secțiunea următoare să terminați implementarea.
  
-Schelet: {{.:​design-patterns:​design-patterns1-skel.zip|Schelet}}+Schelet: {{:​poo-ca-cd:​laboratoare:​design-patterns:​design-patterns1-skel.zip|Schelet}} 
 + 
 +Solutie: {{:​poo-ca-cd:​laboratoare:​old-exercises:​design_patterns_2018_sol.zip|Solutie}}
  
 Detalii joc: Detalii joc:
-* //Harta// +  ​* //Harta// 
-   ​* reprezentată printr-o matrice. Fiecare element din matrice reprezintă o zonă care poate fi liberă, poate conține obstacole sau poate conține o comoară (în secțiunea următoare poate conține și monștrii). +    * reprezentată printr-o matrice. Fiecare element din matrice reprezintă o zonă care poate fi liberă, poate conține obstacole sau poate conține o comoară (în secțiunea următoare poate conține și monștrii). 
-   ​* este menținută în clasa ''​World''​. +    * este menținută în clasa ''​World''​. 
-* //Eroii//  +  * //Eroii//  
-   ​* sunt reprezentați prin clase de tip ''​Hero''​ și sunt de trei tipuri: //Mage//, //​Warrior//,​ //​Priest//​. +    * sunt reprezentați prin clase de tip ''​Hero''​ și sunt de trei tipuri: //Mage//, //​Warrior//,​ //​Priest//​. 
-   ​* puteți adăuga oricâți eroi doriți pe hartă (cât vă permite memoria :)) +    * puteți adăuga oricâți eroi doriți pe hartă (cât vă permite memoria :)) 
-   ​* într-o zonă pot fi mai mulți eroi +    * într-o zonă pot fi mai mulți eroi 
-   ​* acțiunile pe care le pot face: +    * acțiunile pe care le pot face: 
-     ​* ''​move''​ - se mută într-o zonă învecinată +      * ''​move''​ - se mută într-o zonă învecinată 
-     ​* ''​attack''​ (de implementat în laboratorul următor) +      * ''​attack''​ (de implementat în laboratorul următor) 
-     ​* ''​collect''​ - eroul ia comoara găsită în zona în care se află +      * ''​collect''​ - eroul ia comoara găsită în zona în care se află 
-* Entry-point-ul în joc îl consitituie clasa ''​Main''​. +  * Entry-point-ul în joc îl consitituie clasa ''​Main''​. 
-* Folosiți design pattern-ul //Factory// pentru crearea obiectelor. +  * Folosiți design pattern-ul //Factory// pentru crearea obiectelor. 
-  - Creati clase care mostenesc ''​Hero''​ pentru fiecare tip de erou.+    - Creati clase care mostenesc ''​Hero''​ pentru fiecare tip de erou.
        * suprascrieti metoda ''​toString''​ din ''​Object''​ pentru fiecare erou        * suprascrieti metoda ''​toString''​ din ''​Object''​ pentru fiecare erou
        * metoda ''​attack''​ - deocamdată nu va omorî pe nimeni - puteți afișa ceva la consolă        * metoda ''​attack''​ - deocamdată nu va omorî pe nimeni - puteți afișa ceva la consolă
-  ​- Uitați-vă la clasele ''​TreasureFactory''​ și ''​HeroFactory''​. Trebuie să implementăm două metode: ''​createTreasure''​ în ''​TreasureFactory''​ și o metodă de creare de eroi în ''​HeroFactory'',​ fie ea ''​createHero''​. +    ​- Uitați-vă la clasele ''​TreasureFactory''​ și ''​HeroFactory''​. Trebuie să implementăm două metode: ''​createTreasure''​ în ''​TreasureFactory''​ și o metodă de creare de eroi în ''​HeroFactory'',​ fie ea ''​createHero''​. 
-    - Puteți pune orice date doriți în comori, respectiv eroi. +      - Puteți pune orice date doriți în comori, respectiv eroi. 
-    - La ''​HeroFactory.createHero'',​ pasați ca parametru un ''​Hero.Type''​ și un ''​String''​ cu numele eroului și întoarceți un subtip de ''​Hero''​ potrivit pentru tipul de erou. +      - La ''​HeroFactory.createHero'',​ pasați ca parametru un ''​Hero.Type''​ și un ''​String''​ cu numele eroului și întoarceți un subtip de ''​Hero''​ potrivit pentru tipul de erou. 
-  - După ce ați creat factory-urile,​ folosiți-le:​ +    - După ce ați creat factory-urile,​ folosiți-le:​ 
-    - Completați metoda ''​populateTreasures''​ din ''​World''​. Folosiți-vă de membrii ''​map''​ și ''​treasures''​ din ''​World''​. Trebuie să marcați pe hartă că aveți o comoară și să adăugați obiectul-comoară în lista de comori. +      - Completați metoda ''​populateTreasures''​ din ''​World''​. Folosiți-vă de membrii ''​map''​ și ''​treasures''​ din ''​World''​. Trebuie să marcați pe hartă că aveți o comoară și să adăugați obiectul-comoară în lista de comori. 
-    - Uitați-vă apoi la cazul ''​add''​ din metoda ''​main''​. Trebuie să adăugați eroi acolo. Folosiți ''​HeroFactory.createHero''​. +      - Uitați-vă apoi la cazul ''​add''​ din metoda ''​main''​. Trebuie să adăugați eroi acolo. Folosiți ''​HeroFactory.createHero''​. 
-* Folosiți design pattern-ul //​Singleton//​ pentru elementele din joc care trebuie să aibă doar o instanță. +  * Folosiți design pattern-ul //​Singleton//​ pentru elementele din joc care trebuie să aibă doar o instanță. 
-  * Ce clase vor avea doar o singură instanță?​ +    * Ce clase vor avea doar o singură instanță?​ 
-* Folosiți design pattern-ul //​Observer//​ pentru a monitoriza ceea ce se întâmplă în joc. Scheletul de cod vă sugerează două tipuri de observatori,​ pentru bonus puteți adăuga și alții. +  * Folosiți design pattern-ul //​Observer//​ pentru a monitoriza ceea ce se întâmplă în joc. Scheletul de cod vă sugerează două tipuri de observatori,​ pentru bonus puteți adăuga și alții. 
-  - veți folosi interfața [[:poo-ca-cd:https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Observer.html|Observer]] și clasa [[:poo-ca-cd:https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Observable.html|Observable]] din java.util.+  - veți folosi interfața [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Observer.html|Observer]] și clasa [[https://​docs.oracle.com/​javase/​8/​docs/​api/​java/​util/​Observable.html|Observable]] din java.util.
     - Înainte să vă apucați să scrieți, citiți comentariile din cod (e.g. TreasureDiscoverer) să vă faceți o idee despre ce vrem să facem în clasele observatoare.     - Înainte să vă apucați să scrieți, citiți comentariile din cod (e.g. TreasureDiscoverer) să vă faceți o idee despre ce vrem să facem în clasele observatoare.
     - Asigurati-va ca implementati corect functionalitatea din **Observable**. Mare atentie la faptul ca **metoda notifyObservers nu va face nimic daca nu este apelata mai intai metoda setChanged**.     - Asigurati-va ca implementati corect functionalitatea din **Observable**. Mare atentie la faptul ca **metoda notifyObservers nu va face nimic daca nu este apelata mai intai metoda setChanged**.
-  ​- Care sunt elementele observatoare și care sunt observabile?​ Uitați-vă și în comentariile din cod. +    ​- Care sunt elementele observatoare și care sunt observabile?​ Uitați-vă și în comentariile din cod. 
-  - Implementați interfețele ''​Observer''​ și ''​Observable''​ în clasele potrivite. +    - Implementați interfețele ''​Observer''​ și ''​Observable''​ în clasele potrivite. 
-  - Înregistrați observatori la ''​World''​. Cazul ''​start''​ din metoda ''​main''​. +    - Înregistrați observatori la ''​World''​. Cazul ''​start''​ din metoda ''​main''​. 
-  - Notificați observatorii lui ''​World''​ când eroii execută o acțiune. Aveți două ''​TODO''​-uri în clasa ''​Hero''​. +    - Notificați observatorii lui ''​World''​ când eroii execută o acțiune. Aveți două ''​TODO''​-uri în clasa ''​Hero''​. 
-* Începeți rezolvarea prin implementarea claselor pentru eroi și implementarea design pattern-ului factory pentru crearea lor. Pentru a putea vizualiza harta trebuie să implementați partea de observare a stării jocului. ''​World''​ trebuie să fie observabilă și să notifice pe observatorii săi atunci când a început jocul și când se schimbă ceva (e.g. s-a mutat un erou).+  * Începeți rezolvarea prin implementarea claselor pentru eroi și implementarea design pattern-ului factory pentru crearea lor. Pentru a putea vizualiza harta trebuie să implementați partea de observare a stării jocului. ''​World''​ trebuie să fie observabilă și să notifice pe observatorii săi atunci când a început jocul și când se schimbă ceva (e.g. s-a mutat un erou).
     * Urmăriți **todo**-urile din scheletul de cod (pentru a le vizualiza mai ușor pe toate puteți să folosiți view-ul pt ele din IDE, de exemplu în eclipse aveți //Window -> Show View -> Tasks//)     * Urmăriți **todo**-urile din scheletul de cod (pentru a le vizualiza mai ușor pe toate puteți să folosiți view-ul pt ele din IDE, de exemplu în eclipse aveți //Window -> Show View -> Tasks//)
  
-<​imgcaption exercitii|>​ + 
-{{:​poo-ca-cd:​laboratoare:​design-patterns:​exercitiu.png|Componentele jocului}}</​imgcaption>​+{{  :​poo-ca-cd:​laboratoare:​design-patterns:​exercitiu.png ​  Componentele jocului ​ }}
  
 === Strategy, Command === === Strategy, Command ===
Line 339: Line 341:
  
 Detalii joc: Detalii joc:
-* //Harta// +  ​* //Harta// 
-   ​* reprezentată printr-o matrice. Fiecare element din matrice reprezintă o zonă care poate fi liberă, poate conține obstacole, monștrii sau o comoară +    * reprezentată printr-o matrice. Fiecare element din matrice reprezintă o zonă care poate fi liberă, poate conține obstacole, monștrii sau o comoară 
-   ​* este menținută în clasa ''​GameState''​. +    * este menținută în clasa ''​GameState''​. 
-* //Eroii//  +  * //Eroii//  
-   ​* sunt reprezentați prin clase de tip ''​Hero''​ și sunt de trei tipuri: //Mage//, //​Warrior//,​ //​Priest//​. +    * sunt reprezentați prin clase de tip ''​Hero''​ și sunt de trei tipuri: //Mage//, //​Warrior//,​ //​Priest//​. 
-   ​* puteți adăuga oricâți eroi doriți pe hartă (cât vă permite memoria :)) +    * puteți adăuga oricâți eroi doriți pe hartă (cât vă permite memoria :)) 
-   ​* într-o zonă pot fi mai mulți eroi +    * într-o zonă pot fi mai mulți eroi 
-   ​* acțiunile pe care le pot face: +    * acțiunile pe care le pot face: 
-     ​* ''​move''​ - se mută într-o zonă învecinată +      * ''​move''​ - se mută într-o zonă învecinată 
-     ​* ''​attack''​ - ataca un monstru cand se afla pe aceeasi pozitie cu el +      * ''​attack''​ - ataca un monstru cand se afla pe aceeasi pozitie cu el 
-     ​* ''​collect''​ - eroul ia comoara găsită în zona în care se află +      * ''​collect''​ - eroul ia comoara găsită în zona în care se află 
-* Entry-point-ul în joc îl consitituie clasa ''​Main''​. +  * Entry-point-ul în joc îl consitituie clasa ''​Main''​. 
-* Folosiți design pattern-ul //Command// pentru a implementa functionalitatea de undo si redo la comanda ''​move''​. +  * Folosiți design pattern-ul //Command// pentru a implementa functionalitatea de undo si redo la comanda ''​move''​. 
-   ​* Momentan, aveti erori de compilare in clasele Main si GameState. Dupa ce veti implementa acest exercitiu, se vor rezolva, nu modificati in mod direct acolo. +    * Momentan, aveti erori de compilare in clasele Main si GameState. Dupa ce veti implementa acest exercitiu, se vor rezolva, nu modificati in mod direct acolo. 
-   ​* Va trebui sa completati clasa ''​MoveCommand''​ care implementeaza interfata ''​Command''​. Urmariti //​TODO-urile//​ din aceasta clasa.  +    * Va trebui sa completati clasa ''​MoveCommand''​ care implementeaza interfata ''​Command''​. Urmariti //​TODO-urile//​ din aceasta clasa.  
-   ​* //​__Hint__//:​ Pentru Undo, de exemplu, daca v-ati deplasat la dreapta, ar trebui sa va deplasati la stanga. Creati-va o metoda ajutatoare care trateaza astfel de cazuri. +    * //​__Hint__//:​ Pentru Undo, de exemplu, daca v-ati deplasat la dreapta, ar trebui sa va deplasati la stanga. Creati-va o metoda ajutatoare care trateaza astfel de cazuri. 
-   ​* Precum si clasa ''​CommandManager''​ care va tine evidenta comenzilor si ordinea lor.  +    * Precum si clasa ''​CommandManager''​ care va tine evidenta comenzilor si ordinea lor.  
-   ​* //​__Hint__//:​ Amintiti-va de la cursul de Structuri de Date cum se implementează operatiile Redo si Undo. Folositi doua stive. +    * //​__Hint__//:​ Amintiti-va de la cursul de Structuri de Date cum se implementează operatiile Redo si Undo. Folositi doua stive. 
-* Folosiți design pattern-ul //​Strategy//​ pentru a implementa logica de atac a unui monstru. +  * Folosiți design pattern-ul //​Strategy//​ pentru a implementa logica de atac a unui monstru. 
-   ​* Pentru acest exercitiu va trebui sa implementati 2 strategii: **AttackStrategy** si **DefenseStrategy**. Ambele vor implementa Strategy si metodele aferente. Fiecare din aceste Strategy, va retine o referinta interna la un Hero. Abordarea este urmatoarea:​ +    * Pentru acest exercitiu va trebui sa implementati 2 strategii: **AttackStrategy** si **DefenseStrategy**. Ambele vor implementa Strategy si metodele aferente. Fiecare din aceste Strategy, va retine o referinta interna la un Hero. Abordarea este urmatoarea:​ 
-    * Exista 3 clase Hero, fiecare cu cate un DamageType aferent: Warrior - Blunt, Mage - Magic, Priest - Poison  +      * Exista 3 clase Hero, fiecare cu cate un DamageType aferent: Warrior - Blunt, Mage - Magic, Priest - Poison  
-    * Fiecare monstru are un weakness (slabiciune la atacurile de tip Blunt, Magic sau Poison) +      * Fiecare monstru are un weakness (slabiciune la atacurile de tip Blunt, Magic sau Poison) 
-    * **AttackStrategy**:​ In metoda attack(), veti itera prin inventory-ul eroului si veti verifica daca exista un obiect Treasure care are DamageType-ul identic cu cel al eroului. Daca da, atunci damage-ul pe care il veti da unui obiect Monster este **3 x damage-ul treasure-ului**. Daca nu aveti un astfel de Treasure, atunci cautati un Treasure cu un DamageType identic cu cel al mob-ului (mobul poate fi vulnerabil la Magic, de ex.). Daca gasiti un astfel de Treasure, damage-ul pe care il veti imprima mob-ului este **2 x damage-ul treasure-ului**. Daca nu, veti scade din HP-ul mob-ului rezultatul apelului metodei getBaseDamage() asupra Hero-ului. +      * **AttackStrategy**:​ In metoda attack(), veti itera prin inventory-ul eroului si veti verifica daca exista un obiect Treasure care are DamageType-ul identic cu cel al eroului. Daca da, atunci damage-ul pe care il veti da unui obiect Monster este **3 x damage-ul treasure-ului**. Daca nu aveti un astfel de Treasure, atunci cautati un Treasure cu un DamageType identic cu cel al mob-ului (mobul poate fi vulnerabil la Magic, de ex.). Daca gasiti un astfel de Treasure, damage-ul pe care il veti imprima mob-ului este **2 x damage-ul treasure-ului**. Daca nu, veti scade din HP-ul mob-ului rezultatul apelului metodei getBaseDamage() asupra Hero-ului. 
-    * **DefenseStrategy**:​ In metoda attack(), veti itera prin inventory-ul eroului si veti verifica, la fel, daca exista un obiect Treasure care are DamageType-ul identic cu cel al eroului. Daca da, atunci veti da un boost de HP egal cu treasure.getBoostHp() + getBaseHpBoost() eroului (getBaseHpBoost este implementata in clasa Hero). Daca nu, veti da doar un boost egal cu ce va intoarce getBaseHpBoost(). Damage-ul imprimat mobului va fi, de asemenea, egal cu ce va intoarce getBaseDamage(). Adaugati log-uri in clasa DefenseStrategy,​ pentru a va asigura ca i se mareste viata eroului. +      * **DefenseStrategy**:​ In metoda attack(), veti itera prin inventory-ul eroului si veti verifica, la fel, daca exista un obiect Treasure care are DamageType-ul identic cu cel al eroului. Daca da, atunci veti da un boost de HP egal cu treasure.getBoostHp() + getBaseHpBoost() eroului (getBaseHpBoost este implementata in clasa Hero). Daca nu, veti da doar un boost egal cu ce va intoarce getBaseHpBoost(). Damage-ul imprimat mobului va fi, de asemenea, egal cu ce va intoarce getBaseDamage(). Adaugati log-uri in clasa DefenseStrategy,​ pentru a va asigura ca i se mareste viata eroului. 
-    * Urmariti si TODO-urile din cele doua clase +     ​* Urmariti si TODO-urile din cele doua clase 
-   ​* Implementati metoda //attack// din clasa **Hero** astfel incat, daca eroul are mai mult de **50HP**, folositi strategia **AttackStrategy**. Altfel, folositi **DefenseStrategy**. Urmariti TODO-urile din cod. +     ​* Implementati metoda //attack// din clasa **Hero** astfel incat, daca eroul are mai mult de **50HP**, folositi strategia **AttackStrategy**. Altfel, folositi **DefenseStrategy**. Urmariti TODO-urile din cod. 
-* Implementați coliziunile cu obstacolele de pe hartă +  * Implementați coliziunile cu obstacolele de pe hartă 
-  * Va trebui sa creati un nou obiect ''​Obstacle''​ precum si un ''​ObstacleObserver''​ +    * Va trebui sa creati un nou obiect ''​Obstacle''​ precum si un ''​ObstacleObserver''​ 
-  * Cand eroul ajunge pe un obstacol se va printa un mesaj ''​Can'​t move there !''​ si se va apela automat undo pe ultima comanda de move pentru a reveni in pozitia anterioara coliziunii. Acest feature de wall collision va fi implementat in ''​ObstacleObserver''​+    * Cand eroul ajunge pe un obstacol se va printa un mesaj ''​Can'​t move there !''​ si se va apela automat undo pe ultima comanda de move pentru a reveni in pozitia anterioara coliziunii. Acest feature de wall collision va fi implementat in ''​ObstacleObserver''​
poo-ca-cd/laboratoare/old-exercises.1597779321.txt.gz · Last modified: 2020/08/18 22:35 by florin.mihalache
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0