Kompletní poždavky na zápočtový projekt

(Na dalších cvičeních může dojít jedině k upřesnění):

-        Program umožňuje editovat vektorový obrázek ve formě seznamu různých tvarů (odzadu dopředu). Tvary jsou vykresleny na bílém pozadí a aplikace se spouští v maximalizovaném okně. Komentáře k tomuto požadavku jsou v rámci fáze 1.

-        Kromě vykreslení jsou zobrazeny také v podobě tabulky nebo seznamu. Při označení položky v této tabulce nebo seznamu se zobrazí další tabulka, která umožňuje upravovat jednotlivé atributy tvaru (např. X1, X2, Y1, Y2, Stroke a StrokeWidth pro úsečku). Při úpravě je obrázek hned překreslen. Komentáře k tomuto požadavku jsou v rámci fáze 2.

-        V textovém panelu (např. na pravé straně okna nebo ve speciální záložce) se zobrazuje editovatelný aktuální XML kód obrázku. Např:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<svg viewBox="0 0 1000 1000">

    <g>

        <rect x="200.0" y="100.0" width="100.0" height="400.0" stroke-width="10.0" fill="none" stroke="#660066"/>

        <ellipse cx="300.0" cy="300.0" rx="200.0" ry="200.0" stroke-width="20.0" fill="none" stroke="#002200"/>

        <line x1="80" y1="180" x2="650" y2="200" stroke-width="10" stroke="#880000" />

    </g>

</svg>

Při ruční změně XML kódu se okamžitě změní vykreslený obrázek a aktualizuje se tabulka s výčtem tvarů (pokud byl zároveň vybrán nějaký tvar pro úpravy v druhé tabulce, může být vybrání zrušeno).

-        Program obsahuje panel nástrojů s tlačítky “otevřít” a “uložit”. Umožňuje uložit obrázek jako SVG (tedy XML) nebo JSON soubor. Umožňuje otevřít SVG soubor, který byl předtím uložen. Vytvořený JSON soubor musí obsahovat všechny editovatelné informace. Otevírání JSON souborů se řešit nemusí.

-        Program musí podporovat alespoň obdélníky, elipsy a úsečky. Uložený XML kód musí reprezentovat tvary zadané prostřednictvím programu.
Nemusí se nutně jednat o kód kompatibilní se standardním SVG formátem. Hlavní kritérium pro projekt je, aby se XML dalo uložit a znovu načíst.

-        Na panelu nástrojů je dále alespoň jedno tlačítko (nástroj), po jehož aktivaci je možná některá z následujících akcí:

o   Klikáním nakreslit lomenou čáru. Barvu a tloušťku čáry lze zadat předem ve dvou textových boxech na tomtéž panelu. Lomená čára může být realizována i jako série navazujících úseček.

o   Nakreslit elipsu nebo obdélník klasickým způsobem: stisknutí myši (mouse down), popotáhnutí (drag) a uvolnění (mouse up), čímž se určí pozice a velikost.

Znamená to, že stačí naprogramovat libovolnou jednu z těchto funkcí.

Cviko 11

Fáze 4

Cviko 10

Fáze 3

Cviko 9

Fáze 2

Cviko 8

Vysvětlili jsme si, že na zbývajících pěti cvičeních budeme pracovat společně na projektu, který je zároveň samostatným projektem pro zápočet (zadání je pro všechny stejné). Proto nebudu ukazovat nebo sdílet žádnou ukázkovou verzi, pouze pomůžu každému k tomu, aby to naprogramoval sám. Na cvičeních bude postup rozdělený do několika fází. V každé fázi přibydou nějaké požadavky co má program umět nebo tipy jak to udělat. Požadavky (tedy přesná kritéria pro zápočtový projekt) budou přidávány nejpozději na cviku 10, ale z velké části už na cviku 9. Není povinné držet se jednotlivých fází.
Všechny zápočtové projekty je potřeba osobně předvést. Každý musí mít jasný přehled o tom, proč je jeho kód udělaný tak jak je, co která část kódu dělá a podobně. Šance ukázat mi hotový projekt bude zejména na posledním cvičení (29. 4.). Někteří studenti to mohou provést také na předposledním cvičení (22. 4.). Opravná možnost bude v pondělí 6.5. dopoledne (pouze po dohodě s týdenním předstihem).

Projekt se nazývá SVG Editor, v GitLabu je k dispozici jako prázdná šablona.

Fáze 1

Požadavky pro budoucí fáze se budou týkat zejména témat:

-          Tabulka s modelem (TableModel) na úpravy a mazání tvarů

-          Export a import do XML

-          Export do JSON

-          Přidávání tvarů prostřednictvím tlačítek a klikání do panelu

Co je SVG:

https://editsvgcode.com/

Cviko 7

Věnovali jsme se jednoduchým experimentům s tvorbou GUI. Stihli jsme projít úlohy 1,2 a 3 z projektu playground.

Cviko 6

Věnovali jsme se opakovacím úlohám (bonus 2, bonus 3) a psaní zápočtového testu.

Několik otázek pro přípravu na test

Několik otázek pro přípravu na test (bonus 1)

Několik otázek pro přípravu na test (bonus 2) Komentované

Několik otázek pro přípravu na test (bonus 3) Komentované

Cviko 5

1. Nahradit stávající input.csv souborem geekart.cz/lectures/input.csv

 

2. Spustit kontroly na nových datech (https://geekart.cz/lectures/fakePersons/1)

 

3. Přihlášení do GitLabu, členství ve skupině, git push

 

4. Dokončete kód metody DuplicateChecker.Check:

    1- Chybová zpráva musí uvádět jméno a příjmení jiného člověka, který měl stejné číslo dokladu

    2- Upravte kód tak, aby chybějící hodnoty (prázdný string) nebyly považované za duplicitní

 

5. Přidat kontrolu SuspiciousNameChecker:

    1- Kontrola odhalí jména a příjmení, která někdo zadal opakovaným mačkáním několika kláves.

       Počet různých písmen v normálních jménech a příjmeních činí alespoň 50% z délky řetězce.

       (Např. lililggg, fffbfb, xxxxx, abababab to nesplňují)

       Výsledná hláška: "Podezřelé křestní jméno" nebo "Podezřelé příjmení"

 

5. Rozšiřte projekt tak, aby šlo využívat více způsobů, jak získat vstupní data:

    1- Založte složku fakepersons/importers

    2- Vytvořte v ní rozhraní FileImporter s metodou Import

    3- Metoda Import má stejné vstupní a výstupní typy jako metoda Utils.ReadInputFile

    4- Vytvořte ve složce třídy LocalFileImporter a RemoteFileImporter

    5- Obě třídy implementují rozhraní FileImporter

    6- LocalFileImporter k tomu využívá kód, který byl v Utils.ReadInputFile

    7- RemoteFileImporter pouze vyhodí UnsupportedOperationException

    8- Smazat metodu Utils.ReadInputFile

Cviko 4

Zabývali jsme se dědičností, abstaktními třídami, a dále kolekcí HashMap. Využili jsme k tomu projekt fakepersons. Na hlavní stránce najdete odkaz na některé doporučené otázky pro přípravu na zápočtový test.

Cviko 3

Cvičení bylo zejména na téma řetězců (String). Úkoly byly rozdělené do dvou částí:

·         Doplnit kód do metody Fraction.parse tak, aby byl splněn ParsingTest1.Tuto metodu lze zařadit do kategorie factory method, podobnou úlohu by mohl ve třídě Fraction plnit i konstruktor. Použili jsme zde kromě metody Long.parseLong také metody jako String.split, String.replace. Všechny tyto metody (stejně jako smotná Fraction.add ) jsou navržené tak, že neupravují objekt, na němž jsou volány. Místo toho produkují výstup, který typicky hned uložíme do lokální proměnné.

·         Doplnit kód do tříd ExamUtils a ExamRecord tak, aby byl splněn úkol v todo03.txt. Ukázali jsme si zde jednoduché metody pro čtení a zápis textu do souborů, dotkli jsme se práce s výjimkami, které musí být ošetřeny (checked exceptions) jako je například IOException. Na třídě ExamRecord jsme si ukázali jednoduchý datový typ s atributy, konstruktorem a gettery.

Narazili jsme při tom na další témata:

·         Metoda String.split pracuje vždy s regulárním výrazem, proto jsme si museli dát pozor při rozdělování podle znaku +, ale také jsme toho využili k rozdělení podle tří různých separátorů. V případech, kdy existuje obava že oddělovač by mohl v regexu mít nechtěnou roli, lze jako vstup metody split použít výstup z Pattern.quote(separator).

·         Ukázali jsme si že existuje debugging, tedy možnost například zastavit běžící program na určité řádce, zkoumat jeho aktuální stav nebo vyhodnocovat napsané výrazy.

·         Ukázali jsme si některé drobné tipy ohledně práce s Ideou a Gitem.

Cviko 2

Prostřednictvím třídy Fraction a tříd ve složce test (unit testy) jsme nakousli následující témata. Drželi jsme se přitom souboru todo02.txt a došli jsme zde k bodu 7.

·         Vyhození výjimky, chybová zpráva

·         Objekty se v paměti skládají z atributů (fields) a jejich třída často obsahuje konstruktor, který zapisuje hodnoty do všech atributů (úkoly 2 a 3).

·         Dále třída obvykle obsahuje nestatické metody. Ty jsou volané v kontextu konkrétního objektu (instance) a jejich kód obvykle pracuje s atributy tohoto objektu.

·         Pokud není ve třídě (kromě konstruktoru) žádná metoda, která by dokázala hodnoty atributů změnit, tak ji můžeme nazvat immutable třídou. Takovou architekturu má kromě našeho Fraction také standardní String. Například metoda add (úkol 6) to splňuje, ale podobná metoda by jinde mohla být navržená i tak, že upravuje data svého objektu, místo aby je produkovala jako výstup.

·         V konstruktoru se mohou data kromě zápisu do atributů také různě kontrolovat , upravovat, normalizovat a podobně. My jsme zde převedli čitatele a jmenovatele na základní tvar (úkol 5).

·         Mluvili jsme o metodě toString jako typickém příkladu přepisování (aka překrytí nebo override). Ujasnili jsme si, že existuje třída Object a má několik metod včetně toString.

·         Zopakovali jsme základní práci s polem, jako bonus také práci s třídou Random a ozkoušeli jsme si změřit dobu běhu určité části kódu (úkol 7).

Cviko 1

Podmínky zápočtu:

·         Docházka není povinná, ale očekávaný počet absencí je nula až dvě. Kdo bude chybět vícekrát, dává najevo že látku už zná. Tito zkušenější studenti pak musí zápočtovým testem a zkouškou projít bez nejasných odpovědí, zmatků v základních pojmech a podobně. 

·         Na šestém cvičení (11. 3. 2024) se bude psát zápočtový test. Kdo bude chybět, musí přijít na opravný termín, který zatím není určen. Rámcový obsah testu bude zvěřejněn zde nejpozději v týdnu čtvrtého cvičení.

·         Po testu bude zadán samostatný projekt, jeho splnění je také podmínkou zápočtu. Pro splnění projektu je nutné prokázat, že student psal příslušný kód sám – dokáže všechny jeho části vysvětlit.

Hlavní témata všech cvik:

·         Objektové programování (dědičnost, rozhraní, abstraktní metody, přístupnost)

·         Techniky v kódu (kolekce, hash mapy, string, lambda výrazy, generické typy, vlákna)

·         JSON a XML

·         Git

·         Práce s běžícím programem: debugging, unit testy

Na prvním cvičení jsme se věnovali malému společnému projektu na téma zlomků.

·         Ozkoušeli jsme si naklonování projektu z GitLabu a také přijetí dalších změn nahraných na server někým jiným.

·         Prohlédli jsme si z čeho se tento téměř prázdný projekt skládá, otevřeli jsme ho nejprve ve VS Code a pak v Ideji.

·         Diskutovali jsme o porovnávání čísel s plovoucí desetinnou čárkou, například porovnání dvou zlomků tím, že porovnáme výsledky dělení. Je to nespolehlivé kvůli nevyhnutelnému zaokrouhlování.

·         Diskutovali jsme o primitivních datových typech.

·         Zkusili jsme si vytvořit další třídy a metody, diskutovali jsme o “statických” třídách jako bude NumericUtils (navržená podobně jako Math) a třídách sloužících jako datový typ, jako bude Fraction.

·         Implementovali jsme metodu NumericUtils.gcd, která počítá největšího společného dělitele. To příště využijeme pro převod zlomku do základního tvaru.