Wpis z mikrobloga

OK, zgodnie z obietnicą, cotygodniowa aktualizacja.
Zapiernicz w pracy i bobo w domu mocno ograniczyły mi czas w tym tygodniu, więc prace posuwają się w tempie ślimaka wyścigowego. Co zatem się udało. Zgodnie z sugestą @mamapoth zrezygnowałem z używania zmiennych zmiennoprzecinkowych do przechowywania informacji o kasie. Popatrzyłem za info w sieci (thank you Stackoverflow!) i najłatwiej - chociaż z punktu widzenia wydajności programu, niezbyt optymalnie - będzie sprawę ogarnąć używając BigDecimal - tu artykuł o tym W przybliżeniu klasa ta pozwala na wykonywania obliczeń o dużej dokładności, a później zaokrąglania wyników zgodnie ze zdefiniowaną dokładnością i regułami.

Jak już pisałem, czytam Roberta C. Martina, Czysty Kod (dotarłem do połowy książki), w kolejce mam jeszcze parę innych prac. Wczoraj napisałem sobie w ramach treningu prosty parser tekstu, który przyda mi się w robocie, ułatwiając nudną pracę. Mam 40-stronicowy plik, w miarę jednolicie sformatowany, zawierający nazwiska autorów piszących do czasopisma wydawanego przez wydział, którym pracuję, i adresy URL do ich profili w bazie nauka polska. Wszystko to musi trafić na stronę internetową. Zamiast ręcznie klepać <p class="... <a href="... napisałem programik, który robi to za mnie :-) Pierwsze #profity z nauki Java już zatem są :D

Parę rzeczy, nad rozkminieniem których zastanawiam się w głównym projekcie. Kto zaglądał na GitHub'a ten wie, ze mam klasę Item, która opisuje przedmiot przechowywany w magazynie (Storehouse) sklepu. Przedmiot ma w sumie 9 'właściwości'/zmiennych instancyjnych: 1. nazwę, 2. symbol PKWiU, 3. cenę zakupu, 4. cenę netto, 5. cenę
brutto, 6. ilośc, 7. jednostkę, w której ilość jest podawana (sztuka, kilogram, metr bieżący, opakowanie itd.) 8. stawkę VAT 9. marżę.

Myślę, że warto będzie z tego wyodrębnić klasę Price, która będzie przechowywać trzy wartości (purchaseValue, nettoValue, bruttoValue) i w konstruktorze wymagać podania dwóch wartości - ceny zakupu i ceny brutto, lub wszystkich trzech. Dodatkowo klasa będzie przechowywać informacje o marży, która jest związana z wartościami cen i która będzie automatycznie obliczana. Do niej trafią też metody obliczające ceny i marżę.

Taki zabieg będzie, wydaje mi się, wymagał wyodrębnienia również klasy oddzielnei opisującej podatek VAT. Zgodnie z sugestią, po raz drugi @mamapoth nie chcę hardokodować wartości podatku VAT, ale jednocześnie dobrze byłoby przechowywać informację, do której grupy podatkowej dany przedmiot należy, mając przy tym możliwość łatwej zmiany wartości przypisanej do danej grupy. Dla niezorientowanych: grup podatkowych jest pięć pierwsza(0%), druga(8%), trzecia(23%), w której znajduje się 95% sprzedawanych w sklepie teściów przedmiotów, czwarta (zwolniony) i piąta (5%). Widziałbym to tak, że w momencie zmiany danej stawki, np. z grupy trzeciej, cena brutto wszystkich towarów jest z automatu przekalkulowywana (obserwator?).

Z innej beczki I. Program ma korzystać z SQLite, więc muszę koniecznie ogarnąć jakiś framework, który ustrzeże mnie przed pisaniem zapytań z palca (pisał o tym @ufik78). Jesli nie Hibernate, to co? A jeśli Hibernate to od czego warto zacząć? :-)

Z innej beczki II. Pobrałem i zainstalowałem, tu ukłony należą się znó dla @ufik78), IntelliJ Idea Community Edition i wygląda na to, że przy nim pozostanę, przynajmniej przez jakiś czas. W porównaniu z Eclipse Luna, z którego dotychczas korzystałem i do którego zdążyłem nawyknąć, IntelliJ odczuwalnie wolniej kompiluje i odpala programy, szczególnei jeśli jest to pierwsze uruchomienie. Sprawdziłem na dwóch różnych kompach (starym Dell'u studio z 4GB RAM i Core 2 Duo @ 2.1Ghz i stacji roboczej HP z i5, nie pamiętam jednak dokładnie jaką) i w obu IDE na poczatku trochę przymulało indeksując pliki, żeby później działać przyzwoicie. Mam jednak wrażenie, że system podpowiedzi i edycji kodu, stopień dopracowania interfejsu i z mojego punktu widzenia rzecz istotna, estetyczna strona programu (w końcu mogę ustawić w pełni całości ciemny motyw + tryb pełnoekranowy) kładą Eclipse'a na łopatki. A jakie są wasze doświadczenia z różnymi IDE?

#java #programowanie #kitkeprogramuje
  • 48
@travikk: Dalej nie rozumiem. Wiesz, że Spring radzi sobie z klasami, które nie są "zbudowane na Springu"? Opisujesz jakiś wymyślony problem. Nie dość, że nie rozumiem problemu, to nie widzę tego jak singleton miałby go rozwiązać.
W programownaiu nie chodzi o to, by trzymać się sztywnych zasad koniec kropka. Jeżeli rozumiesz niebezpieczeństwo jakie za sobą niesie używanie nieszczęsnego singletonu czy czegokolwiek innego, to wiesz czego unikać i jak stosować dane rozwiązanie. Oczywistym jest, że załadowanie całej architektury singletonami spowoduje, że wszystko będzie tak ze sobą powiązane, że równie dobrze mogłąby to być jedna klaska.

Czasem trzymanie się zasad nie przynosi żadnego efektu, wręcz przeciwnie - prowadzi do "overengineering"
@travikk: Tak i tak. I co to ma do rzeczy?
Może jest jakiś jeden na milion przypadek, gdzie singleton byłby potrzebny. Nie jestem w stanie go wymyślić, ale może jakiś tam jest. Natomiast w przytłaczajacej większości przypadków singletony są wpychane w miejsca, gdzie, w najlepszym przypadku, nie są potrzebne, a w najgorszym, powodują wiele problemów.
@mamapoth: to to ma do rzeczy, że w innych językach springa nie ma i są (powtarzam któryś raz z kolei) inne implementacje DI;

zgadzam się - używanie singletonów na lewo i prawo to kompletna porażka, bo kod robi się zamkniętą skrzynką; są jednak sytuacje, z których dobrym wyjściem jest singleton - przykład podałem wyżej.
@travikk: Oczywiście że do każdego problemu trzeba podchodzić indywidualnie, nieraz czytałem całe dyskusje nad pewnymi problemami i mimo że uczestniczyło w nich całe grono programistów nie udało się wypracować jednego idealnego rozwiązania.

Logika prezentacji rządzi się innymi prawami. Mimo to nigdy nie znalazłem uzasadnionego przypadku zastosowania singletona. Owszem znalazłyby się miejsca gdzie rozwiązałby pewne problemy ale to droga na skróty, zawsze udawało się wypracować lepsze rozwiązanie.

@kitke: Podchodziłem już do
@Kuchasz: nie istnieje coś takiego jak rozwiązanie idealne, każdy programista ma swoje podejście do danego problemu; trochę tak jak z robotnikami "paaanie kto to panu tak sp****lił?"
@travikk: No i jak singleton mi w tym pomoże? Dlaczego uważasz, że jest on tu niezbędny? Jak byś potem napisał unit test klasy korzystającej z tego rozwiązania? No bo naciskanie klawiszy w trakcie testu nie wchodzi w grę :-D.
@Kuchasz: Powiem tak - warto się pomęczyć po angielsku. Przekład IMHO rozmywa wykład książki w języku oryginału i po prostu zaciemnia myśl autora - i dotyczy to nie tylko tej książki, ale przekładów w ogóle :-) Martin ma zacięcie gawędziarza i pisze ze swoistą swadą, co się może podobać, albo nie i może utrudniać zrozumienie tekstu. Dalej, po wstępie, jest łatwiej, więcej kodu, mniej gadania ;-) Walcz! Warto ;-)

PS Translator
@mamapoth: unit testowanie widoków nie zawsze jest możliwe; jeżeli już to robi się unit testy obiektów kompozycji/helperów/controllerów - zwał jak zwał;

pomoże w ten sposób, że masz globalną klasę, w której trzymasz stan klawiatury i zawsze możesz ją odpytać o stan danego klawisza. tyle.
@kitke: Dobra. Załóżmy, że potrzebujemy globalny stan mieć dostępny. Ok. Ale wciąż nie uzasadnia to istnienie singletonu. Potrzebujesz jedną taką instancję? Utwórz jedną na starcie programu i tyle. Po co się bawić w kod, który wymusza istnienie tylko jednej instancji?
@mamapoth: napisałem wyżej, że nie chodzi o wymuszenie jednej instancji ale o globalny zasięg, nie czytasz tego co piszę!
poza tym, wymuszenie jednej instancji w tym przypadku miałoby swój uzasadniony cel (chociaż nie o to mi chodzi w tym problemie!) - masz jedną instancję masz pewność, że nie ma desynchronizacji pomiędzy stanami i masz pewność, że ten sam kod nie jest wykonywany dwukrotnie (wydajność, heloł), nie przechowujesz tych samych stanów w