Wpis z mikrobloga

Mirki, trochę się ogarnąłem z #java i stwierdziłem, że projekt, który rozgrzebałem jest ponad moje siły, jak na pierwszy projekt początkującego - prosty menadżer magazynu sklepowego okazał się być wcale nie tak prosty. Postanowiłem zrobić zatem inną, mniej skomplikowaną apkę.
Docelowo TimeKeeper, bo tak się nazywa, ma być zegarem/timerem do śledzenia czasu poświęconego na pracę nad danym zadaniem (inspiracją był blogowy wpis @JavaDevMatt). Jeśli chodzi o rozwiązania projektowe: dane przechowywane są w pliku .csv, ale podłączenie bazy danych przez np. Hibernate nie powinno być problemem (podmiana implementacji interfejsu + dodanie adnotacji, albo pliku xml). Każda część GUI jest obsługiwana przez odrębny kontroler. Dzięki temu nie ma jednego wielkiego pliku FXML, tylko kilka odrębnych mniejszych, a i sama klasa kontrolera jest znacznie mniejsza. DI jest rozwiązane bez framework'u, w głównym pliku FXML, który instancjuje kontrolery poszczególnych elementów UI i wstrzykuje do głównego kontrolera.

Apka ma też dawać możliwość zwinięcia do paska systemowego, ale póki co JavaFX nie pozwala na to (tzn. jest obejście z wykorzystaniem Swing'a, ale wolałbym go uniknąć). Na chwilę obecną zaimplementowana jest podstawowa funkcjonalność, tj. mierzenie czasu od dodania zadania do jego ukończenia z możliwością zapauzowania. Zmiany zapisywane są automatycznie co minutę plus przy każdym zapauzowaniu zadania Chcę dodać w najbliższym czasie kolumnę z ikonami (uruchomiona, zatrzymana, zakończona, +1h, +3h, +5h, +10h), pasek statusu i legenda u dołu i tooltipy oraz ogarnąć do końca wygląd okna i poszczególnych elementów. Mój #rozowypasek zasugerował, żeby dodać też opcję timer'a (odliczanie czasu od zadanej wartości do zera i później czasu ile przekroczono zadaną wartość).

Czego się nauczyłem przy tym projekcie:
1. Nie warto pchać się w naukę dużych frameworków (Spring, Hibernate itd.) dopóki nie ogarnie się podstaw OO.
2. Dobrze przemyślany design zawsze pozwoli w odpowiednim momencie framework dołączyć.
3. JavaFX jest mocno zniuansowanym API o czym przekonałem się na przykładzie ogarniania TableView.
4. Prostą współbieżność (np. odliczanie czasu dla kilku zadań na raz) można w JavaFX rozwiązać prosto dzięki klasie Task.
5. Długo by wymieniać :-)
6. Wydaje mi się, że nieco ogarnąłem po co i jak używać interfejsów.
EDIT 7. Lambdy i method calls, to bardzo wdzięczne dodatki do języka, moim zdaniem. Czynią kod dużo czytelniejszy.

Roboczy kod dostępny jest na GitHubie: https://github.com/Kitke/time-keeper/ Z jakiegoś powodu GitHub psuje kodowanie znaków (w projekcie jest Windows-1250, ale jak tak dalej pójdzie będzie UTF-8).

Szykuję klatę na przyjęcie krytyki wskazówek i porad od zawsze życzliwych wykopowych mirków ;-)

#programowanie #java #javafx #naukaprogramowania #odzeradodevelopera #kitkeprogramuje

Screen:
k.....e - Mirki, trochę się ogarnąłem z #java i stwierdziłem, że projekt, który rozgr...

źródło: comment_vqhD1LY0shp2YTcXGuCrfmDCwZhJGies.jpg

Pobierz
  • 23
@kapelusz: Tak, to jedna z rzeczy, które trzeba ogarnąć i których się nauczyłem: odłożyłem zrobienie obłsugi wyjątku 'na później' i do dzisiaj nie zrobiłem. Trzeba robić listę 'todo', albo rozwiązywać od razu. Przy ładowaniu fxml'a niewiele da się zrobić, jeśli zabraknie pliku (apka wywali się przy starcie). W wypadku braku pliku z danymi sensowne będzie, wydaje mi się, utworzenie pustego i ponowne podejście do odczytu/zapisu.
@moriturius: Cześć, dzięki za chęć niesienia pomocy! Chętnie przeczytam wszystkie Twoje uwagi, tym bardziej, że jest to moja pierwsza okienkowa aplikacja w ogóle. Chcę zaznaczyć tylko, że projekt jest jeszcze zdecydowanie rozwojowy i do jego ukończenia zostało sporo, chociaż główna funkcjonalność już jest.
@kitke: Zrobiłem tylko część review. Ogólnie przejrzałem tylko kilka plików i jutro będę chciał to dokończyć ale pomyślałem, że część uwag, które mam juz mogę podesłać:

Klasa/interfejs w Javie ZAWSZE muszą być nazwane tak samo jak plik w którym się znajdują. W kodzie masz klasę StopWatch w pliku Stopwatch.java. Wielkość liter też ma znaczenie.

W pliku Effects.java masz metodę "pulse", która wygląda na nieużywaną. Jeśli faktycznie jest nieużywana to ją usuń.
@moriturius: Wielkie dzięki za włożony trud, łap plusa cumplu!

Klasa/interfejs w Javie ZAWSZE muszą być nazwane tak samo jak plik w którym się znajdują. W kodzie masz klasę StopWatch w pliku Stopwatch.java. Wielkość liter też ma znaczenie.


Na dysku mam ok, nazwa pliku pokrywa się z nazwą interfejsu. Usunę i dodam na GitHubie, być może dodając wklepałem nazwę z małą literą w środku (ale wydaje mi się, że w takim wypadku
Tak, działa. :-)


@kitke: Nie chodzi mi o if chodzi mi o to, że focusWhenTableFocused() tworzy i zwraca funkcję, która nigdy nie jest uruchomiona. Spróbuj wstawić jakiegoś alerta tam do tego if i zobaczysz, że on się nigdy nie wyświetli :) Domyślam się, że wcześniej miałeś: button.setOnMouseEntered(focusWhenTableFocused()) - to było ok bo to tworzyło funkcję i przekazywało ją jako handler. Tak jak jest teraz to na serio nie zadziala :)

Zabieram
@kitke:

IconCell.java
- finishedIcon - nieużywana zmienna
- pusty publiczny konstruktor bezargumentowy to to samo co konstruktor domyślny więc można go po prostu usunąć :)
- w updateItem() masz 3 poziomy zagnieżdżenia ifów. Zacząłbym od wyciągnięcia każdego poziomu do osobnej metody i dalej kombinowałbym aby logika tam realizowana była jak najbardziej oczywista dla czytającego. Tak jak to jest teraz jest nieco przytłaczające :)

NameCell.java
- updateItem() - taka sama uwaga jak
@moriturius: Cumplu, serdeczne dzięki za potężną pracę nad moimi wypocinami! :-) Jest to dla mnie tym bardziej, cenne, że jestem zupełnym n00bem, który w grudniu startował w zasadzie od zera z programowaniem, OOP i Javą, SVC, itd. Tym bardziej cieszy mnie Twoja opinia, że widać, że lektura prac wujka Bob'a nie poszła tak zupełnie na marne. :))

Ze wszystkimi uwagami zgadzam się posypując głowę popiołem, odniosę się, jeśli pozwolisz, na razie,
jestem zupełnym n00bem, który w grudniu startował w zasadzie od zera z programowaniem, OOP i Javą, SVC, itd.


@kitke: Jestem pod dużym wrażeniem bo mimo, że jest sporo do wyszlifowania to myślę, że sam sposób myślenia podczas tworzenia kodu masz dobry. Teraz tylko dużo praktyki i dalsza nauka i możesz być świetnym koderem :)

Mogę zapytać, gdzie pracujesz/czym się na co dzień zajmujesz programując?


@kitke: Na co dzień pracuję jako
@moriturius: Dzięki :-) Od dziecka byłem pilnym uczniem ;-) Myślę, że obok samej praktyki, właściwym krokiem będzie zrobienie OCPJP. Raz, że certyfikat to zawsze dobry punkt w CV, dwa że pomoże to usystematyzować wiedzę o kluczowych API, w tym takich, z którymi robiąc własne projekty raczej bym się nie zetknął.

Na co dzień pracuję jako programista dla mało znanej firmy "Allegro" :)


To ta sieć lokalnych barów mlecznych? Coś mi się
@oxern: Na początku roku startowałem z zerową wiedzą o programowaniu. Projekt zacząłem w maju i w zasadzie wszystko co najważniejsze miałem w czerwcu / lipcu. W sumie, gdybym wiedział z góry od razu, co chcę zrobić, byłoby szybciej z miesiąc, nawet startując z taką samą wiedzą.
Z dotychczasowych doświadczeń - TDD znacznie przyspiesza pisanie funkcjonujących aplikacji, także polecam ogarniać tę metodologię ucząc się jednocześnie potrzebnych API