Differences

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

Link to this comparison view

poo-ca-cd:laboratoare:java-basics [2021/09/06 17:05]
diana.tatulescu [De ce este POO o paradigmă bună?]
poo-ca-cd:laboratoare:java-basics [2024/10/10 11:43] (current)
florin_andrei.relea [Exerciții]
Line 25: Line 25:
 |              |               | Ruby         | |              |               | Ruby         |
  
-Spre deosebire de **Programarea Procedurală**, care folosește o listă de instrucțiuni pentru a spune computerului pas cu pas ce să facă, **Programarea Orientată-Obiect** se folosește de componente din program care știu să desfășoare anumite acțiuni și să interacționeze cu celelalte.+Spre deosebire de **programarea procedurală**, care folosește o listă de instrucțiuni pentru a spune computerului pas cu pas ce să facă, **programarea orientată-obiect** se folosește de componente din program care știu să desfășoare anumite acțiuni și să interacționeze cu celelalte.
  
-Astfel, **POO** oferă **modularitate** și **ordine** programului,​ **reușind să modeleze situații din viața reală** - fiind **mai avansată** decât ​Programarea Procedurală, care reflectă un mod simplu, direct de a rezolva problema.+Astfel, **POO** oferă **modularitate** și **ordine** programului,​ **reușind să modeleze situații din viața reală** - fiind **mai avansată** decât ​programarea procedurală, care reflectă un mod simplu, direct de a rezolva problema.
  
 ====De ce să folosim POO?==== ====De ce să folosim POO?====
Line 484: Line 484:
  
 </​code>​ </​code>​
 +
 +==== Coding style for beginners ====
 +=== De ce să respectăm un coding style? ===
 +Un aspect foarte important în momentul în care trebuie să scrieți cod în Java este legat de modul în care scrieți, mai exact de organizarea codului în interiorul unor clase cu funcționalități bine definite. Poate cel mai important motiv al respectării acestor reguli este faptul că vă va fi de ajutor în momentele în care faceți debugging sau testing pe o sursă. Primii pași pentru a avea un cod cât mai lizibil și ușor de urmărit sunt următorii:
 +
 +     * Dați nume intuitive variabilelor și metodelor folosite (de ex: nu folosiți nume simpliste, precum <​code>​int a, b, x, y; </​code>​ deoarece la un moment dat veți uita ce rol au acestea și ce reprezintă :-))
 +     * Metodele folosite trebuie să exprime o funcționalitate bine definită și **numai una**
 +     * Implicit, metodele trebuie să nu aibă multe linii de cod (vezi [[https://​dzone.com/​articles/​rule-30-%E2%80%93-when-method-class-or|Rule of 30]]) pentru a se putea asigura testarea unei singure funcționalități mai tărziu
 +
 +=== Exemplu ===
 +Vom prelua exemplul anterior, Veterinary Report, pe care îl vom „altera” în felul următor:
 + <​code java> ​
 + ​public class VeterinaryReport { 
 +     int a; 
 +     int b; 
 +  ​
 +     ​public int foo() { 
 +         ​return a + b;
 +     ​} ​
 +  ​
 +     ​public void bar() { 
 +         ​System.out.println("​Total number of animals is " + foo());
 +     ​} ​
 + ​} ​
 + </​code>​
 +<note important>​
 +   * Observăm că unui utilizator îi va fi imposibil să se folosească de functionalitățile clasei noastre mai departe deoarece denumirile pe care le au atât variabilele,​ cât și metodele îl împiedică să înțeleagă logica din spatele codului.
 +   * Evitați întotdeauna să folosiți acest mod de redactare oferind variabilelor o denumire sugestivă!
 +   * Mai multe detalii privind Coding Style-ul, precum și documentația necesară le găsiți pe [[https://​ocw.cs.pub.ro/​courses/​poo-ca-cd/​administrativ/​coding_style_ide|pagina dedicată]].
 +</​note>​
 +  ​
 +
 ==== Nice to know ==== ==== Nice to know ====
  
Line 518: Line 550:
   * IDE ([[:​poo-ca-cd:​resurse-utile:​instalare-intellij-idea|Intellij]],​ [[:​poo-ca-cd:​resurse-utile:​instalare-eclipse|Eclipse]]) instalat   * IDE ([[:​poo-ca-cd:​resurse-utile:​instalare-intellij-idea|Intellij]],​ [[:​poo-ca-cd:​resurse-utile:​instalare-eclipse|Eclipse]]) instalat
   * Verificat din linia de comandă versiunea de java:   * Verificat din linia de comandă versiunea de java:
-    * ''​javac -version''​ - comanda ​//javac// este folosită pentru compilare +    * ''​javac -version''​ - comanda ​''​javac'' ​este folosită pentru compilare 
-    * ''​java -version'' ​ - comanda ​//java// este folosită pentru rulare+    * ''​java -version'' ​ - comanda ​''​java'' ​este folosită pentru rulare 
 + 
 +<note warning>​Fiind un laborator introductiv și cu multe concepte destul de greu de verificat automat cu LambdaChecker,​ punctajul de săptămâna aceasta este opțional/​bonus. Cu toate acestea, încercați să rezolvați **toate** exercițiile și să puneți cât mai multe întrebări asistenților,​ pentru a vă însuși cât mai bine cunoștințele.</​note>​
  
 **Task 1** (3p) **Task 1** (3p)
-  - Creați ​folosind IDE-ul un nou proiect și adăugați codul din secțiunea [[:​poo-ca-cd:​laboratoare:​java-basics:#​exemplu_de_implementare|Exemplu de implementare]]. Rulați codul din IDE.+  - Creați ​pachetul ''​lab1'',​ unde adăugați codul din secțiunea [[:​poo-ca-cd:​laboratoare:​java-basics:#​exemplu_de_implementare|Exemplu de implementare]]. Rulați codul din IDE.
   - Folosind linia de comandă, compilați și rulați codul din exemplu   - Folosind linia de comandă, compilați și rulați codul din exemplu
-  - Mutați codul într-un pachet ​//task1// (sau alt nume pe care îl doriți să îl folosiți). Folosiți-vă de IDE, de exemplu Refactor -> Move pentru IntelliJ. Observați ce s-a schimbat în fiecare fișier mutat.+  - Mutați codul într-un pachet ​''​task1'',​ creat în pachetul ''​lab1''​. Folosiți-vă de IDE, de exemplu Refactor -> Move pentru IntelliJ. Observați ce s-a schimbat în fiecare fișier mutat.
  
 **Task 2**  (5p) **Task 2**  (5p)
  
-Creați un pachet ​//task2// (sau alt nume pe care îl doriți să îl folosiți). În el creați clasele: +Creați un pachet ​''​task2'' ​(sau alt nume pe care îl doriți să îl folosiți). În el creați clasele: 
-    * ''​Student''​ cu proprietățile: ​//name// (String), ​//​year// ​(Integer+    * ''​Student''​ cu proprietățile: ​''​name'' ​(String), ​''​grade'' ​(double
-    * ''​Course''​  +    * ''​Internship''​  
-      * cu proprietățile: ​//​title// ​(String), ​//​description// ​(String), //students// (array de clase Student - [[:​poo-ca-cd:​laboratoare:​java-basics#​arrays|exemplu arrays]]). +      * cu proprietățile: ​''​name'' ​(String), ​''​minGrade'' ​(double), ''​students'' ​(array de clase ''​Student'' ​- [[:​poo-ca-cd:​laboratoare:​java-basics#​arrays|exemplu arrays]]). 
-      * cu metoda: ​//​filterYear// ​care întoarce o listă ​de studenți ​care sunt într-un an dat ca parametru.+      * cu metoda: ​''​chooseCandidateRandomly'' ​care returneaza in mod aleatoriu un student din lista de studenti corespunzatoare unui internship (**Hint:** folositi clasa Random). 
 +      * cu metoda: ''​chooseCandidatesForInterview'' ​care va afisa toti candidatii care au obtinut un phone interview la o anumita companie. Fiecare companie are asociat un grade minim dupa care va selecta candidatii pentru un phone interview. Astfel, daca grade-ul unui candidat este mai mare sau egal cu grade-ul minim dorit de o companie pentru angajatii sai, atunci acesta va primi un phone interviewAfisarea candidatilor se va face sub forma: "​Candidate [nume_student] got a phone interview at [nume_internship]"​
     * Nu folosiți vreun modificator de acces pentru variabile (aka "nu puneți nimic în fața lor în afară de tip")     * Nu folosiți vreun modificator de acces pentru variabile (aka "nu puneți nimic în fața lor în afară de tip")
-    * ''​Test''​ cu metoda ​//main//La rulare, ca [[https://​docs.oracle.com/​javase/​tutorial/​essential/​environment/​cmdLineArgs.html|argument]] în linia de comandă se va da un integer reprezentând anul în care este un student +    * ''​JobMarket''​ cu metoda ​''​main''​
-      - creați un obiect //Course// și 3-4 obiecte //​Student//​. Populați obiectul Course+      - Creati studentii cu numele Gigel, Dorel, Marcel si Ionel
-      - afișați toți studenții din anul dat ca parametru. **Hint:** folositi ''​Arrays.toString(listStudenti)''​. In clasa Student folositi IDE-ul pentru a genera metoda toString (pt Intellij Code->​Generate...) +      - Creati internship-uri cu numele Google, Amazon, Facebook, Microsoft
-      - rulați atât din IDE (modificati run configurationcât și din linie de comandă +      - Apelati metoda chooseCandidatesForInterview(), pe rand, pentru fiecare companie ​din cele enumerate mai sus, respectand ordinea lor. 
-    * Opțional, în loc de [[:​poo-ca-cd:​laboratoare:​java-basics#​arrays|arrays]] pentru ​//​filterYear// ​puteți să folosiți și obiecte de tip List, e.g. [[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​util/​ArrayList.html|ArrayList]] ([[https://​www.w3schools.com/​java/​java_arraylist.asp|exemplu]])+    * Opțional, în loc de [[:​poo-ca-cd:​laboratoare:​java-basics#​arrays|arrays]] pentru ​campul ''​students'' ​puteți să folosiți și obiecte de tip List, e.g. [[https://​docs.oracle.com/​en/​java/​javase/​15/​docs/​api/​java.base/​java/​util/​ArrayList.html|ArrayList]] ([[https://​www.w3schools.com/​java/​java_arraylist.asp|exemplu]])
  
 ** Task 3** (1p) ** Task 3** (1p)
  
-    - Creați două obiecte ​//Student// cu aceleași date în ele. Afișați rezultatul folosirii ​//equals()// între ele. Discutați cu asistentul despre ce observați și pentru a vă explica mai multe despre această metodă.+    - Creați două obiecte ​''​Student'' ​cu aceleași date în ele. Afișați rezultatul folosirii ​''​equals()'' ​între ele. Discutați cu asistentul despre ce observați și pentru a vă explica mai multe despre această metodă.
        * [[https://​docs.oracle.com/​en/​java/​javase/​12/​docs/​api/​java.base/​java/​lang/​Object.html#​equals(java.lang.Object)|documentație equals]]        * [[https://​docs.oracle.com/​en/​java/​javase/​12/​docs/​api/​java.base/​java/​lang/​Object.html#​equals(java.lang.Object)|documentație equals]]
  
 <note tip> <note tip>
-Metoda ''​equals''​ este folosită în Java pentru a compara dacă două obiecte sunt egale în ceea ce privește informațiile încapsulate în acestea. Mai precis, se compară ​fiecare câmp din primul obiect cu câmpul respectiv din al doilea obiect ​și dacă toate câmpurile sunt egale ca valori, ​atunci ''​equals''​ va returna ''​true'',​ altfel va returna ''​false''​. ​Mai multe detalii legate de această ​metodă vom discuta în cadrul următoarelor laboratoare.+Metoda ''​equals''​ este folosită în Java pentru a compara dacă două obiecte sunt egale în ceea ce privește informațiile încapsulate în acestea. Mai precis, se compară ​referințele celor două obiecte. Dacă acestea indică spre aceeași zonă de memorie ​atunci ''​equals''​ va returna ''​true'',​ altfel va returna ''​false''​. ​Veți învăța în [[poo-ca-cd:​laboratoare:​agregare-mostenire|laboratorul 3]] mai multe despre cum se folosește ​această ​funcție pentru a verifica egalitatea dintre două obiecte.
  
 Exemplu de folosire: Exemplu de folosire:
Line 559: Line 594:
  
 ** Task 4** (1p) ** Task 4** (1p)
-    - Afișați un obiect de tip //Course//. Ce observați?​ +    - Afișați un obiect de tip ''​Course''​. Ce observați?​ 
-    - Implementați în clasa //Course// metoda ​//toString()// care întoarce un String compus din:+    - Implementați în clasa ''​Course'' ​metoda ​''​toString()'' ​care întoarce un String compus din:
       * titlul cu uppercase (folosiți una din metodele clasei [[https://​docs.oracle.com/​javase/​9/​docs/​api/​java/​lang/​String.html|String]])       * titlul cu uppercase (folosiți una din metodele clasei [[https://​docs.oracle.com/​javase/​9/​docs/​api/​java/​lang/​String.html|String]])
       * descrierea       * descrierea
       * numele studenților ​       * numele studenților ​
-    - Afișați obiectul de tip //Course// +    - Afișați obiectul de tip ''​Course''​ 
-      * //Hint//: puteți să porniți să implementați generând întâi metoda ​//toString// folosind IDE-ul+      * //Hint//: puteți să porniți să implementați generând întâi metoda ​''​toString'' ​folosind IDE-ul
 */ */
 ** Task 4** (1p) ** Task 4** (1p)
-   - Adăugați modificatorul de acces '​private'​ tuturor variabilelor claselor Student și Course ​(e.g. ''​private String name;''​)+   - Adăugați modificatorul de acces '​private'​ tuturor variabilelor claselor Student și Internship ​(e.g. ''​private String name;''​)
    - Rezolvați erorile de compilare adăugând metode getter și setter acestor variabile.    - Rezolvați erorile de compilare adăugând metode getter și setter acestor variabile.
      - Ce ați făcut acum se numește //​încapsulare (encapsulation)//​ și este unul din principiile de bază din programarea orientată pe obiecte. Prin această restricționare protejați accesarea și modificarea variabilelor.      - Ce ați făcut acum se numește //​încapsulare (encapsulation)//​ și este unul din principiile de bază din programarea orientată pe obiecte. Prin această restricționare protejați accesarea și modificarea variabilelor.
-       * //Hint//: pentru ​a vă eficientiza timpul, folosiți IDE-ul pentru a generarea aceste metode + 
-         * Eclipse: Source -> Generate Getters and Setters +<note tip> 
-         * IntelliJ: Code -> Generate... -> Getters and Setters+Pentru ​a vă eficientiza timpul, folosiți IDE-ul ​(IntelliJ) ​pentru a generarea aceste metode: Code -> Generate... -> Getters and Setters 
 +</​note>​
 ==== Resurse și linkuri utile==== ==== Resurse și linkuri utile====
  
poo-ca-cd/laboratoare/java-basics.1630937107.txt.gz · Last modified: 2021/09/06 17:05 by diana.tatulescu
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