Proiect Etapa 1 - J. POO Morgan Chase & Co.
-
-
Data publicării: 22 noiembrie, ora 13:30
Deadline HARD: 19 decembrie, ora 23:59
Ultimele modificari ale enuntului:
Modificare deadline HARD - 9 Dec. 2024
Detalierea folosirii conceptelor OOP - 30 Nov. 2024
Corectarea modelului de input pentru comanda de setare a balantei minime - 2 Dec. 2024
Adaugarea unei clarificari pentru cardurile One Time Pay - 5 Dec. 2024
Clarificarea raportului de cheltuiele - 10 Dec. 2024
Ultimele modificări ale scheletului:
Actualizare referințe (sortare tranzacții după timestamp, adăugare spendingReport în teste)
Actualizare referinte (deleteAccount nu stergea contul daca nu avea asociate carduri, actualizare output pentru deleteAccount, aparitia neasteptata a unui output de min balance chiar daca nu se folosea comanda ) - 27 Nov. 2024
Actualizare inputs/refs pentru comenzi de tip ”setAlias” - 28 Nov. 2024
Actualizare refs (T17-T20) - 4 Dec. 2024
Actualizare checker pentru a nu verifica zecimale “la perfectie” - 4 Dec. 2024
Actualizare refs pentru teste split payments (T14, T18, T19, T20) - rezultatele erau corecte doar daca se facea conversia in sens invers
Actualizare refs pentru afisarea erorilor din spendingsReports (T19, T20) - 5 Dec. 2024
Actualizare input/ref pt T17 ( verificare mai amanuntita a raportului ) - 7 Dec. 2024
Update checker pentru permisivitatea verificarii zecimalelor din stringuri - 10 Dec. 2024 (FINAL)
Pentru orice neclaritate vă rugăm să folosiți forumul, urmând ca doar responsabilii temei să vă răspundă la întrebări. Se preferă folosirea forumului tocmai pentru a evita repetarea întrebărilor.
Aceasta tema evalueaza cunostintele dobandite pana la labul 6. Puteti folosi si cunostinte acumulate dupa aceste laburi. Pentru a lua punctaj maxim este nevoie sa folositi un stil de programare OOP in care sa va creati entitati, lanturi ierarhice, relatii intre entitati si sa folositi mecanisme OOP studiate la lab. Aceste concepte trebuie aplicate cu rost, deoarece corectura nu urmareste sa aveti un anumit numar din fiecare concept ci urmareste sa folositi cat mai multe concepte POO cu sens, astfel ca nu exista o singura solutie de 100p pentru aceste teme.
Totodata, aceasta tema urmareste sa va testeze cunostintele legate de design pattern-uri, deci o cerinta este sa folositi unul din dp-urile studiate pana la labul 6 inclusiv (sau alte dp-uri studiate in timpul vostru) pentru a lua punctaj maxim.
Introducere
După ce v-ați dat seama că start-up-ul cu care ați încercat data trecută să vă îmbogățiți a fost un fail, a venit timpul să deveniți patronii unei bănci.
Actualul CEO al JP Morgan a hotărât să iasă la pensie și să lase moștenire compania celui mai bun programator de Java în ceea ce privește banking-ul.
Competiția este una lungă și atroce, de aceea va trebui să implementați un nou sistem de e-banking care va urma să fie folosit de către companie.
Obiectiv
Scopul acestui proiect este de a implementa un sistem simplificat de banking folosind limbajul de programare Java. Sistemul va simula funcționalitățile de bază ale unei bănci, oferind o experiență de utilizare care să fie atât intuitivă, cât și sigură. Proiectul va utiliza concepte fundamentale din programarea orientată pe obiecte și va demonstra o arhitectură modulară, care poate fi extinsă ulterior în etapa următoare.
Context
Băncile moderne gestionează un volum mare de date și operațiuni financiare, iar siguranța și acuratețea tranzacțiilor sunt esențiale. Pe lângă stocarea și gestionarea conturilor utilizatorilor, un sistem de banking eficient trebuie să permită operațiuni de bază, cum ar fi deschiderea de conturi, realizarea de depozite, retrageri, transferuri între conturi și generarea de rapoarte financiare. În plus, un astfel de sistem trebuie să asigure protecția datelor și să respecte principiile de securitate pentru a preveni accesul neautorizat și posibilele fraude.
Utilizatorii
Primul și cel mai important lucru pentru a putea crea primele interacțiuni este adăugarea utilizatorilor.
Pentru a simplifica din proces, aceștia vor putea fi găsiți în fișierul de intrare. Datele pe care le veți regăsi în fișierul de intrare. Datele utilizatorilor vor arăta astfel:
firstName (String): prenumele utilizatorului.
lastName (String): numele de familie al utilizatorului.
email (String) : email-ul utilizatorului.
Click aici pentru a vizualiza formatul de intrare in input al unui utilizator
Click aici pentru a vizualiza formatul de intrare in input al unui utilizator
"users": [
{
"firstName": "Joshua",
"lastName": "Foster",
"email": "Joshua_Foster@yahoo.uk"
},
{
"firstName": "Kent",
"lastName": "Adams",
"email": "Kent_Adams@yahoo.us"
}
]
Curs valutar
Orice bancă care se respectă poate lucra cu mai multe tipuri de monede. Bineînțeles cursul valutar nu îl veți obține de la BNR, așa că îl veți putea găsi și pe acesta în fișierele de input.
Cursul valutar poate fi găsit doar în testele în care este nevoie de acesta!
Formatul cursului valutar este descris astfel
from (String) - moneda care se dorește a fi convertită
to (String) - moneda în care se dorește conversia
rate (double) - rata de conversie
Click aici pentru a vedea formatul cursului valutar
Click aici pentru a vedea formatul cursului valutar
"exchangeRates": [
{
"from": "USD",
"to": "EUR",
"rate": 0.9
},
{
"from": "EUR",
"to": "RON",
"rate": 5
}
]
Tranzacții
Bineînțeles că pentru a preveni fraudele, toate conturile din aplicația noastră trebuie monitorizate. Așadar, pentru următoarele acțiuni care pot avea loc pe conturile utilizatorilor vom urmări:
Crearea contului
Crearea unui card
Ștergerea unui card
Plata cu cardul
Dobânda ( în cazul unui cont de economii )
Schimbarea dobânzii ( în cazul unui cont de economii )
Setarea balanței minime a unui cont
Transferul bancar
Plata distribuită între conturi
Toate acestea vor fi asociate unui singur cont al unui utilizator și vor fi verificate pe parcursul rulării aplicației.
Totodată, aceste tranzacții se pot încheia cu erori specifice fiecăreia. Prin urmare, inclusiv tranzacțiile eronate vor fi considerate pentru verificare.
Comercianții
Veți remarca în fișierele de intrare că vor exista o listă de categorii din care pot face parte plățile voastre.
Aceste categorii vor conține de asemenea și o listă de comercianți asociată pentru a putea genera un raport într-o cerință detaliată în secțiunea sa aferentă.
Comenzile de debug
Pentru a putea avea verificări intermediare ale execuției, vom introduce câteva comenzi pentru debug.
printUsers
Datele de intrare pentru comandă arată astfel:
La întâlnirea comenzii printUsers se vor afișa toți utilizatorii împreună cu conturile și cardurile asociate acestora.
Pentru a înțelege mai bine cum ar trebui să arate output-ul aveți următorul exemplu.
Click aici pentru a putea vedea output-ul comenzii printUsers
Click aici pentru a putea vedea output-ul comenzii printUsers
{
"command" : "printUsers",
"output" : [ {
"firstName" : "Nath",
"lastName" : "Delannoy",
"email" : "Nath_Delannoy_du_Delaunay@gmail.fr",
"accounts" : [ {
"IBAN" : "RO58POOB7344468893732422",
"balance" : 853.0,
"currency" : "EUR",
"type" : "classic",
"cards" : [ {
"cardNumber" : "8207906978464446",
"status" : "active"
} ]
}, {
"IBAN" : "RO90POOB5450777208072365",
"balance" : 285.0,
"currency" : "EUR",
"type" : "classic",
"cards" : [ {
"cardNumber" : "7004757825892043",
"status" : "active"
} ]
} ]
}, {
"firstName" : "Erica",
"lastName" : "Mocanu",
"email" : "Erica_Mocanu@gmail.ro",
"accounts" : [ {
"IBAN" : "RO69POOB6209498372540635",
"balance" : 896.0,
"currency" : "RON",
"type" : "classic",
"cards" : [ {
"cardNumber" : "7901879264253296",
"status" : "active"
} ]
} ]
} ],
"timestamp" : 11
}
printTransactions
Pentru a putea inspecta tranzacțiile unui utilizator vom avea la dispoziție comanda printTransactions, iar formatul ei arată astfel:
command (String) - “printTransactions”
email (String) - email-ul utilizatorului pentru care se vor extrage tranzacțiile
timestamp (int) - momentul de timp la care a fost solicitată comanda
Click aici pentru a vedea un exemplu de output pentru printTransactions
Click aici pentru a vedea un exemplu de output pentru printTransactions
{
"command" : "printTransactions",
"output" : [ {
"timestamp" : 2,
"description" : "New account created"
}, {
"timestamp" : 9,
"description" : "Rent",
"senderIBAN" : "RO58POOB7344468893732422",
"receiverIBAN" : "RO69POOB6209498372540635",
"amount" : "303.8 USD",
"transferType" : "received"
}, {
"timestamp" : 10,
"description" : "Rent",
"senderIBAN" : "RO69POOB6209498372540635",
"receiverIBAN" : "RO90POOB5450777208072365",
"amount" : "424.0 USD",
"transferType" : "sent"
}, {
"timestamp" : 14,
"description" : "Insufficient funds"
}, {
"timestamp" : 15,
"description" : "Insufficient funds"
} ],
"timestamp" : 17
}
Evenimentele care vor avea loc în aplicația noastră vor fi expuse sub forma unor comenzi.
De aceea, în această secțiune veți putea găsi fiecare comandă explicată și modul ei de funcționare.
Adăugarea unui cont pentru un utilizator
Ce utilizator într-o aplicație de banking nu are și un cont bancar?
La întâlnirea acestei comenzi, se va adăuga un cont nou utilizatorului specificat.
Datele incluse în comandă vor fi:
command (String) - “addAccount” - numele comenzii
email (String) - email-ul utilizatorului căruia i se va crea un cont nou
currency (String) - moneda asociată contului
accountType (String) - tipul de cont care va fi creat
timestamp (int) - momentul solicitării comenzii
interestRate (double) - dobânda cu care este finanțat contul
Conturile create vor fi de două feluri: contul de economii (“savings”) și contul obișnuit (“classic”).
Implementarea propriu-zisă a contului de economii o veți putea găsi în secțiunea aferentă a acestei pagini.
Câmpul interestRate este prezent doar în cazul unui cont de economii!
Chiar dacă IBAN-ul conturilor nu vă este dat în comandă, acesta va trebui generat.
În schelet vă oferim o clasă de utilități cu care acest IBAN poate fi generat și este suficientă apelarea acesteia la fiecare cont creat.
Balanța inițială a unui cont nou adăugat va fi mereu 0!
Click aici pentru a vedea datele de intrare ale comenzii
Click aici pentru a vedea datele de intrare ale comenzii
{
"command": "addAccount",
"email": "Codrut_Popescu@icloud.ro",
"currency": "RON",
"timestamp": 2
}
Adăugarea fondurilor într-un cont
Acum că putem crea conturi, ar trebui să putem pune bani în acestea.
Detaliile pentru această operație sunt:
command (String) - “addFunds” - numele comenzii
account (String) - IBAN-ul contului în care se adaugă bani
amount (double) - suma care va fi adăugată în cont
timestamp (int) - momentul de timp în care comanda a fost solicitată
Click aici pentru a vedea datele de intrare ale comenzii
Click aici pentru a vedea datele de intrare ale comenzii
{
"command": "addFunds",
"account": "RO69POOB6209498372540635",
"amount": 170,
"timestamp": 16
}
Crearea unui card asociat contului unui utilizator
Acum că avem și bani, ar trebui ca utilizatorii să aibă și cu ce să plătească.
Vom introduce posibilitatea de a avea două tipuri de carduri: cele obișnuite și cele care sunt de tipul ”one time pay”.
Față de cardul obișnuit, folosirea cardului ”one time pay” va permite efectuarea unei singure tranzacții.
Datele de intrare pentru crearea unui card sunt următoarele:
command (String) - “createCard” / “createOneTimeCard” - comenzile asociate fiecărui tip de card
account (String) - IBAN-ul contului căruia i se va asocia cardul
email (String) - email-ul utilizatorului care a efectuat comanda
timestamp (int) - momentul de timp de solicitare al comenzii
Dacă utilizatorul nu este proprietarul contului, se va adăuga o tranzacție specifică care semnalează acest lucru.
Dupa ce se face o plata cu cu un astfel de card, se va genera alt card in locul acestuia!
Ștergerea unui cont al unui utilizator
Unii utilizatori au pretenții prea mari și nu le place aplicația noastră 🙄. Drept urmare, doresc să își șteargă contul.
Datele incluse în comandă vor fi:
command (String) - “deleteAccount” - numele comenzii
account (String) - IBAN-ul contului care va fi șters
timestamp (int) - momentul solicitării comenzii
email (String) - email-ul utilizatorului
Click aici pentru a vedea datele de intrare ale comenzii
Click aici pentru a vedea datele de intrare ale comenzii
{
"command": "deleteAccount",
"account": "RO58POOB7344468893732422",
"timestamp": 3
}
Contul va putea fi șters doar dacă balanța sa este egală cu 0!
Toate cardurile asociate contului vor fi distruse!
Ștergerea unui card
Ștergerea unui card va face imposibilă utilizarea acestuia în comenzi ulterioare.
De asemenea, ștergerea unui card va semnala în lista de tranzacții a contului faptul că acesta a fost șters.
Datele incluse în comanda de ștergere sunt:
command (String) - “deleteCard” - numele comenzii
cardNumber (String) - cardul care va fi șters
timestamp (int) - momentul la care s-a solicitat ștergerea
Click aici pentru a vedea un model
Click aici pentru a vedea un model
{
"command": "deleteCard",
"cardNumber": "7004757825892043",
"timestamp": 7
}
Setarea unei balanțe minime pentru un cont
Nu vrem să ne cheltuim toți banii din cont, așa că vom putea avea opțiunea de a seta o balanță minimă 😉.
Pentru contul specificat în comandă, se va seta o balanță minimă ce va trebui respectată, altfel utilizatorul riscă blocarea cardului cu care dorește să facă o plată și, de asemenea, refuzarea plății pe care a încercat să o efectueze.
Datele comenzii vor fi:
command (String) - “setMinBalance” - numele comenzii
amount (double) - limita ce trebuie asociată contului
account (String) - IBAN-ul contului
timestamp (int) - momentul solicitării comenzii
Există cazuri când utilizatorul NU este unul valid, proprietarul contului dat NU este utilizatorul curent sau contul NU este corect. In aceste cazuri se va returna eroare.
Se poate ca balanța minimă să fie mai mare decât balanța curentă a contului !
Click aici pentru a vedea datele de intrare ale comenzii
Click aici pentru a vedea datele de intrare ale comenzii
{
"command": "setMinBalance",
"amount": 45.5,
"account": "RO58POOB7344468893732422",
"timestamp": 2
}
Verificarea status-ului unui card
Cum am precizat anterior, un card, fie el permanent sau one-time, poate fi blocat dacă se ajunge sub balanța minimă.
Detaliile pentru această operație sunt:
command (String) - “checkCardStatus” - numele comenzii
cardNumber (String) - numărul cardului curent
timestamp (int) - momentul de timp în care comanda a fost solicitată
Există cazul când utilizatorul sau numărul cardului NU sunt valide. În aceste cazuri se va returna eroare.
Există urmatoarele cazuri pentru care se va întoarce eroare:
Odată ce cardul devine blocat, NU se vor mai putea efectua tranzacții cu el.
Click aici pentru a vedea datele de intrare ale comenzii
Click aici pentru a vedea datele de intrare ale comenzii
{
"command": "checkCardStatus",
"cardNumber": "5873444688937324",
"timestamp": 5
}
Plata cu cardul
Cardurile vor putea fi folosite doar pentru plăți online. Din păcate, nu avem POS-uri acreditate pentru aplicația noastră .
Datele pe care le veți primi pentru o astfel de plată sunt următoarele
command (String) - ”payOnline” - numele comenzii
cardNumber (String) - numărul cardului care va fi folosit pentru plată
amount (double) - suma care va fi retrasă din cont
currency (String) - moneda care va fi folosită pentru suma retrasă din cont
timestamp (int) - momentul de timp la care are loc această operație
description (String) - o descriere a plății
commerciant (String) - entitatea către care se va face o plată
email (String) - utilizatorul care solicită acțiunea
Asigurați-vă că aveți suficiente fonduri și cardul să fie al proprietarului! În caz contrar, o tranzacție eronată va apărea pe contul utilizatorului.
Transferul bancar
Ai datorii de plătit prietenilor tăi? Nicio problemă, acum le poți trimite bani!
Transferurile pot avea loc între oricare două conturi. Poți fi proprietarul al amândurora chiar.
Datele pe care le veți primi pentru o astfel de plată sunt următoarele
command (String) - ”sendMoney” - numele comenzii
account (String) - IBAN-ul contului din care se va extrage suma
amount (double) - suma care va fi retrasă din cont
receiver (String) - contul care va primi suma de bani extrasă
timestamp (int) - momentul de timp la care are loc această operație
description (String) - o descriere a plății
Nu uitați să convertiți suma extrasă din cont în moneda contului care va primi banii!
Setarea unui alias
Pentru a avea conturile cele mai folosite la îndemână, veți implementa și existența alias-urilor.
Un alias în contextul aplicației noastre reprezintă o modalitate a-i oferi un nume unui cont către care ne-am dori să transferăm bani.
Practic, veți putea asocia un nume direct către un IBAN, astfel încât atunci când primiți o comandă de transfer bancar, contul către care transferați banii va fi dedus direct pe baza acelui nume.
Datele de intrare pentru această comandă vor fi următoarele:
command (String) - “setAlias”
email (String) - email-ul utilizatorului care își creează un alias
alias (String) - numele alias-ului
account (String) - IBAN-ul care va fi asociat alias-ului
Plata distribuită
Ieși la o întâlnire în seara asta?
Cu această ocazie o să poți împărți nemțește nota de plată la restaurant (50-50) .
Suma pentru această plată va fi împărțită egal către toate conturile participante.
Datele de intrare pentru această acțiune sunt următoarele:
accountsForSplit (List<String>) - lista cu conturile pentru care se va face împărțirea
timestamp (int) - momentul de timp la care a avut loc comanda
currency (String) - moneda folosită pentru plată
amount (double) - suma totală în moneda menționată în comandă
Dacă unul dintre conturi nu are suma necesară efectuării plății, plata nu va avea loc și toată lumea va primi în istoricul de tranzacții o tranzacție eronată.
Încasarea dobânzii
Banca ocazional te va răsplăti că îți ții banii depozitați în conturile de economii. Ce generos din partea unei bănci, nu?
Dobânda o veți putea încasa doar dacă contul este unul de economii!
Datele de intrare pentru această acțiune sunt următoarele:
command (String) - ”addInterest” - numele comenzii
account (String) - IBAN-ul contului care va încasa dobânda
timestamp (int) - momentul de timp la care se încasează dobânda
Schimbarea dobânzii
Băncile o dată cu ceva timp, aplică ajustări dobânzilor.
Dacă dobânda s-a schimbat, o nouă tranzacție va apărea pe contul țintă
Datele de intrare pentru acest eveniment sunt:
command (String) - ”changeInterestRate” - numele comenzii
timestamp (int) - momentul la care se aplică schimbarea
account (String) - IBAN-ul contului căruia i se va schimba dobânda
Generarea de rapoarte de tranzacții
E vremea să verificăm dacă cineva a comis evaziune fiscală .
Aceste rapoarte vor conține date despre contul selectat și tranzacțiile acestuia pe un interval selectat de timp.
Datele de input pentru un raport sunt următoarele:
command (String) - “report” / “spendingReport” - numele asociat fiecărui tip de raport
startTimestamp (int) - intervalul de start pentru selectarea tranzacțiilor
endTimestamp (int) - intervalul de final pentru selectarea tranzacțiilor
account (String) - IBAN-ul contului pentru care se construiește raportul
Raport clasic
În acest raport vom găsi următoarele date sub formă de obiect json:
IBAN (IBAN)
balanța curentă a contului (balance)
moneda contului (currency)
tranzacțiile (transactions)
În cazul în care contul este unul de economii, se vor extrage doar tranzacțiile care au reprezentat încasări de dobândă sau schimbări a acesteia.
Raport de cheltuieli
După cum ați observat până acum, fiecare plată cu cardul va avea asociată un comerciant.
Toți comercianții care vor fi prezenți în tranzacțiile cu cardul vor face parte dintr-o categorie
Pe baza acestor comercianti, vom putea extrage un raport de cheltuieli al contului într-un interval de timp care ne indica sumele cheltuite catre fiecare.
Ordinea aparitiei comerciantilor in continutul raportului este alfabetica!
Mai pe scurt, vei putea vedea cât de mulți bani spargi lunar pe pateu și pâine.
Scheletul de cod
În rezolvarea temei va fi nevoie de folosirea unor obiecte pentru stocarea și maparea datelor primite în format JSON. Scheletul temei vă oferă mai multe clase utile pentru citirea și rularea temei. Acestea se regăsesc în cadrul scheletului astfel:
Clasele de input din cadrul pachetului fileio : Acestea se vor folosi pentru parsarea datelor de input. Astfel preluați toate informațiile necesare pentru a crea propriile clase pentru rezolvarea temei.
Clasa Main care este punctul de intrare pentru logica de rezolvare a temei.
Pentru a întelege mai bine cum funcționează citirea/scrie în fișierele JSON vă recomandăm să citiți Json & Jackson sau să folosiți biblioteca GSON.
Acest proiect folosește
Maven ca
dependency manager și
build system, ceea ce înseamnă că aveți următoarele fișiere în schelet:
pom.xml - fișier în care se adaugă dependințe și se detaliează procesul de build al proiectului.
target - folder care se generează când compilați proiectul deci include fișiere java compilate și jar-urile dependințelor.
.idea - folder care conține instrucțiuni pentur IntelliJ astfel încât acesta să găsească entry point-ul aplicației și să încarce anumite configurații.
Dacă aveți probleme cu proiectul vostru vă recomandăm următoarele soluții:
Să închideți proiectul din IntelliJ, să ștergeți din file explorer folderele .idea și target și să deschideți din nou folderul proiectului cu IntelliJ (File → open → selectați folderul în care se află pom.xml). Acest pas vă regenerează configurația IntelliJ-ului.
Să apăsați pe iconița “M” din dreapta în IntelliJ, după care să apăsați pe item-ul din listă, apoi pe lifecycle și apoi dublu click pe install. Acest pas vă reinstalează dependințele proiectului.
Să apăsați pe File → Invalidate cache și să bifați toate opțiunile. Proiectul o să se reîncarce ștergând toate configurațiile și fișierele cached.
Implementarea voastră va începe din funcția Main.action, unde veți adăuga în ArrayNode output pe parcursul execuției toate output-urile comezilor date.
Aveți în fișierul “pom.xml” toate dependințele necesare pentru rularea temei, mai exact bibliotecile Jackson, Lombok și GSON.
Output-ul nu trebuie formatat ca în ref-uri, fiindcă se verifică conținutul obiectelor și array-urilor JSON, nu textul efectiv. Cu toate acestea, dacă folosiți Jackson, vă recomandăm să utilizați
PrettyPrinter Documentație PrettyPrinter. Totodată, pentru a înțelege cum se poate realiza
scrierea în fișierele JSON de output, vă sugerăm să consultați
JSON Array.
Execuția temei
Se încarcă datele citite din fișierul de test, în format JSON, în obiecte.
Se primesc secvențial acțiuni și se execută pe măsură ce sunt primite, rezultatul lor având efect asupra Repository-ului.
După executarea unei acțiuni, se afișează rezultatul ei în fișierul JSON de ieșire.
La terminarea tuturor acțiunilor se termină și execuția programului.
După ce clonați repo-ul de pe GitHub, vă rugăm să vă faceți un repository propriu privat în care să vă puneți doar conținutul scheletului de pe repo-ul echipei de POO. Nu lucrați direct în folderul clonat de voi pe local, deoarece nu veți putea să dați push la commit-uri și este posibil să pierdeți punctajul pe commit-uri.
Vă rugăm să vă generați un .gitignore cu template-ul Maven dacă nu folosiți .gitignore-ul inclus în temă. Acesta vă ajută să definiți fișiere care să nu fie luate în considerare la diff check când rulați git status/git commit sau alte comenzi de git.
Pentru ca checker-ul să funcționeze trebuie să deschideți tema din Intellij la calea unde se află fișierul pom.xml.
Recomandări
Tema a fost concepută pentru a vă testa cunoștințele dobândite în urma parcurgerii laboratoarelor 1-6, aceasta putând fi rezolvată doar cu noțiunile invățate din acele laboratoare.
Tema fiind o specificație destul de stufoasă recomandăm citirea de cel putin două ori a enunțului inainte de inceperea implementării.
Pentru depanarea diferențelor dintre output-ul vostru si fișierele ref, vă recomandăm
acest site.
Verificați periodic această pagină, deoarece scheletul/cerința pot suferi modificări în urma unor erori din partea noastră.
Evaluare
Punctajul constă din:
80p implementare - trecerea testelor
10p coding style (vezi checkstyle)
5p README clar, concis, explicații axate pe design (flow, interacțiuni)
5p folosire git pentru versionarea temei
Pe pagina
Indicații pentru teme găsiți indicații despre scrierea readme-ului și
baremul folosit la corectarea temei. Vă incurajăm să treceți prin el cel puțin odată.
Pentru a primi punctajul pentru Git, după ce ați terminat tema și ați făcut toate commit-urile, executați comanda git log > git_log.txt
in rădăcina proiectului și adăugați fisierul in arhiva trimisă.
Pentru folosirea tool-ului
Git vă punem la dispoziție un tutorial actualizat și amplu despre el la acest
link și aveți de asemenea și un tutorial despre comenzile pe care puteți să le dați din IntelliJ la acest
link.
Folosirea git pentru versionare va fi verificata din folderul .git pe care trebuie să îl includeți în arhiva temei. Punctajul se va acorda dacă ați făcut minim 3 commit-uri relevante și cu mesaj sugestiv. NU este permis să aveți repository-urile de git publice până la deadline-ul hard.
Bonusuri:
La evaluare, putem oferi bonusuri pentru design foarte bun, cod bine documentat dar și pentru diverse elemente suplimentare alese de voi.
Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va duce la anularea punctajului de pe parcursul semestrului şi repetarea materiei atât pentru sursă(e) cât şi pentru destinație(ii), fără excepție.
Aveți grijă să puneți pe Vmchecker Next doar folderul src și fișierele git_log.txt și README.md. De asemenea, să ștergeți din arhivă folder-ul resources.
Checkstyle
Unul din obiectivele temei este învățarea respectării code-style-ului limbajului pe care îl folosiți. Aceste convenții (de exemplu cum numiți fișierele, clasele, variabilele, cum indentați) sunt verificate pentru temă de către tool-ul checkstyle.
Pe pagina de Recomandări cod găsiți câteva exemple de coding style.
Dacă numărul de erori depistate de checkstyle depășește 30, atunci punctele pentru coding-style nu vor fi acordate. Dacă punctajul este negativ, acesta se trunchiază la 0.
Exemple:
punctaj_total = 100
și nr_erori = 200
⇒ nota_finala = 90
punctaj_total = 100
și nr_erori = 29
⇒ nota_finala = 100
punctaj_total = 80
și nr_erori = 30
⇒ nota_finala = 80
punctaj_total = 80
și nr_erori = 31
⇒ nota_finala = 70
Upload temă
Arhiva o veţi urca pe VMChecker Next, unde sunt si informații despre structura ei.
FAQ
Q: Pot folosi biblioteca “X”?
A: Dacă doriți să folosiți o anumită bibliotecă vă recomandăm să întrebați pe forum, ca apoi să o validăm și să o includem și pe Vmchecker Next. Nu veți uploada pom.xml în arhivă deci nu este suficient doar să modificați acel fișier.
Q: Am descoperit edge case-ul “Y”, trebuie să îl tratez?
A: Nu. Toate datele necesare pentru soluționarea temei vă sunt date in cerință. Dacă totuși am omis ceva ne puteți contacta pe forum.
Q: Pot folosi clase de tip “Enum” pentru constante?
A: Da.
Q: Ce JDK recomandați?
A: 21
Q: Pot să fac în orice ordine testele?
A: Testele sunt incrementale, dar vă recomandăm să le implementați în ordinea dată de noi.
Resurse și linkuri utile