Skip to content

Witaj w Świecie Jutra!

  • Technologie jutra
  • Sprzęt jutra
  • Aplikacje jutra
  • Programowanie
  • Księga Drogi
  • Renowacja
  • Różności
  • Archiwum
  • Autor
  • Home
  • Wszystko
  • ITCandidateEvaluator – Backend
  • Programowanie
  • Wszystko

ITCandidateEvaluator – Backend

Jakub Raczkowski 20 lutego 2024

Żeby stworzyć widok do ITCandidateEvaluatora potrzeba mi było około tygodnia codziennej pracy. Model i reszta klas w jego pakiecie zajęły połowę z tego. Teraz wystarczyło to już TYLKO połączyć.

Patrząc obiektywnie, mój drugi projekt nie jest jakąś szczególnie rozbudowaną aplikacją. Składa się z zaledwie 13 widoków (obiektów JPanel, które mogą zawierać inne panele i komponenty). Mimo to jest to 13 razy więcej niż miało CleanThemAll gdzie cała zabawa toczyła się na tym samym JPanelu. Tak, że to TYLKO połączenie modelu z widokiem wcale szybkie nie było.

O ile stworzenie frontu przypominało trochę zabawę z przestawianiem okienek i przycisków oraz takim ustawianiu pikseli aby to jakoś wyglądało, o tyle backend – choć technicznie zawierający się w mniejszej ilości klas – okazał się znacznie bardziej wymagający. Zobaczmy po kolei co się dzieje w każdej z jego klas:

Model – tutaj zaczyna się aplikacja i to tutaj umieściłem wszystkie potrzebne gettery z których korzysta View. Tu również rozpoczynają się dwa osobne wątki – jeden jest odpowiedzialny za ładowanie pytań z plików. Na mojej maszynie zajmuje to od 5 do 20 milisekund i równie dobrze mogłem to zrobić w wątku głównym bez zauważalnego przestoju. Ale ja mam szybki dysk NvME – na HDD to może trwać o wiele wiecej (już nie mówiąc nawet o sytuacji gdzie pytania byłyby pobierane z osobnego serwera).

RecruitmentMonitor nieprzerwanie sprawdza czy nie doszło albo nie ubyło nowych rekrutacji.

Drugi wątek ustawiłem w tryb Daemona czyli taki podrzędny – działa nieprzerwanie i odświeża listę rekrutacji w widoku kiedy stworzymy nową albo usuniemy starą. Na szczęście żaden z tych dodatkowych wątków nie zmienia danych, dlatego nie musiałem bać się o poprawną synchronizację.

Kolejna klasa: „Recruitment” zajmuje się przechowywaniem listy kandydatów i wyliczaniem ich wyników w oparciu o ustawienia Presets. Te z kolei możemy utworzyć samodzielnie albo z poziomu aplikacji, albo dodając plik JSON w katalogu presets:

Presety ładują się z plików, stworzenie nowego pliku to jedno kliknięcie w „Save presets”.
Tylko pliki spełniające wymogi opisane w Readme ładowane są do aplikacji.

Mamy też klasę Candidate dziedziczącą po AbstractCandidate zawierającą wszystkie gettery, settery i inne potrzebne metody. W klasie kandydata trzymane są wszystkie niezbędne zmienne danego aplikanta – od imienia i nazwiska po wyniki z każdego zadanego mu pytania.

Oprócz tego jest też klasa CandidateDTO, która jest takim tymczasowym kandydatem gdzie zapisują się wyniki kolejnych kroków ewaluacji i dopiero na życzenie użytkownika przesyłane są one do właściwego kandydata. Candidate i CandidateDTO początkowo dziedziczyły po AbstractCandidate, ale w połowie prac uznałem, że nie będzie to potrzebne i odciąłem klasę DTO od abstrakcji.

Można już śmiało korzystać z aplikacji, dodawać, usuwać i oceniać kandydatów.

Jeśli chodzi o pakiet ’controller’ gdzie umieściłem klasę CandidateDTO to na chwilę obecną jest on właściwie pusty, żeby nie powiedzieć – bezużyteczny. Planuję go jednak zapełnić klasami pomocniczymi implementującymi interfejs ActionListener na etapie refaktoryzacji kodu. Czasami logika niektórych przycisków jest dość rozbudowana i zaciemnia kod klasy widoku, która w założeniu ma odpowiadać tylko za pokazanie danego elementu. Przeniesienie tego do osobnych klas może ulepszyć hermetyzację kodu.

Logika niektórych przycisków jest mocno rozbudowana. Może da się to wyeksportować do zewnętrznych klas.

Dużo NullPointerException wpadło kiedy próbowałem połączyć widok pokazujący wybór pytań z fabryką ładującą je z plików (QuestionFactory). Powoli już mnie szlag trafiał kiedy raz za razem aplikacja gdzieś się wywalała, bo dana mapa była pusta (null) a ja jak zahipnotyzowany wpatrywałem się w kod analizując sekwencję zdarzeń. W końcu wywaliłem wszystko co napisałem i poszedłem pobawić się z dziećmi.

Następnego ranka temat ogarnąłem w 40 minut. Wniosek jest prosty:

Nie ma co czarować, jak się skończy mana.

Zakodowanie tych niepozornych ComboBoxów było bardzo męczące.
Tym większa satysfakcja kiedy już wszystko działa jak chciałem.

ITCandidateEvaluator już właściwie działa jak miał działać od samego początku. Możemy rozpocząć rekrutację, dodać kandydatów, ocenić jednego po drugim, porównać i przesłać im feedback o ile zrobimy to…

…jednym ciurkiem

Progam nie posiada jeszcze żadnych opcji serializacji swoich obiektów rekrutacji i kandydatów przez co przy każdym włączeniu zaczynamy proces od samego początku. Te rekrutacje i ci kandydaci, których widać na załączonych screenach są zapisani bezpośrednio w kodzie i tylko na potrzeby testów:

Automatycznie generowane procesy. Odpowiada za nie poniższy kod, który wkrótce zostanie usunięty.
Lista rekrutacji będzie pobierana z odpowiedniej strategii wstrzykniętej bezpośrednio do konstruktora Modelu.

To właśnie będzie moje następne zadanie – stworzenie strategii zapisu danych. Będą dwie strategie – ta prostsza zajmie się (de)serializacją do zwykłych plików. Ta bardziej zaawansowana skorzysta z bazy MySQL.

Ale to nie wszystko, bo wcześniej czeka mnie sroga refaktoryzacja kodu. Trochę nabałaganiłem podczas łączenia widoku z modelem i teraz wypadałoby posprzątać wszystkie nieużywane zmienne, czy spróbować odchudzić zbyt zapasione metody. Ponadto już teraz wiem o kilku mniej krytycznych błędach, które wypada załatać zanim się o nich zapomni.

A co potem?

Zakładając, że aplikacja będzie zapisywać dane jak zamierzono, kolejnym krokiem będzie podłączenie Loggera log4j, tak by wszystkie wyjątki były ładnie wyłapywane i dokumentowane.

Potem zostaną już tylko testy manualne i jednostkowe z wykorzystaniem JUnit oraz Mockito. Zobaczę też czy jest możliwość podłączenia Dockera do projektu. Ale o tym będzie już w kolejnym odcinku.

Tags: programming

Continue Reading

Previous: ITCandidateEvaluator – Frontend
Next: ITCandidateEvaluator – Bazy Danych

Related Stories

Mageege Moon104 – test niskoprofilowego mechanika
  • Sprzęt

Mageege Moon104 – test niskoprofilowego mechanika

11 marca 2025
Przebranżowienie cz.4
  • Programowanie

Przebranżowienie cz.4

27 lutego 2025
Smartfon Jutra
  • Sprzęt

Smartfon Jutra

15 lutego 2025

Ze świata

  • Antyweb
  • Kwantowo
  • Dwóch po dwóch
Drugi numer telefonu bez płacenia - jak to zrobić?
Netflix sięgnął po polską świętość. Fani wstrzymali oddech!
Naukowcy sprawdzili jak (i czy) działa medytacja. Wnioski są zaskakujące
Już jutro mecz Ligi Mistrzów za darmo dla wszystkich! Gdzie i jak oglądać?
W Rosji chcą zakazać GTA VI. Nie zgadniecie, dlaczego
Koniec Zenfone i ROG Phone - wielki odwrót Asusa
Przez 21 lat użytkownicy oddawali badaczom wydajność swoich komputerów. Piękna historia
Pędź do kina, jeśli jeszcze nie oglądałeś. Ten film zarabia kosmiczne pieniądze
Valve miesza w kotle. Chodzi o oznaczenia AI na Steamie
iPhone zachwyci nowościami. Dosłownie uratują skórę w potrzebie
Lidl kokietuje majsterkowiczów. Promocje na sprzęt Parkside
Microsoft wreszcie poprawia Windows 11. Jak najszybciej zainstaluj te łatki
UOKiK bierze się za Bolt, Zara i Tchibo. Zobacz, co im grozi
Pierwszy wodorowy dron. Właśnie rusza na pole bitwy
InPost Easy już dostępny! Jak działa wysyłanie do Paczkomatów w Europie?
Nowe flagowce Samsunga jednak gorsze od iPhone’a?
HBO trafia w dziesiątkę. Wspaniały serial dostępny od dziś!
Raj dla majsterkowiczów w Biedronce. Akumulatory za pół darmo
Polska energetyka bez węgla? Zrobiliśmy niewiarygodny postęp
Rakieta NASA już czeka na astronautów. Księżyc niedługo będzie miał gości
To by było na tyle, jeśli chodzi o możliwość ugody
Ocalić od zapomnienia
Ostatni kwant
ALH 84001 – meteoryt, o którym mówiono nawet w Białym Domu
HESS zarejestrował kosmiczny elektron o niespotykanej energii [Phys. Rev. Lett.]
Matka ciemnej materii – recenzja biografii “Vera Rubin. Życie”
Satelita, który zerwał się ze smyczy
Wiadomość od Carla Sagana do przyszłych eksploratorów Marsa
Ile najdłużej może trwać zaćmienie Słońca?
Nowa największa liczba pierwsza ma ponad 41 milionów cyfr [GIMPS]
30 lat konsoli PlayStation – Odcinek #130
Omawiamy serię The Walking Dead (gość: Stary Gracz)
Nikt nie potrzebuje cienkich smartfonów – Odcinek #129
To ostatni dzwonek na kolekcjonowanie gier i filmów
Najlepsza relacja z PGA 2025 (Poznań Game Arena)
Bumblebee wśród klawiatur. Marvo Meqa 80W – recenzja
Pierwsze spotkanie z Omoda 7 Super Hybrid
Logitech MX Master 4, Wednesday, 1670 sezon 2 – Odcinek #128
Tani pad, który chciał być jak DualSense. Test Monka Contra GT-96
Secret Service i prasa komputerowa w Polsce – Odcinek #127

To może cię zainteresować:

Mageege Moon104 – test niskoprofilowego mechanika
  • Sprzęt

Mageege Moon104 – test niskoprofilowego mechanika

11 marca 2025
Przebranżowienie cz.4
  • Programowanie

Przebranżowienie cz.4

27 lutego 2025
Smartfon Jutra
  • Sprzęt

Smartfon Jutra

15 lutego 2025
Czym jest Swagger?
  • Programowanie

Czym jest Swagger?

22 lipca 2024
  • Technologie jutra
  • Sprzęt jutra
  • Aplikacje jutra
  • Programowanie
  • Księga Drogi
  • Renowacja
  • Różności
  • Archiwum
  • Autor
Copyright © All rights reserved. | DarkNews by AF themes.