#programowanie #java #cleancode
Dodajecie na końcu nazwy klasy postfixy typu 'Exception', 'Command' itp? jaką konwencje stosujecie?

Zauważyłem że dla np. service i repository dodawanie tego postfixu jest natualne, natomiast komendy 'ActivateProductCommand' juz nie pasują mi ze wzgledu na to ze nazwa nosi za soba zbyt duzo informacji? Jak jest u was, jakie konwencje nazewnicze stosujecie?
dalszy ciąg tego wpisu. W skrócie "pożarłem się z 'senior devem' o czystość kodu."

Mój kolega z zespołu, senior dev, popełnił w kodzie parę nowych metod, o długości ok. 20 linijek, w których wymieszał najróżniejsze rzeczy typu tworzenie requesta, obsługa response'a, error handling na różnych poziomach (network, http, zawartość response'a), mapowanie, itd. Na review mu podpowiedziałem, że skoro metoda robi To, To i jeszcze To, to powinien powydzielać do mniejszych metod co
Będę uwalał wszystkie pull-requesty i nie obchodzi mnie czy będziemy mieć przez to opóźnienia.


@beethoven: Jesteś najgorszym typem programisty. No offence. Koleś dał bardzo sensowny argument a ty sie rzucasz jakby klepał kod bezmyślnie.

Kilka lat pracy z devami z USA nauczyło mnie pragmatycznego podejścia i tego że kod ma działać, dać sie rozwijać i zarabiać. To czy metoda ma 20 linijek czy 5 nie ma abosultnie żadnego znaczenia - ważne
  • Odpowiedz
@beethoven: brzmisz jak jakiś junior, co naczytał się zbytnio teorii a teraz kozaczy. W programowaniu sztuką jest podejmowanie masy kompromisów - wiele dobrych praktyk jest niemożliwe do zastosowania np: przez to jak został stworzony framework i jak zostały narzucone metody. Dobry programista rozumie, że nie zawsze warto podążać ślepo za wzorcami i czystym kodem, bo w wielu przypadkach po prostu się nie da. Mi np wiele razy zwracają uwagą, że zamiast
  • Odpowiedz
Ostatnio w pracy pożarłem się z 'senior devem' o czystość kodu.

Mamy nowo utworzony zespół składający się z ludzi z już istniejących zespołów, ale którzy nigdy bezpośrednio razem nie pracowali wcześniej. Jednym z nich jest gość, który jest kilka lat starszy ode mnie i ma jakąśtam wiedzę, ale nie przywiązuje aż tak dużej wagi do czystego kodu. Zwróciłem mu uwagę, że nie powinien przekazywać do funkcji w innej klasie całego obiektu, tylko
@beethoven: nie przesadziłeś, ja bym normalnie uwalał pull requesty i nie pozwolił mu merge'ować zmian. W przypadku braku porozumienia decyzje podejmuje przełożony lub kierownik projektu. Generalnie nie staraj się także atakować jego, tylko konkretne zmiany z podaniem konkretnych argumentów.
  • Odpowiedz
wzorceprojektowe #java #cleancode

Mirki, jak najlepiej wyjść z takiej sytuacji?
Dajmy na to, że mamy serwis, którego głównym zadaniem jest zrobienie requestu do webservice'u. Po każdym takim requescie należy zapisać zapisać o nim informacje do bazy. Jeśli zrobię metodę queryXXXWebService() i w niej umieszcze taki kod, to czy nie jest to pogwałcenie SRP?

queryXXXWebService() {
Object costam = callToWS();
saveToDb(costam);
}
Operacje te są ze sobą sciśle powiazane. Czy metoda wtedy nie
@grizzly_joe: to jak tak bardzo chcesz mieć akademicki, czysty kod, to stwórz metodę biznesową, która będzie w jednym kroku pobierała dane z endpointa, a w drugim zapisywała je do bazy.

warto aż tak komplikować kod?


@grizzly_joe: nie warto. Nigdy nie warto komplikować kodu aby na siłę starać się spełniać wszelkie SOLIDy, KISSy, DRYe, PO I PiSy.
  • Odpowiedz
#programowanie #cleancode #java
Mirki, takie pytanie: Projektuję sobie encję do programu, który zarządza planem lekcji i zastanawiam się jak powinna wyglądać ich struktura.
1. Wszystkie encje mają id
2. Niektóre mają pola audytowe (createdDate, createdUser itp.)
3. Niektóre (np. Nauczyciel, Sala, Przedmiot) mają jeszcze podpięte pola pod którą szkołę podchodzą (schoolOwner)
Zrobiłem strukturę w formię dziedziczenia: ApplicationEntity < AuditEntity < SchoolOwnerEntity < TeacherEntity (tu już konkretna encja).
Czy taka struktura jest w
@Patres: kompozycji tutaj bym nie używał, można zrobić tutaj tą strukturę dziedziczenia tak jak to proponujesz tylko teraz pytanie po co chcesz ją zrobić :P, Bo jak robisz ApplicationEntity to rozumiem, że będzie zawierała ona tylko jedno pole z id i czy rozumiem że chcesz w swoim projekcie wrzucać obiekty typu ApplicationEntity do jakiejś kolekcji i później coś z nimi robić, jak nie to jak dla mnie to jest trochę przestrzał,
  • Odpowiedz
@ppawel: Meh, wszędzie ten sam problem ;) . Dam prostą radę - jeśli jesteś w pozycji ( czyli jesteś leadem bądź potrafisz przekonywać innych ) to przestańcie angażować biznes w problemy waszego kodu i posprzątajcie samemu grajdoł jednocześnei dostarczając. Jeśli Wam się to uda, to będzie super, jeśli nie, to oznacza, że z punktu widzenia biznesu i tak to był nieopłacalny ruch ;)
  • Odpowiedz
@ppawel: ( Post wyżej zakłada, ze macie problem z organizacja czasu wobec biznesu, nie ze micie ciulowy team developerski, pewno w sumie tak założyłem bo nigdy nie pracowalem w ciulowym zespole developerskim xD )
  • Odpowiedz
Witajcie Mirasy. Przerabiam właśnie książkę "Czysty Kod" R.c.M. I nie wiem czy autor za mocno nie popłynął bo według niego nawet funkcja:

private void printGuessStatistics(char candidate, int count) {
String number;
String verb;
String pluralModifier;
if (count == 0) {
number = "no";
verb = "are";
pluralModifier = "s";
} else if (count == 1) {
number = "1";
verb = "is";
pluralModifier = "";
} else {
number = Integer.toString(count);
verb
funkcja ma robić jedną i tylko jedną rzecz (single responsibility), ułatwia to pisanie testów


@erajwa: Akurat w tym przypadku podfunkcje są prywatne – czyli ich nie testujesz. Testujesz funkcję główną, która w efekcie robi wszystko co podfunkcje.

Więc w żaden sposób nie ułatwia to testowania.
  • Odpowiedz
[ #csharp #dotnet #programowanie #dotnetnews #maavfeed ]

#csharp
Już chyba wstawiałem 2 miesiące temu Piotra Zielińskiego, który to tłumaczył. Za to tutaj jest krok po kroku pokazane na przykładach, co się dzieje.
Dariusz Pawlukiewicz - Dlaczego nie powinniśmy używać async void ?

#cleancode
Erik Dietrich - The Most Important Code Metrics You’ve Never Heard Of

#aspnet
Kajetan Duszyński - SOCIAL COOKING – AUTENTYKACJA W WEBAPI

#dotnetcore
Andrew B Hall - Experimental .NET
@Sarseth: zależy. Jak zasięg jest krótki, a zmienna będzie używana wielokrotnie w jednej linijce, to lepiej zrobić skrót. Np. "i" jest dużo lepsze niż "index" jako nazwa zmiennej którą iterujemy.

Do tego IMHO fizyczne i matematyczne skróty są lepsze, niż opisowe nazwy (np x,y,r,m zamiast left, top, radius, mass). Ale to jeszcze zależy od kontekstu.

Jak scope zmiennej jest większy niż kilka linijek - to zgoda, że skrótowce są złe.

PS
  • Odpowiedz
Mirki, zastanawiam się nad kupnem książki "Zwinne wytwarzanie oprogramowania. Najlepsze zasady, wzorce i praktyki" Roberta C. Martina. Mam pytanie do kogoś kto miał do czynienia z tą książką: w jakim języku są podane w książce przykłady? Wiem że "Clean Code" był w Javie, natomiast jeżeli chodzi o tą książkę to spotkałem okładki z C#, ale też bez żadnego oznaczenia. Tak, wiem że nie ma to znaczenia, pewnie i tak to kupię. Jednak
@mateusz-sus: Spraw, by język nie miał znaczenia.

Serio, język to tylko składnia i biblioteka standardowa – w więszkości przypadków nie ma jakichś szokujących różnic w stosunku do innych języków.

Jeśli czegoś nie rozumiesz: to google. Ewentualnie jakiś podstawowy kurs z języka. W pewnym momencie będziesz rozumieć co raz więcej i język przestanie być barierą. A przy okazji taka lingwistyka sprawi, że będziesz miał szersze spojrzenie na programowanie ogólnie.
  • Odpowiedz
@MacDada: @Kaczus2B: Nie no spoko, znam C++, uczyłem się go ponad 2 lata. Moje pytanie nie było w stylu "Bueee, wszędzie C++", bo i tak kupię tą książkę. Pytałem ponieważ obecnie piszę w Javie i liczyłem na to, że mogą się tam pojawić jakieś kruczki specyficzne dla Javy co ułatwiłoby mi naukę. Ale dzięki za odpowiedź.
  • Odpowiedz
Hej miraski. Mam problem projektowy i zastanawiam się jak go rozwiązać, żeby nie pogwałcić zasady Open-Closed Principle.

Przypuśćmy, że mamy klasę abstrakcyjną

Shape
. Mamy też kilka klas konkretnych, tj.

Circle
,

Triangle
, wszystkie dziedziczą po

Shape
i implementują metodę

draw
. Do tej pory wszystko jest zajebiście, OCP jest zachowana, super. Potrzebuję jednak metody, powiedzmy o takiej sygnaturze:

Shape getProperShape(Whatever someArgument)
która na podstawie odpowiedniej wartości argumentu zwróci mi obiekt
@Marmite: Przykładowo tak działa (#php) Symfony Serializer.

Zanim dane/obiekty zostaną zserializowane np do JSONa, muszą zostać „spłaszczone” („znormalizowane”) do prostych danych. Każdy normalizator implementuje NormalizerInterface z dwiema metodami:

normalize()
i

supportsNormalization()
.

Serializer przyjmuje normalizatorów w konstruktorze, a kiedy ma coś zserializować, to iteruje po normalizatorach i korzysta z tego, który twierdzi, że potrafi obsłużyć przekazane dane.

Tym samym Serializer nie ma ścisłych powiązań z danymi, na których ma działać
  • Odpowiedz
Pytanie w stylu "straszna pierdoła, ale w sumie mnie nurtuje": Wszędzie zaleca się, żeby wartości przechowujące booleany zaczynały się od "is" i dalej przymiotnik. No dobra, a co z takimi zmiennymi jak

doesPathContainStartElement
? Brzmi okej czy raczej zamieniać na dziwnie brzmiącą formę z is (

isPathContainingStartElement
- brzmi niegramatycznie, w życiu bym tak nie powiedział) czy może jeszcze inaczej to rozwiązać (

isStartElementContainedInPath
etc)?

#programowanie #cleancode