This shows you the differences between two versions of the page.
|
poo-ca-cd:laboratoare:abstractizare-clase-speciale-si-restrictii [2025/10/27 01:22] florian_luis.micu [Exerciții] |
poo-ca-cd:laboratoare:abstractizare-clase-speciale-si-restrictii [2025/11/12 11:31] (current) florian_luis.micu [Clase și metode abstracte] |
||
|---|---|---|---|
| Line 3: | Line 3: | ||
| * Autori: [[miculuis1@gmail.com | Florian-Luis Micu ]], [[sorinabuf@gmail.com | Sorina-Anamaria Buf ]], [[stefancocioran@gmail.com | Ștefan Cocioran ]] | * Autori: [[miculuis1@gmail.com | Florian-Luis Micu ]], [[sorinabuf@gmail.com | Sorina-Anamaria Buf ]], [[stefancocioran@gmail.com | Ștefan Cocioran ]] | ||
| * Data publicării: 27.10.2025 | * Data publicării: 27.10.2025 | ||
| - | * Data ultimei modificări: 27.10.2025 | + | * Data ultimei modificări: 04.11.2025 |
| + | * clarificări și expandarea conținutului despre DTO-uri. | ||
| + | * ștergerea notiței legată de contest (numele problemei a fost actualizat pe Code Devmind). | ||
| =====Obiective===== | =====Obiective===== | ||
| Line 148: | Line 151: | ||
| <code java> | <code java> | ||
| - | Vehicle vehicle = new Sedan(); | + | Sedan sedan = new Sedan(); |
| - | vehicle.startEngine(); // Output: Car engine started! | + | sedan.startEngine(); // Output: Car engine started! |
| - | vehicle.openTrunk(); // Output: Trunk opened in the back of the car! | + | sedan.openTrunk(); // Output: Trunk opened in the back of the car! |
| </code> | </code> | ||
| Line 539: | Line 542: | ||
| } | } | ||
| </code> | </code> | ||
| + | |||
| + | <note tip> | ||
| + | Conform laboratoarelor trecute, vă reamintim că puteți crea de asemenea și **constante globale** dacă faceți un câmp ''static final''. | ||
| + | </note> | ||
| De asemenea, putem marca **parametrii** unei metode ca fiind ''final'' pentru a indica faptul că aceștia **nu pot fi schimbați în corpul unei metode**: | De asemenea, putem marca **parametrii** unei metode ca fiind ''final'' pentru a indica faptul că aceștia **nu pot fi schimbați în corpul unei metode**: | ||
| Line 828: | Line 835: | ||
| <note tip> | <note tip> | ||
| - | Observă că getteri există, dar nu se numesc ''getName()'', ci exact ca proprietatea: ''name()''. | + | Observați că getteri există, dar nu se numesc ''getName()'', ci exact ca proprietatea definită în clasă (ex. ''name()''). |
| </note> | </note> | ||
| Line 889: | Line 896: | ||
| <note tip> | <note tip> | ||
| - | * DTO (Data Transfer Object) este un obiect folosit pentru **transportul datelor** între straturi ale unei aplicații sau între aplicații diferite, **fără logică de business**. De exemplu, dacă am vrea să transmitem tot obiectul ''User'' dintr-o aplicație bancară am putea transmite inclusiv date confidențiale despre acesta (CNP, adresă etc.). Pentru a transmite doar datele necesare, putem crea o clasă ''UserDTO'' care conține doar câmpurile relevante pentru transfer. | + | Veți învăța despre **Spring** când veți face web back-end development. |
| - | * Veți învăța despre **Spring** când veți face web back-end development. | + | </note> |
| + | |||
| + | ===Ce sunt DTO-urile?=== | ||
| + | |||
| + | **DTO (Data Transfer Object)** este un obiect folosit pentru a **transfera** date între diferite părți ale unei aplicații sau între aplicații, **fără a conține logică de business**. Scopul lui este să transporte doar informațiile necesare, într-o formă **sigură** și **optimă**. | ||
| + | |||
| + | De exemplu, într-o aplicație bancară avem clasa User, care ar putea conține informații sensibile precum: | ||
| + | * nume | ||
| + | |||
| + | * CNP | ||
| + | * adresă | ||
| + | * sold cont | ||
| + | * roluri etc. | ||
| + | |||
| + | Dacă vrem să trimitem date despre utilizator către interfața web sau către alt serviciu, nu vrem să expunem date confidențiale precum CNP-ul sau adresa completă. În acest caz, creăm un ''UserDTO'', o clasă separată care conține **doar** informațiile necesare transferului, de exemplu: | ||
| + | |||
| + | <code java UserDTO.java> | ||
| + | public class UserDTO { | ||
| + | private String name; | ||
| + | private String email; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | Astfel: | ||
| + | * Protejăm datele sensibile | ||
| + | * Controlăm ce date sunt trimise | ||
| + | * Simplificăm transferul de date | ||
| + | * Evităm expunerea logicii interne a aplicației | ||
| + | |||
| + | ==Conversia dintr-o clasă în DTO== | ||
| + | |||
| + | Ca să convertim un obiect dintr-o clasă normală (**model/entity**) într-un **DTO**, există mai multe abordări. În principiu luăm doar câmpurile de care avem nevoie și le copiem în obiectul DTO. | ||
| + | |||
| + | Există mai multe metode pentru a face această copiere, însă cea recomandată este prin folosirea unui constructor: | ||
| + | |||
| + | <code java> | ||
| + | public class UserDTO { | ||
| + | private String name; | ||
| + | private String email; | ||
| + | |||
| + | public UserDTO(User user) { | ||
| + | this.name = user.getName(); | ||
| + | this.email = user.getEmail(); | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | Totodată, puteți rescrie codul de mai sus folosind ''record'' astfel: | ||
| + | |||
| + | <code java> | ||
| + | public record UserDTO(String name, String email) {} | ||
| + | </code> | ||
| + | |||
| + | <note tip> | ||
| + | * Când veți începe să lucrați cu framework-ul **Spring/Spring Boot**, veți întâlni termenii **model** sau **entity**, care reprezintă de obicei **obiectele stocate în baza de date**. Pentru moment este suficient să rețineți că aceste clase descriu obiecte reale din aplicație, cu **atribute** și **comportament**. | ||
| + | * În laboratoarele următoare vom învăța despre **Builder**, fiind un alt concept care ne poate ajuta în crearea DTO-urilor. | ||
| </note> | </note> | ||
| Line 949: | Line 1011: | ||
| <note note> | <note note> | ||
| - | În contest veți observa că problema se cheamă //Problem-LAB05-POO//, însă nu este o problemă. Vom redenumi numele problemei cât de curând. | + | În contest veți observa că problema se cheamă //Problem-LAB05-POO//, însă nu este o problemă. Vom redenumi problema cât de curând. |
| </note> | </note> | ||