Univerzitní projekt katalogu knihovny
TODO un-llm the translation
Během druhého ročníku na vysoké škole jsem měl za úkol dokončit tři různé projekty do tří různých předmětů: Databázové systémy, UI/UX design a programování v C#. Měl jsem geniální nápad je všechny spojit do jednoho funkčního systému pro správu knihovny. Zdrojový kód je k dispozici na GitHubu.
Přehled projektu
Chtěl jsem vytvořit desktopovou aplikaci s pár základníma operacema, jako je správa knih, zaměstnanců a výpůjček. Aplikace se měla připojit k databázi, stahovat další data z webu a mít grafické uživatelské rozhraní.
Píšu to, jako by funkce byly od začátku pevně dané, ale ve skutečnosti byly poskládány dohromady, jak jsem odevzdával různé části projektu do jednotlivých předmětů. Finální produkt byl mišmašem všech těchto požadavků.
Pro kontext, požadavky z předmětů by se daly shrnout takto: Vytvořte databázi s alespoň 12 entitami, která dodržuje 3. normální formu. Vytvořte obsáhlý soubor ve Figmě obsahující alespoň 5 stránek aplikace. A vytvořte aplikaci pomocí Windows Forms, která musí upravovat a ukládat data.
Super diagram architektury
Návrh databáze
Obrovským kompromisem byl návrh databáze. Kvůli termínům jsem musel navrhnout databázi dříve, než jsem začal s jakoukoli jinou částí projektu, a později jsem ji nemohl změnit. To znamenalo, že finální aplikace měla spoustu nepoužívaných tabulek a podivných řešení, aby vše zapadlo do prezentovatelného balíčku.
Relační databázi v PostgreSQL jsem navrhl pomocí šikovného nástroje z ČVUT, aby ukládala všechny podstatné informace, o kterých jsem si tehdy myslel, že je aplikace bude potřebovat. A pak ještě něco navíc, protože projekt vyžadoval alespoň 12 entit. Jádro datového přístupu pak později obstarávala třída AppDbContext v aplikaci Windows Forms, která definovala modely entit pro tabulky jako Book, Author, Staff a Loan.
SQL1CREATE TABLE Books ( 2 BookID SERIAL PRIMARY KEY, 3 Title VARCHAR(255) NOT NULL, 4 AuthorID INT REFERENCES Authors(AuthorID) 5); 6 7CREATE TABLE Staff ( 8 StaffID SERIAL PRIMARY KEY, 9 FirstName VARCHAR(100), 10 LastName VARCHAR(100) 11); 12
Aplikace Windows Forms
Logika aplikace byla napsána v C# s použitím .NET Framework. Použil jsem Entity Framework Core k přemostění mezery mezi mou C# aplikací a databází PostgreSQL. Vytvořil jsem také jmenný prostor Library.Components, který obsahoval opakovaně použitelné pomocné třídy, jako DataGridBinder pro propojení dat s UI mřížkami a DataGridStyle pro aplikaci konzistentního stylu.
Napsat kontext pro Entity Framework pro existující databázi byla zkušenost a půl. Musel jsem ručně mapovat všechny vztahy a vlastnosti, což mi metodou pokus-omyl nakonec zabralo celý den práce. Pro představu, takhle jsem načítal informace o autorovi knihy z databáze:
CSHARP1using (var context = new AppDbContext()) 2{ 3 var book = context.Books.Include(b => b.BookAuthors) 4 .ThenInclude(ba => ba.Author) 5 .Single(b => b.BookId == selectedBook.BookId); 6 7 lbAuthor.Text = $@"{book.BookAuthors.First().Author.AuthorFirstName} {book.BookAuthors.First().Author.AuthorLastName}"; 8} 9
Google Custom Search API
Aby byl katalog o něco bohatší, použil jsem Google Custom Search API. To obstarávala komponenta GoogleCustomSearch, která stahovala další informace, jako jsou obálky knih nebo popisy, na základě názvu knihy nebo ISBN. Jelikož má nedostatečná prozíravost znamenala, že jsem s těmito daty při návrhu databáze nepočítal, musel jsem vymyslet několik kreativních řešení, jak je začlenit.
UI/UX Design
Uživatelské rozhraní bylo vytvořeno pomocí Windows Forms, což byla... zkušenost. Přinejmenším to značně usnadnilo tvorbu mockupů ve Figmě pro můj předmět UI/UX. Hlavní okno sloužilo jako vstupní bod k dalším formulářům pro správu knih, zaměstnanců a výpůjček. Data byla většinou zobrazována v ovládacích prvcích DataGridView a já jsem použil své pomocné komponenty, aby věci nevypadaly příliš chaoticky.
Závěr
Tento univerzitní projekt byl lekce. Pravděpodobně simuloval reálný scénář se špatným plánováním a podivně strukturovanými termíny. Byla to však základní zkušenost, která mě naučila o složitosti softwarové architektury, omezeních rigidního designu a bolesti z používání zastaralých UI frameworků.