Rețeaua de curent electric a unei țări este un sistem complex, format din producători, distribuitori, consumatori (casnici sau industriali) și instituții ale statului care reglementează și supraveghează buna funcționare a sistemului.
Etapa trecută s-a bazat pe interacțiunea dintre două entități - consumatori și distribuitori. În cadrul acestei etape, vom mai adăuga o entitate - producătorii - și vom extinde responsabilitățile distribuitorilor, păstrând în același timp și funcționalitățile de bază din prima etapă.
Aceștia funcționează ca în etapa trecută, cu o singura precizare suplimentară:
În cazul în care un consumator ramane cu o datorie în ultima lună de contract, acesta va fi în una din două situații:
În aceasta etapă, distribuitorii vor interacționa și cu producătorii. În ceea ce privește consumatorii, interacțiunea va fi cea de la etapa anterioară, singura modificare fiind dată de înlocuirea costului de producție cu un cost obținut din cumpărarea energiei de la producători.
Interacțiunea cu producătorii:
Schimbări lunare date de simulare:
În input și în schimbările lunare s-a eliminat costul de producție pentru că acesta va fi calculat pe baza energiei luate de le producători.
Aceștia reprezintă noua entitate introdusă în această etapă. Un producător va produce energie de un anumit tip și o vinde mai multor distribuitori.
Proprietățile unui producător:
EnergyType
dat în scheletSchimbări lunare date de simulare:
Condiții, simplificări:
Dacă și tipul și prețul și cantitatea sunt identice atunci producătorii se aleg în ordinea id-urilor lor.
Mecanismul simulării și părțile de input și output sunt similare celor de la prima etapă. Simularea se bazează pe luni (runde), al căror număr este fixat din input (numberOfTurns), și se termină când au fost rulate numberOfTurns + 1 runde și se afișează starea curentă a simulării. În cazul în care toți distribuitorii dau faliment, simularea se va încheia.
Atât inputul, cât și outputul vor fi de tip json. Pentru exemple despre cum să citiți/scrie fișiere JSON folosind biblioteca jackson aveți acest tutorial pe wiki. Puteți folosi și alte biblioteci pentru citirea lor însă să cereți întâi responsabililor temei (pe forum) adăugarea acelor jar-uri și pe vmchecker.
Inputul este același pentru consumatori și are modificări pentru distribuitori și producători.
Output-ul este același ca în etapa 1 pentru distribuitori și consumatori, iar pentru producători vom avea update-uri lunare despre câți distribuitori au avut.
Pentru testarea soluției, rulați funcția main a clasei Test. Aceasta va rula atat testele, cat și checkstyle-ul. Pentru rularea checkerului, aveți nevoie ca proiectul vostru sa aiba încărcate bibliotecile pentru citirea fișierelor json. Mai multe detalii aici.
Dacă doriți să verificați individual un test, rulați main-ul din clasa Main dând ca argumente fișierul de intrare și fișierul de output.
Simularea va fi aproape identică cu cea din etapa 1 a proiectului. Apariția producătorilor va introduce o nouă funcționalitate, astfel:
Runda inițială:
Flow în fiecare lună:
Începutul lunii:
În timpul lunii
La sfârșitul lunii
La finalul simulării se scriu în format json în fișierul de output - informațiile despre consumatori și distribuitori în mod similar primei etape - pentru fiecare producător câți distribuitori a avut în fiecare lună
În momentul în care un distribuitor devine bankrupt, producătorii vor fi informați ca să nu mai îi dea energie (de exemplu dacă păstrați o listă în producător cu ce distribuitori are, îl scoateți din listă).
Formulele de la prima etapă rămân nemodificate, și se adaugă calcului costului de producție cerut fiecărui distribuitor:
cost = sum (cantitate energie de la producator * pret pe Kw de la producator)
productionCost = Math.round(Math.floor(cost / 10));
Exemplu:
Distribuitorul D va lua energie de la A și de la C. Costul producției va fi: (1200 * 0.1 + 1800 * 0.2)/10 = 48
Design-ul codului vostru ar trebui să fie cât mai decuplat și ușor de extins și urmărit. În afară de folosirea unor design patterns, în evaluarea temei o să luăm în considere aspecte legate de ce obiecte folosiți, ce relații aveți între ele, care este scopul lor, vizibilitatea câmpurilor și metodelor etc (exemplu de astfel de guidelines: clean code summary
Design patterns-urile pe care le recomandăm pentru aceasta etapă sunt Strategy și Observer. În mod evident, strategy merge folosit pentru alegerea producatorilor. Legat de observer, în situația din scenariul temei puteți să îl adaptați în mai multe feluri, nu vă impunem un anumit mod, este la latitudinea voastră cum alegeți să îl folosiți.
Câteva posibilități pentru aplicarea Observer:
Pentru a avea deja mecanismul de notificare dintre observers si observables, puteți folosi interfața Observer și clasa Observable din java.util. Dacă doriți puteți să vă implementați propriile interfețe/clase. Unul dintre motivele pentru care acest API ese deprecated din java 9 pentru că este prea simplu, însă acest lucru îl face potrivit pt tema și laborator. Într-o aplicație reală puteți folosi alte api-uri care sunt mult mai complexe și oferă foarte multe tipuri de obiecte și mecanisme (termenul folosit este reactive programming).
Punctajul constă din:
Depunctarile pentru designul și organizarea codului se vor scădea din punctajul testelor.
Dacă vor apărea depunctari specifice temei în momentul evaluării, nemenționate pe pagina cu depunctări generale, ele se vor încadra în limitele de maxim 15 pentru design, 5p pentru readme. Dacă tema nu respecta cerințele, sau are zero design OOP atunci se pot face depunctari suplimentare.
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.
Bonusuri: La evaluare, putem oferi bonusuri pentru design foarte bun, cod bine documentat dar și pentru diverse elemente suplimentare alese de voi.
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
Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:
README