"To twoja opinia"

0

zdarzylo mi sie slyszec takie i podobne "argumenty" (miedzy innymi zawierajace odniesienia do mojej plci i powiazanej z nia tendencji do histerii, ignorancji i upierdliwosci).
na zywo zwykle ciezko mi odszczekac na brak merytorycznych argumentow, arogancje i buractwo, pozostaja mi rzeczowe komentarze przy code-review czy maile. oprocz lepszego przygotowania pozwalaja one na utrzymanie poziomu dyskusji (mozna sobie lepiej radzic z czyjas erystyka) i historii dialogu.
mimo to zdarzylo mi sie dotrzec do "ostatecznego" argumentu (po innych ciezkich dzialach typu "nie mamy teraz na to czasu"), tzn - jestem leadem, to ja jestem odpowiedzialny za projekt, wole gorszy kod bo jestem do niego przyzwyczajony, nie zgadzam sie na marnowanie czasu na takie dyskusje, koniec tematu, jak ci sie nie podoba to zmien prace :)

jesli chodzi o pracownikow ktorzy sa mniej wiecej na rowni w hierarchii to nie ma usprawiedliwienia na robienie fuszerki.
oczywiscie zgadzam sie ze nie ma co slepo podazac za standardami, ale jesli ktos chce olac powszechnie znane i uzywane dobre praktyki to musi umiec to argumentowac. jesli nie umie a zamiast tego odwoluje sie do anegdotek, braku czasu na jakosc, swojego doswiadczenia ("zawsze tak robie") czy staje sie wobec ciebie nieuprzejmy to jest zwyczajnym glabem ktorego najprawdopodobniej nie da sie zreformowac (zwlaszcza jesli jest juz "seniorem").

jak z tym walcze? tak jak wczesniej pisalam - komentarze w code review czy maile. ale przede wszystkim dbam o swoj kod, pisze go wg najwyzszych standardow na jakie sobie moge pozwolic w danej chwili. jak mam okazje to wywalam lub naprawiam kod kolegow jesli tylko dotyka mojej nowej funkcjonalnosci/fixa i moze ja zepsuc lub obnizyc jej walory. gdy widze ze ktos obniza jakosc komponentow za ktore jestem odpowiedzialna przez glupie praktyki to punktuje to i prosze o zrobienie jak nalezy, jak nie dziala to daje do szefa info ze od tej pory nie recze za to czy to bedzie dzialalo jak nalezy.

0
Aventus napisał(a):

Wyjaśnię trochę swoją wypowiedź bo widzę że niektórzy mają tutaj jakieś problemy z czytaniem że zrozumieniem lub popełniają jakieś logiczne błędy. Albo jedno i drugie...

Szanowny OP, pytasz o konkretne argumenty lub dowody. Jak już pisałem wyżej ja się z Tobą zgadzam co do argumentacji w przykładach które wymieniles, a odpowiedzi Twoich rozmówców w stylu "to Twoja opinia" są trochę bez sensu i ciężko z kimś takim prowadzić dalszą dyskusje. Jest to trochę jak argumentum ad persona, gdzie w zasadzie ten "argument" jest po prostu ostateczna próbą sprzeciwu przy wyczerpaniu innych argumentów.

Wskazuję natomiast- i wydawało mi się że jest to dosyć proste- że o ile Twoje intencje są słuszne, to kierujesz się tutaj całkowicie błędnym przekonaniem jakoby Twoje argumenty opiniami nie były. Otóż są - dla czego? Chciałeś jakich konkretnych dowodów, więc proszę:

https://sjp.pwn.pl/slowniki/opinia.html

Chyba najważniejszy punk w tym kontekście: orzeczenie specjalisty na jakiś temat

Ty natomiast, jak i kilka innych osób tutaj traktujesz opinię jak fakt:

https://sjp.pwn.pl/slowniki/fakt.html

I tu głównym punktem powinien być fakt naukowy: stwierdzenie konkretnego stanu rzeczy lub zdarzenia w określonym czasie i przestrzeni.

Czy jesteś w stanie tak właśnie stwierdzić/określić, najlepiej za pomocą matematyki, że magiczne liczby to zło? Oczywiście że nie, bo jest to (słuszna) opinia.

Więc zamiast bawić się w jakieś ustawianie użytkowników w szeregu, ustalanie zasad, wypowiadane się w imieniu "czołowych członków" forum czy ucinanie dyskusji kiedy Tobie ona nie odpowiada, czytaj proszę ze zrozumieniem a wtedy wszystko będzie łatwiejsze i uniknie się nieporozumień. No bo inaczej, to czy tak bardzo różnisz się od współpracowników których krytkujesz?

Tak jest w sposób naukowy sposób stwierdzić, że liczby magiczne to zło.

Dostarczam identyczny kod w dwóch wersjach z i bez liczb magicznych.
Dla każdego kodu tworze dwie losowe grupy programistów i wszystkim zlecam to samo zadanie nieco zmieniające nieco funkcjonalność tego kodu.
Mierzę czas, ile każdej grupie to zajęło, oraz przepuszczam kod przez testy sprawdzające poprawność zmian.
Zapewniam cię, że wyniki będą jednoznaczne.
Zwracam toją uwagę, że koszt nie pisania liczb magicznych jest mały i liniowy.
Natomiast ten eksperyment na pewno udowodni, że koszt radzenia sobie z obecnością liczb magicznych jest duży i ma złożoność wyższą liż liniową.

Nie mam środków, czasu, ani chęci, by wykonać taki eksperyment, ale napisałem to pokazać, że to co ty nazywasz opinią, jest jak najbardziej mierzalne w sposób obiektywny i można dojść w sposób naukowy do wartościowych wniosków. Ergo to nie jest opinia, bo doświadczanie wielu programistów potwierdza moje słowa.

https://en.wikipedia.org/wiki/Magic_number_(programming) tu masz zalety i wady używania stałych lub ich nie używania.


Jeśli twoja odwiedź "To twoja opina" jest w sensie 3 znaczenia, to dziękuję bardzo :P.
0

"Tak, to moja opinia i ja ją całkowicie podzielam." :-P

0

Chciałem tylko zaznaczyć, że dla mnie nie ma aż tak wielkiego znaczenia jaka była konkretna opinia @MarekR22 czy jego rozmówcy. I nawet zaznaczyłem, że być może moja opinia się różni od OP.

Co więcej wbrew temu co pisze @Wibowit nie uznaję jakiegoś tzw. konsensusu. Jest raczej mainstream, z którym się spotykam (ale wcale się z nim nie zgadzam w 100%).. Co gorsza prawie każda, nawet z mojego punktu widzenia głupia, opinia ma swoich wyznawców i łatwo ich znaleźć w sieci. Co gorsza ten mainstream ewoluuje, wczorajsze best practices to dzisiejsze anty wzroce.

Tak czy siak, w pracy duze znacznei ma wyrobienie takich standardów, praktyk, przy których wszyscy dadzą radę efektywnie pracować. Zwykle oznacza to jakiś zgniły kompromis w podejściu.

I taki zgniły kompromis jest dużo lepszy niż jak ktoś urywa dyskusję dość słabym tekstem "to twoja opinia" - czyli, że współpraca go wali i nie ma ochoty rozmawiać. Z takim podejściem dawno się już nie spotkałem (choć 15 lat temu się spotykałem).

0
MarekR22 napisał(a):

Dostarczam identyczny kod w dwóch wersjach z i bez liczb magicznych.

Dla każdego kodu tworze dwie losowe grupy programistów i wszystkim zlecam to samo zadanie nieco zmieniające nieco funkcjonalność tego kodu.
Mierzę czas, ile każdej grupie to zajęło, oraz przepuszczam kod przez testy sprawdzające poprawność zmian.
Zapewniam cię, że wyniki będą jednoznaczne.
Zwracam toją uwagę, że koszt nie pisania liczb magicznych jest mały i liniowy.
Natomiast ten eksperyment na pewno udowodni, że koszt radzenia sobie z obecnością liczb magicznych jest duży i ma złożoność wyższą liż liniową.

Nie mam środków, czasu, ani chęci, by wykonać taki eksperyment, ale napisałem to pokazać, że to co ty nazywasz opinią, jest jak najbardziej mierzalne w sposób obiektywny i można dojść w sposób naukowy do wartościowych wniosków. Ergo to nie jest opinia, bo doświadczanie wielu programistów potwierdza moje słowa.

https://en.wikipedia.org/wiki/Magic_number_(programming) tu masz zalety i wady używania stałych lub ich nie używania.


Jeśli twoja odwiedź "To twoja opina" jest w sensie 3 znaczenia, to dziękuję bardzo :P.

Gdyby Twój przykład wprowadzić w życie to aż się prosi o krytykę i potrzebę kolejnego eksperymentu, i kolejnego... Bo sam fakt że w grupach będą różni programiści, o różnych doświadczeniach i możliwościach stawia to wszystko pod znakiem zapytania. Ponieważ jak już pisałem, to nie jest coś wymiernego. A przynajmniej wymiernego w najczystszej postaci, bo sam fakt że można podać jakieś liczby na bazie doświadczenia nie oznacza że wyniki te są niepodważalnym i ostatecznym dowodem na jakąś teze.

Inna sprawa że całkowicie zignorowales definicje faktu.

Co do Twojego ostatniego zdania to nie mam pojęcia o co Ci chodzi.

1

Ok myślę, że temat główny został wyczerpany.
Wielkie dzięki wszystkim.

Szczególne podziękowania dla tych, którzy trzymali się tematu "jak sobie z tym radzić" i cenią sobie wysoki profesjonalizm w naszej branży.

Ciekawe techniczne rozwiązania problemu:

Dzięki też za linki i rady o technikach erystycznych zachowaniu w w pracy (poczytam jak będę miał czas, spróbuję sam stosować te metody)

Dziękuję też, tym którzy dali się ponieść emocją (bo znowu im ktoś zawraca głowę jakimiś liczbami magicznymi, złożonością funkcji itp) i rozpoczęli offtop iż podane przez mnie przykłady to faktycznie moja opinią.
Przypomnę pytanie:

MarekR22 napisał(a):

"To twoja opinia"

Jak wy sobie radzicie, z tym wytrychem, który tak naprawdę jest zawoalowaną odpowiedzią: nie mam argumentów i nie przyznam ci racji lub nawet mam gdzieś twoje argumenty?

Mimo, że ewidentnie był to offtop, to lubię czasem podyskutować i sprawiło mi to przyjemność mimo, że jedynie jeden adwersarz faktycznie spróbował rzeczowo argumentować.
Nie dostąpiłem satysfakcji przekonania do swoich racji, ale za to zaobserwowałem wypowiedzi charakterystyczne dla słabości argumentacji adwersarza i czasami taka satysfakcja jest wystarczająca.


Jeszcze jedno: ktoś podlinkował definicję [opinii](https://sjp.pwn.pl/slowniki/opinia.html) co podsunęło pomysł mi taki tok rozmowy: - To twoja opinia - Dziękuje, - Że co? - Myślałem, że użyłeś słowa opinia zgodnie ze znaczeniem: orzeczenie specjalisty na jakiś temat

Oczywiście nie można tego stasować w rozmowie ze zwierzchnikiem.

1

Możesz stosować te metody. Ale sformułowałeś pytanie w sposób nie wprost. Wprost brzmiałoby: "Uważam, że zawsze mam rację, a inni lubią to podważać. Jakie macie metody na radzenie sobie z tym problem i przekonanie ich, że to ja i tylko ja mam rację, a jeśli nie uda się ich przekonać, to jak wymusić, żeby robili tak, jak ja wymyśliłem"

To nie jest w ogóle problem programistyczny, a psychologiczny. Powinieneś popytać na innych forach. Tam więcej metod ci zaproponują.

0
Aventus napisał(a):
MarekR22 napisał(a):

Dostarczam identyczny kod w dwóch wersjach z i bez liczb magicznych.

Dla każdego kodu tworze dwie losowe grupy programistów i wszystkim zlecam to samo zadanie nieco zmieniające nieco funkcjonalność tego kodu.
Mierzę czas, ile każdej grupie to zajęło, oraz przepuszczam kod przez testy sprawdzające poprawność zmian.
Zapewniam cię, że wyniki będą jednoznaczne.
Zwracam toją uwagę, że koszt nie pisania liczb magicznych jest mały i liniowy.
Natomiast ten eksperyment na pewno udowodni, że koszt radzenia sobie z obecnością liczb magicznych jest duży i ma złożoność wyższą liż liniową.

Nie mam środków, czasu, ani chęci, by wykonać taki eksperyment, ale napisałem to pokazać, że to co ty nazywasz opinią, jest jak najbardziej mierzalne w sposób obiektywny i można dojść w sposób naukowy do wartościowych wniosków. Ergo to nie jest opinia, bo doświadczanie wielu programistów potwierdza moje słowa.

https://en.wikipedia.org/wiki/Magic_number_(programming) tu masz zalety i wady używania stałych lub ich nie używania.


Jeśli twoja odwiedź "To twoja opina" jest w sensie 3 znaczenia, to dziękuję bardzo :P.

Gdyby Twój przykład wprowadzić w życie to aż się prosi o krytykę i potrzebę kolejnego eksperymentu, i kolejnego... Bo sam fakt że w grupach będą różni programiści, o różnych doświadczeniach i możliwościach stawia to wszystko pod znakiem zapytania. Ponieważ jak już pisałem, to nie jest coś wymiernego. A przynajmniej wymiernego w najczystszej postaci, bo sam fakt że można podać jakieś liczby na bazie doświadczenia nie oznacza że wyniki te są niepodważalnym i ostatecznym dowodem na jakąś teze.

Inna sprawa że całkowicie zignorowales definicje faktu.

Co do Twojego ostatniego zdania to nie mam pojęcia o co Ci chodzi.

Ta argumentacja dowodzi, że jesteś tak sztywny w swoich poglądach, że by bronić swojej pozycji, będziesz nawet podważał metodę naukową.
By uznać tą odpowiedz za sensowną, to trzeba by było wyrzucić za okno, większość osiągnięć naukowych ostatnich kilkuset lat.
Np medycynę bo testowanie leków na ludziach lub zwierzętach są według ciebie niemiarodajne, bo sam fakt że ludzie albo zwierzęta są tak różni między sobą to "potrzebę kolejnego eksperymentu, i kolejnego... . Ponieważ jak już pisałeś, to nie jest coś wymiernego." (FYI czas developera to coś wymiernego i mierzy się nie tylko w sekundach godzinach, ale też w złotówkach/dolarch/euro)

Gdybyś chciał faktycznie podważyć mój argument, w sposób sensowny to wystarczyłoby napisać:
"no ja jestem przekonany, że w tym eksperymencie nie będzie różnicy w wynikach dal obu grup, bo naprawdę te zasady są tylko wymysłem"
To byłby silny i trudny do zbicia argument, bo jedyny sensowny sposób na jego odbicie to przeprowadzenie takiego eksperymentu i potem dyskusja na temat jego wyników.

Jak widzisz powyżej jestem na tyle elastyczny iż jestem w stanie kłócić się sam z sobą i zbijać swoje własne argumenty.

Zwróć uwagę, że twoja argumentacja ma jeszcze jedną wadę. Nie jest bezpośrednią odpowiedzią na moje stwierdzenie, w którym mówię, że to się da zmierzyć. Ty zmyślasz błędy proceduralne w pomiarze, którego nie przeprowadziłem. To jest technika charakterystyczna dla hochsztaplerów, którzy mówią, że potrafią naładować energetycznie wodę osobę itp. Wszelkie próby weryfikacji ich twierdzeń kończą się ich twierdzeniami, że coś nie tak było z procedurą pomiarową. Poprawa procedury pomiarowej nic nie daje, bo kolejna procedura ma kolejne zmyślone wady.

Jednak najciekawsze jest dla mnie czemu nie wpadłeś na przytoczony przez mnie kontr argument? W końcu jest on najbardziej oczywisty. Czemu zamiast tego zdecydowałeś się atakować procedurę pomiarową?
Ja widzę tylko jedno wyjaśnienie: doskonale zdajesz sobie sprawę, że wynik poparłby moje twierdzenia.
Ergo należy podejrzewać, że gdzieś w głębi duszy/umysły rozważasz (a może nawet uważasz), że te zasady dobrego programowania mają sens i są obiektywne.
Nie będę drążył z czego to wynika, bo to byłby offtop do offtopu i wiem, że dyskusja zejdzie na "nieciekawe tory".
Z drugiej strony skoro to gdzieś siedzi w tobie, jest szansa, by cię przekonać.

0

Zacząłem się zastanawiać: skąd ten "opór materii"?
Czemu pewna grupa developerów mówi kategorycznie nie?
Myślę, że jest to po prostu wynik różnicy doświadczeń zawodowych.
Mój pierwszy projekt był mały i robiłem go sam prze około dwa miesiące. Dostałem go po prostu na przyuczenie.
Potem wysłano mnie do projektu, gdzie była statyczna analiza kodu, metryki, coverity itp (typowe corpo).
Automaty sprawdzały kod dosłownie co do spacji, poprawność nazw symboli itd.
Pierwsze 3 dni były upierdliwe (narzekałem), prze kolejny tydzień narzekania się skończyły i automaty nadal mnie poprawiały, potem wyrobiły się we mnie takie odruchy, że automaty czepiały się mnie rzadko. Po 6 miesiącach nawyki się wyrobiły i weszły w krew, by w końcu zostać uznane za programistyczne abecadło.
Przed tym doświadczaniem całkiem prawdopodobnie podzielałbym opnie, że wymagani typu: unikanie liczb magicznych, krótkie funkcje mała liczba augmentów, to fanaberia. Pamiętam jak debugowanie takiego kodu mnie wnerwiało, bo debuger ciągle skakał gdzieś indziej.

Domyślam się, zwolennicy "To twoja opinia" nie mają takich doświadczeń zawodowych i zawsze pracowali w firmach, gdzie nie używa się takich narzędzi i nie wymusza na developerach przestrzegania takich zasad, czyli nigdy nie mieli okazji wyrobić sobie tych nawyków, by potem je docenić.

W corpo to się bardziej praktykuje z wielu powodów:

  • rotacja ludzi jest większa
  • czas życia projektu w corpo zwykle jest dużo większa
  • w corpo zwykle wytwarza się produkty wymagające długiego utrzymania
  • dla corpo cena tych narzędzi jest pomijalnie mała (dla małych firm każdy kosz jest za duży)

Z tych powodów corpo chętnie stosują takie narzędzia.

Dlatego mam pytanie do @kulson @Aventus @WeiXiao czy wasze doświadczenia pasują do tej teorii?
Czy dobrze podejrzewam, że nigdy was zmuszono przez co najmniej 6mc do przestrzegania tych zasad?

W sumie to bardzo dobry argument, gdy znowu usłyszę, "to twoja opinia".

1

Ergo należy podejrzewać, że gdzieś w głębi duszy/umysły rozważasz (a może nawet uważasz), że te zasady dobrego programowania mają sens i są obiektywne.

Pominę resztę Twojej odpowiedzi bo widzę że ładnie ukladasz sobie własny tok dyskusji, co ktoś powinien odpowiedzieć itp. Chyba masz problemy z czytaniem ze zrozumieniem lub logiczną interpretacją wypowiedzi, szczególnie jeśli odbiegają one od Twojej ustalonej wizji (np. wizji mnie nie zgadzająego się z wymienionymi przez Ciebie dobrymi praktykami). Przecież ja kilkakrotnie napisałem że co do samej kwestii tych dobrych praktych programowania w pełni się zgadzam. Nigdzie też nie napisałem że nie są one obiektywne. Na tym kończę bo nie mam zwyczaju rozmawiać z ludźmi którzy przekręcają moje wypowiedzi lub ich sens. Pozdrawiam.

Domyślam się, zwolennicy "To twoja opinia" nie mają takich doświadczeń zawodowych i zawsze pracowali w firmach, gdzie nie używa się takich narzędzi i nie wymusza na developerach przestrzegania takich zasad, czyli nigdy nie mieli okazji wyrobić sobie tych nawyków, by potem je docenić.

W mojej pracy używa się chociażby ustawienia R# tak aby wymuszał pewne praktyki, standardy itp. Do tego faile buildów. Sam brałem udział w ustalaniu tych zasad, między innymi właśnie wymuszenie unikania magicznych liczb. Oczywiście Ty jedyne co zrozumiałeś ze wszystkich wypowiedzi to to że ja jestem przeciwny stosowaniu takich dobrych praktyk. Twój tok rozumowania nie różni się w zasadzie niczym od toku rozumowania typowego, zaslepionego wyborcy którejkolwiek z głównych partii. Ty dosłownie nie dostrzegles, lub świadome zignorowales moje wypowiedzi w którym wyraźnie przedstawiłem swoje zdanie na temat dobrych praktyk programowania, następnie przypisaleś mi łatkę kogoś kto jest temu przeciwny. Godne pozalowania.

4

@MarekR22: powiedziało już to wielu, ale prawda jest taka, że dopóki badania o jakim mówiłeś nie przeprowadzisz lub nie pokażesz wyników badań które już ktoś wykonał to jest to tylko "Twoja opinia". Niestety, nasza branża jest na tyle 'inna' lub po prostu niedojarzała, że duża część wszystkich dobrych praktyk to tylko opinie, większej lub mniejszej liczby osób (ale o tym to już wszyscy chyba mówili). Jeżeli chodzi o odpowiedź na Twoje pytanie, ja sobie z tym radziłem tak:

  1. Trzeba mieć dojrzały zespół, dla którego jakość jest ważna i jego członkowie chcą się rozwijać. Innych nie przyjmujemy, a jeżeli ktoś już taki w zespole się znalazł no to trzeba się z nim pożegnać.
  2. Z góry zakładam, że 'to moja opinia', więc pisząc jakiś komentarz nie mówię "ta metoda jest za długa!", tylko raczej "moim zdaniem ta metoda jest za długa, można ją poprawić w taki sposób: ......" (staram się też dodać dlaczego warto), lub zamiast podawać gotowy sposób zachęcam do znalezienia czegoś lepszego. Zasada jednak jest prosta, ktoś może odbić pałeczkę, powiedzieć, że nie zna lepszego sposobu i wtedy Ty musisz go podać. Jeżeli nie, to obecny pomysł zostaje. Oczywiście jeżeli okaże się, że ktoś nie ma zamiaru poprawiać swoich rozwiązań z definicji to wracamy do punktu pierwszego.
  3. Jeżeli chodzi o jakieś narzędzia do analizy kodu, to ja miałem z tym spory problem. Mieliśmy sonara z jakimiś chyba defaultowymi ustawieniami. Często pokazywał różne rzeczy do poprawy które moim zdaniem nie miały sensu. Jeżeli ktoś mi wytknął taki błąd w review, zazwyczaj pytałem dlaczego będzie lepiej jak poprawie. Rzadko kiedy odpowiedź była inna niż "sonar będzie zielony". To mnie niestety nie przekonuje.
  4. Ustalanie metryk takich jak: "metody nie dłuższe niż 15 linii", "nie więcej niż 4 argumenty", "80% pokrycia kodu" też nie zawsze mnie przekonują. No bo dlaczego akurat 15 linii a nie 16? Dlaczego 80% pokrycia a nie 90% (przez to czasem trzeba pisać bezsensowne testy, albo nie można jakichś usunąć jak nie spełniają swojej roli itp.)?
  5. Żeby rozwiązać problemy 3. i 4. trzeba po prostu ustalić jakieś zasady i założyć że je przestrzegamy i koniec, nawet jak nie mają sensu. Nigdy nie udało się czegoś takiego wdrożyć, nie wiem nawet czy ten pomysł mi się podoba, ale wydaje mi się, że może to przynieść wiecej pożytku niż szkód.

Moim zdaniem (i tak, jest to tylko moja opinia :) ) najważniejsze jest zbudowanie odpowiedzialnego i dojrzałego zespołu, który dąży do budowania dobrych rozwiązań, chce się rozwijać i jest otwarty na konstruktywną krytykę i dyskusje. W przypadku konflitków dyskusja powinna być rzeczowa, a decyzja podjęta opierając się o analize potencjalnych zysków i start. Oczywiście zanim założy się, że wszystko to wina zespołu warto zastanowić się czy samemu spełnia się te wszystkie kryteria. ;)

Edit:
Zapomniałem jeszcze o demokracji i odwołaniu się do osoby najbardziej kompetentej / odpowiedzialnej (np. team leada). W przypadku 'miękkich' spraw, typu nazwy zmiennych, metod itp. można zrobić nawet głosowanie w zespole co jest dla nich bardziej odpowiednie, bo przecież kto jak nie zespół czyta kod który piszemy. Jeżeli chodzi o sprawy bardziej techniczne, no to możemy zapytać osoby odpowiedzialnej za projekt lub najbardziej kompetentej w danym temacie.

6
MarekR22 napisał(a):

Jak wy sobie radzicie, z tym wytrychem, który tak naprawdę jest zawoalowaną odpowiedzią: nie mam argumentów i nie przyznam ci racji lub nawet mam gdzieś twoje argumenty?

No generalnie najprościej, to unikać pracy z takimi osobami, nawet jeśli oznaczałoby to zmianę firmy. Do ściany nie ma sensu gadać.

Dobre praktyki powstają na bazie doświadczenia, a nie opinii. Ileś osób robiąc coś w sposób X napotkało pewne problemy, dlatego głoszą, że lepiej działać w sposób Y, których tych problemów nie powoduje. Brak problemów przy korzystaniu z drugiego sposobu jest faktem - nie opinią.

Poza tym, inżynieria oprogramowania nie jest nauką lecz dziedziną techniki i opiera się na doświadczeniu oraz intuicji, a nie metodach naukowych. Dobre praktyki nie są hipotezami, więc żądanie ich udowadniania w sposób naukowy są objawem niewiedzy o tym, jak właściwie nauka działa. Można się próbować bawić w takie coś, ale to raczej nie będzie miało żadnej wartości praktycznej, i z inżynierskiego punktu widzenia będzie bezużyteczne. Żaden profesjonalista nie żąda dowodów naukowych na to, że dobre praktyki są dobre, bo sam się o tym przekonał.

1

Co tu się znowu dzieje.

Od kiedy czyjeś opinie służą do rozwiązywania problemów.?

Problem autora jest taki, że nie potrafi wyargumentować tego, dlaczego dane rozwiązanie jest gorsze lub lepsze, ponieważ nie jest to wynik jego analizy problemu, lecz zapatrywanie się w jakieś bezsensowne regułki typu 40 linijek kodu w funkcji to za dużo, etc.

Może podaj jakiś konkretny przykład.

1

"To Twoja opinia"
Chyba w takim przypadku najlepiej odpowiedzieć "Masz rację, tak samo jak Twoja opinia. Tylko że ja swoją podpieram doświadczeniem i ustalonymi w branży dobrymi praktykami. Zwolennikami tego są znacznie lepsi niż my specjaliści tacy jak X, Y, Z." tutaj dobrze gdyby można było przedstawić konkretne cytaty, artykuły itp jeśli jest na to czas i możliwość, następnie "Czy Ty możesz przedstawić jakieś konkretne materiały mówiące aby używać magic numbers lub pisać długie metody? Czy może opierasz swoje zdanie wyłącznie na własnych preferencjach?" jeśli wprost powie że to preferencje to trzeba dodać że nie ma na nie miejsce w zespole.

Jeśli do kogoś coś takiego nie przemówi to cóż, głową betonu nie przebijesz. Lepiej unikać dyskusji z takimi ludźmi a najlepiej z nimi nie pracować. A jak ma się moc decyzyjną to po prostu nakazać (oczywiście po odpowiedniej argumentacji)- z czasem zrozumieją.

Ponadto Twoja odpowiedź mówiąca o definicji słowa opinia wcale nie jest zła, chociaż jest bardziej żartobliwa.

0

"Masz rację, tak samo jak Twoja opinia. Tylko że ja swoją podpieram doświadczeniem i ustalonymi w branży dobrymi praktykami. Zwolennikami tego są znacznie lepsi niż my specjaliści tacy jak X, Y, Z."

Argumenty w stylu, Ja swoją opinię podpieram doświadczeniem albo ustalonymi regułami i dobrymi praktykami, są dla mnie zawsze tak samo żałosne.

To pokaż mi cwaniaku jak zrefaktoryzujesz tą metodę.
Tak żeby było mniej ifów i mniej linijek.

public static void GenerateThumbnailFromImage(ThumbnailSize size)
        {
            var pictureHeight = System.Drawing.Image.FromStream(Image.Stream).Height;
            var pictureWidth = System.Drawing.Image.FromStream(Image.Stream).Width;

            var destHeight = size.Height;
            var destWidth = size.Width;

            int newHeight;
            int newWidth;

            int heightToCrop;
            int widthToCrop;

            if (pictureHeight < destHeight || pictureWidth < destWidth)
                throw new Exception("Actula size can't be less than target size");

            if (pictureHeight == pictureWidth && destHeight == destWidth)
            {
                newHeight = destHeight;
                newWidth = destWidth;
                widthToCrop = 0;
                heightToCrop = 0;
            }
            else if ((decimal)destHeight / pictureHeight == (decimal)destWidth / pictureWidth)
            {
                newHeight = destHeight;
                newWidth = destWidth;
                widthToCrop = 0;
                heightToCrop = 0;
            }
            else if ((decimal)destHeight / pictureHeight > (decimal)destWidth / pictureWidth)
            {
                var ratio = (decimal)destHeight / pictureHeight;

                newHeight = destHeight;
                newWidth = (int)(ratio * pictureWidth);
                heightToCrop = 0;
                widthToCrop = newWidth - destWidth;
            }
            else
            {
                var ratio = (decimal)destWidth / pictureWidth;

                newHeight = (int)(ratio * pictureHeight);
                newWidth = destWidth;
                heightToCrop = newWidth - destHeight;
                widthToCrop = 0;
            }

            var newStream = DrawImageService.DrawThumbnail(
                newHeight, newWidth,
                heightToCrop, widthToCrop,
                Image.Stream);

            Thumbnail = new Thumbnail(newStream, Image.Name);
        }     

0

Argumenty w stylu, Ja swoją opinię podpieram doświadczeniem albo ustalonymi regułami i dobrymi praktykami, są dla mnie zawsze tak samo żałosne.

Nie chce mi się wdawać w kolejną dyskusję więc odpowiem szybko. Jeśli mowa o czymś niewymiernym matematycznie, to czym innym chcesz się podpierać jak nie doświadczeniem i opiniami ekspertów (te z kolei znów bazowane na doświadczeniu)?

To pokaż mi cwaniaku jak zrefaktoryzujesz tą metodę.

Co to ma wspólnego z tym co napisałem? Czy Ty również będziesz mi próbował wcisnąć coś czego nie napisałem jako moje własne słowa? Spróbujesz zaraz powiedzieć że ja twierdzę że metody powinny być nie dłuższe niż X linijek kodu, i nigdy więcej?

Na kod nawet nie patrzę, nie lubię jak ktoś stosuje jakieś tanie zaczepki w stylu nazywania mnie cwaniakiem.

0

Masz Jaro testy


[TestFixture]
    class GenerateThumbnailFromImage : PictureTestBase
    {
        [Test]
        public void GenerateThumbnailFromImage_WhenHeightAspectRatioIsBiggerThanWidhtAspectRatio_ReturnsCorrectValue()
        {
            var picture = CreatePicture(300, 800);
            picture.GenerateThumbnailFromImage(new ThumbnailSize(150, 200));

            var thumbailSize = GetThumbailSizeFromPicture(picture);

            Assert.AreEqual(expected: 150, actual: thumbailSize.Height);
            Assert.AreEqual(expected: 400, actual: thumbailSize.Width);
        }

        [Test]
        public void GenerateThumbnailFromImage_WhenHeightAspectRatioIsLessThanWidhtAspectRatio_ReturnsCorrectValue()
        {
            var picture = CreatePicture(600, 300);
            picture.GenerateThumbnailFromImage(new ThumbnailSize(150, 200));

            var thumbailSize = GetThumbailSizeFromPicture(picture);

            Assert.AreEqual(expected: 400, actual: thumbailSize.Height);
            Assert.AreEqual(expected: 200, actual: thumbailSize.Width);
        }

        [Test]
        public void GenerateThumbnailFromImage_WhenTargetSizeIsBiggerThanActulaSize_ThrowsException()
        {
            var picture = CreatePicture(200, 300);

            Assert.Throws<Exception>(() =>
                    picture.GenerateThumbnailFromImage(new ThumbnailSize(999999, 200)));
        }

        [Test]
        public void GenerateThumbnailFromImage_WhenActualSizeAndTargetSizeAreEqual_ReturnsTheSameSize()
        {
            var picture = CreatePicture(200, 300);
            picture.GenerateThumbnailFromImage(new ThumbnailSize(200, 300));

            var thumbailSize = GetThumbailSizeFromPicture(picture);

            Assert.AreEqual(expected: 200, actual: thumbailSize.Height);
            Assert.AreEqual(expected: 300, actual: thumbailSize.Width);
        }
    }
0

Kilka uwag do kodu - jak go poprawisz:

  if (pictureHeight == pictureWidth && destHeight == destWidth)
            {
                newHeight = destHeight;
                newWidth = destWidth;
                widthToCrop = 0;
                heightToCrop = 0;
            }
            else if ((decimal)destHeight / pictureHeight == (decimal)destWidth / pictureWidth)
            {
                newHeight = destHeight;
                newWidth = destWidth;
                widthToCrop = 0;
                heightToCrop = 0;
            }

Tu jest dwa razy powtórzeone to samo w ifie.
Wywal warunki do metody IsSameAspect(... ) która w środku będzie miała:

((pictureHeight == pictureWidth && destHeight == destWidth) 
|| ((decimal)destHeight / pictureHeight == (decimal)destWidth / pictureWidth)``

I już zmniejszysz drabinkę ifów.

EDIT:
Trudniejszy będzie krok następny czyli wywalenie wszystkich ifów.
I zrobienie tego w jednym kroku.
Możliwe, że się da - trzeba tylko użyć operacji max i min. Złapałeś mnie niestety w podróży i nie dam rady się dobrze nad tym pochylić do jutra. (a to już nie jest sprawa na 5 minut).8

0

Ta dyskusja przypomina mi debaty antyszczepionkowców, próbujących udowodnić, że szczepionki nic nie dają, równie dobrze jest się nie szczepić, nie zaszczepiłem się i nic mi nie jest, więc tak można i to jest tak samo ok jak szczepienie. Dobre praktyki to nie tylko wypracowane doświadczeniem reguły, ale także wnioski na podstawie pomiarów i badań milionów wierszy kodu i zachowań tysięcy programistów. Wszelkie limity są oczywiście umowne, tak jak umowne jest, że człowiek staje się dorosłym po 18-ce, a umowa polega na tym, że znakomita większość ludzi w tym wieku jest w stanie zachowywać się jak dorośli, a ci którzy jeszcze nie muszą się dostosować. Takie są reguły społeczne.
Stosowanie dobrych praktyk nie jest obwarowane żadnymi sankcjami prawnymi, i są zalecanymi zachowaniami w znakomitej większości przypadków. Wynikają z korzyści jakie zostały wypracowane z ich użyciem. Celowe zaprzeczanie im bez znajomości skąd się wzięły i dlaczego tak jest "dobrze" jest sabotowaniem profesji. Co nie znaczy, że w jakimś odsetku przypadków czasami lepiej je złamać, ale trzeba być świadomym dlaczego i po co to robimy, jakie mogą być skutki nie tylko dla siebie ale i innych.
Niektórzy próbują wmówić Markowi, że chce wmuszać swoją opinię, a ona jest tylko równoprawna z prywatną kontropinią. A ja mam wrażenie, że jest dokładnie odwrotnie, dorobek czołówki branży, na który Marek się powołuje, poparty nie tylko doświadczeniem ale i badaniami, próbuje traktować się na równi z własnym widzimisię. Prywatnie to każdy może mieć dowolne zdanie na własny użytek i gdy skutki takiego widzimisię odczuwa na własnej skórze. Praca w branży to wejście w społeczność, która pewnych zachować wymaga dla wspólnego dobra.
Tak jak w przypadku szczepionek, ktoś zauważył, że na miliony szczepionych dzieci kilkoro umiera na powikłania a niezaszczepienie tysiąca na setki tysięcy zaszczepionych nie wywołuje żadnych skutków, wyciąga się wniosek, że szczepienia są zbędne i szkodliwe. Owszem wszystko jest dobrze dopóki nie szczepi się garstka kierując się własną "równoprawną opinią", ale jeśli przestanie się szczepić znaczący procent takich "mądrali", to skutki odczują wszyscy. To samo z dobrymi praktykami, jeśli przestanie je stosować znaczny procent programistów, to wydajność produkcji i jakość kodu będzie spadać i zacznie się wpadać w problemy, z których wyleczyliśmy się właśnie stosowaniem dobrych praktyk.

1

Streści mi ktoś, o czym gadaliście przez 5 stron? Bo nie wiem, czy warto to czytać. Już na pierwszej dyskusja była mętna...
Czy doszliście do czegoś więcej niż tylko to, że są różne opinie, ale pewne opinie są bardziej uzasadnione od innych?

4
._. napisał(a):

To pokaż mi cwaniaku jak zrefaktoryzujesz tą metodę.
Tak żeby było mniej ifów i mniej linijek.

ten kod to tragedia, testy jeszcze gorsze ;)

  1. potrzebne sa ze 2 metody - jedna dajaca nowy rozmiar obrazka, druga robiaca krojenie
  2. przeskalowanie rozmiaru to krotka formulka, nie trzeba zadnych ifow i pincet zmiennych
  3. to rzutowanie do decimala jest bezsensowne i bezuzyteczne
  4. uzywanie mutowalnych pol (i to statycznych) to patola level 99
  5. ten wyjatek to taki se

nie chce mi sie juz wiecej wymieniac, w sumie to nie wiem o co chodzi z tym pytaniem, wiem ze nie chcialabym pracowac z kims kto pisze taki kod

0

To pokaż jak to zrobisz bez ifów, bo jak na razie to nie rozumiesz co ten kod robi.

katelx napisał(a):
._. napisał(a):

To pokaż mi cwaniaku jak zrefaktoryzujesz tą metodę.
Tak żeby było mniej ifów i mniej linijek.

ten kod to tragedia, testy jeszcze gorsze ;)

  1. potrzebne sa ze 2 metody - jedna dajaca nowy rozmiar obrazka, druga robiaca krojenie
  2. przeskalowanie rozmiaru to krotka formulka, nie trzeba zadnych ifow i pincet zmiennych
  3. to rzutowanie do decimala jest bezsensowne i bezuzyteczne
  4. uzywanie mutowalnych pol (i to statycznych) to patola level 99
  5. ten wyjatek to taki se

nie chce mi sie juz wiecej wymieniac, w sumie to nie wiem o co chodzi z tym pytaniem, wiem ze nie chcialabym pracowac z kims kto pisze taki kod

0

Znalazłem błąd...

throw new Exception("Actula size can't be less than target size");

Powinno być:

throw new Exception("Actual size can't be less than the target size.");

albo

throw new Exception("Actual size can't be smaller than the target size.");
3
._. napisał(a):

"Masz rację, tak samo jak Twoja opinia. Tylko że ja swoją podpieram doświadczeniem i ustalonymi w branży dobrymi praktykami. Zwolennikami tego są znacznie lepsi niż my specjaliści tacy jak X, Y, Z."

Argumenty w stylu, Ja swoją opinię podpieram doświadczeniem albo ustalonymi regułami i dobrymi praktykami, są dla mnie zawsze tak samo żałosne.

No, to fakt. Argumenty odwołujące się do doświadczenia są niezrozumiałe dla tych, którzy doświadczenia nie zdobywają.

1
somekind napisał(a):
._. napisał(a):

"Masz rację, tak samo jak Twoja opinia. Tylko że ja swoją podpieram doświadczeniem i ustalonymi w branży dobrymi praktykami. Zwolennikami tego są znacznie lepsi niż my specjaliści tacy jak X, Y, Z."

Argumenty w stylu, Ja swoją opinię podpieram doświadczeniem albo ustalonymi regułami i dobrymi praktykami, są dla mnie zawsze tak samo żałosne.

No, to fakt. Argumenty odwołujące się do doświadczenia są niezrozumiałe dla tych, którzy doświadczenia nie zdobywają.

Wielu z tych "doświadczonych" tak w istocie żadnego doświadczenia nie zdobyło - tylko im się tak wydaje.

3

@._.: Nie trzeba być cwaniakiem, żeby bez zaglądania w logikę tej funkcji/metody zauważyć kilka zbędny wierszy (w sumie 10):

public static void GenerateThumbnailFromImage(ThumbnailSize destSize)
        {
            var pictureHeight = System.Drawing.Image.FromStream(Image.Stream).Height;
            var pictureWidth = System.Drawing.Image.FromStream(Image.Stream).Width;

            int newHeight = destSize.Height;
            int newWidth = destSize.Width; 

            int heightToCrop = 0;
            int widthToCrop = 0;

            if (pictureHeight < destSize.Height || pictureWidth < destSize.Width)
                throw new Exception("Actula size can't be less than target size");

            if (pictureHeight == pictureWidth && destHeight == destWidth)
            {   
            }
            else if ((decimal)destHeight / pictureHeight == (decimal)destWidth / pictureWidth)
            {
            }
            else if ((decimal)destHeight / pictureHeight > (decimal)destWidth / pictureWidth)
            {
                var ratio = (decimal)destSize.Height / pictureHeight;

                newHeight = destSize.Height;
                newWidth = (int)(ratio * pictureWidth);
                heightToCrop = 0;
                widthToCrop = newWidth - destSize.Width;
            }
            else
            {
                var ratio = (decimal)destSize.Width / pictureWidth;

                newHeight = (int)(ratio * pictureHeight);
                newWidth = destSzie.Width;
                heightToCrop = newWidth - destHeight;
                widthToCrop = 0;
            }

            var newStream = DrawImageService.DrawThumbnail(
                newHeight, newWidth,
                heightToCrop, widthToCrop,
                Image.Stream);

            Thumbnail = new Thumbnail(newStream, Image.Name);
        }     

Podumaj chwilę, czym się różnią dwa pierwsze warunki za rzucaniem wyjątku. Pierwszy jest szczególnym przypadkiem proporcjonalnego zmniejszania o 0%, gdy stosunki obu wymiarów są równe 1. Więc po co dwa ify jak może być jeden z warunkiem z drugiego ifa. Jak by się zastanowić to i następne warunki może by się udało zwinąć do jednego.
A nazwa funkcji/metody to już patologia i sabotaż: generateThumbnailFromImage i zwraca void, rozumiem, że to generator próżni? FromImage sugeruje, że działamy na obrazku a gdzie on? Każdy by raczej oczekiwał, że jest to jeden z argumentów funkcji, a tu jest tylko rozmiar docelowy. Jeśli to metoda klasy Image to po jakiego grzyba robić masło maślane, wystarczy generateThumbnail bo wiadomo, że działamy na obiekcie Image. No ale to funkcja statyczna, więc skąd ten obrazek? Nikt poza Tobą nie będzie wiedział ja to działa i jak używać. Można psa nazwać kotem i udawać, że jak miauczy to słyszymy szczekanie tylko po co?
Tyle uwag od człowieka bez doświadczenia komercyjnego więc możesz to zignorować. A ile uwag będzie miał ktoś, kto ma doświadczenie komercyjne?

7

Zaczynamy od:

class ImageSize {
	public int Width {get;set;}
	public int Height {get;set;}
}

class DimensionScale{
	public int Value {get;}
	public int Crop {get;}

	public DimensionScale(int destinationValue){
		Value = destValue;
		Crop = 0;
	}
	
	public DimensionScale(int originalValue, int destValue, decimal ratio){
		Value = (int)(originalValue * ratio);
		Crop = Value - destValue;
	}
}

class ScalingParameters{
	public DimensionScale Width {get;set;}
	public DimensionScale Height {get;set;}
}

private static void ThrowIfCannotScale(ImageSize picture, ImageSize thumbnail){
	// You should also check for null values here
	if (picture.Height < thumbnail.Height || picture.Width < thumbnail.Width)
		throw new CannotScaleException($"Actula size cannot be less than target size. Original width = {picture.Width}, height = {picture.Height}. Destination width = {thumbnail.Width}, height = {thumbnail.Height}");
}

private decimal Ratio(int length1, int length2){
	return (decimal)length1 / length2;
}

private bool ScalingNeeded(ImageSize picture, ImageSize thumbnail){
	bool areOfSameSize = picture.Height == thumbnail.Height && picture.Width == thumbnail.Width;
	bool areOfSameRatio = Ratio(picture.Height, thumbnail.Height) == Ratio(picture.Width, thumbnail.Width);
	return !(areOfSameRatio || areOfSameRatio);
}

private static GenerateThumbnail(ScalingParameters scaling){
	var newStream = DrawImageService.DrawThumbnail(
		scaling.Height.Value, scaling.Width.Value,
		scaling.Height.Crop, scaling.WIdth.Crop,
		Image.Stream);

	Thumbnail = new Thumbnail(newStream, Image.Name);
}

private bool ShouldScaleByWidth(ImageSize picture, ImageSize thumbnail){
	return Ratio(picture.Height, Thumbnail.Height) > Ratio(picture.Width, thumbnail.Width);
}

public static void GenerateThumbnailFromImage(ThumbnailSize size)
{
	Image image = System.Drawing.Image.FromStream(Image.Stream);
	var pictureSize = new ImageSize {Width = image.Width, Height = image.Height};
	var thumbnailSize = new ImageSize {Width = size.Width, Height = size.Height};
	
	ThrowIfCannotScale(pictureSize, thumbnailSize);
	
	if(!ScalingNeeded(pictureSize, thumbnailSize){
		GenerateThumbnail(new ScalingParameters{
			Width = new DimensionScale(thumbnail.Width),
			Height = new DimensionScale(thumbnail.Height)
		});
	}else if(ShouldScaleByWidth(pictureSize, thumbnailSize)){
		GenerateThumbnail(new ScalingParameters{
			Height = new DimensionScale(thumbnail.Height),
			Width = new DimensionScale(picture.Width, thumbnail.Width, Ratio(pictureSize.Heigth, thumbnailSize.Height)),
		});
	}else{
		GenerateThumbnail(new ScalingParameters{
			Height = new DimensionScale(pictureHeight, thumbnail.Height, Ratio(pictureSize.Width, thumbnailSize.Width)),
			Width = new DimensionScale(thumbnail.Width),
		});
	}
}     

Dla mnie wystarczy do szczęścia, ale gdy czujemy, że będzie więcej rodzajów skalowań, to każdą gałąź ifa wydziela do czegoś takiego:

interface IScalingStrategy{
	ScalingParameters Scale(ImageSize picture, ImageSize thumbnail);
}

class NoScaling : IScalingStrategy{
	ScalingParameters Scale(ImageSize picture, ImageSize thumbnail){
		if(ScalingNeeded(picture, thumbnail)){
			return null;
		}
		
		return new ScalingParameters{
			Width = new DimensionScale(thumbnail.Width),
			Height = new DimensionScale(thumbnail.Height)
		};
	}
}

class WidthScaling : IScalingStrategy{
	ScalingParameters Scale(ImageSize picture, ImageSize thumbnail){
		if(!ShouldScaleByWidth(picture, thumbnail)){
			return null;
		}
		
		return new ScalingParameters{
			Height = new DimensionScale(thumbnail.Height),
			Width = new DimensionScale(picture.Width, thumbnail.Width, Ratio(pictureSize.Heigth, thumbnailSize.Height)),
		};
	}
}

class HeightScaling : IScalingStrategy{
	ScalingParameters Scale(ImageSize picture, ImageSize thumbnail){
		return new ScalingParameters{
			Height = new DimensionScale(pictureHeight, thumbnail.Height, Ratio(pictureSize.Width, thumbnailSize.Width)),
			Width = new DimensionScale(thumbnail.Width),
		};
	}
}

Co w efekcie daje:


public static void GenerateThumbnailFromImage(ThumbnailSize size)
{
	Image image = System.Drawing.Image.FromStream(Image.Stream);
	var pictureSize = new ImageSize {Width = image.Width, Height = image.Height};
	var thumbnailSize = new ImageSize {Width = size.Width, Height = size.Height};
	
	ThrowIfCannotScale(pictureSize, thumbnailSize);
	
	var scalers = new []{new NoScaling(), new WidthScaling(), new HeightScaling()};
	GenerateThumbnail(
		scalers.Map(s => s.Scale(pictureSize, thumbnailSize)).First(s => s != null)
	);
}     

Oczywiście interfejs jest paskudny, ale u mnie jest niedzielny poranek, więc nie chce mi się go rozbudowywać. Mógłby mieć dwie metody: canScale i Scale, ale to już polerowanie kodu.
Zalety? Jak trzeba nowy rodzaj skalowania, to dokładasz nową strategię i gotowe. Strategie można testować jednostkowo. Metody pomocnicze lecą do jakiejś klasy statycznej, a całą metodę GenerateThumbnail opakowujemy w coś odczytującego pola statyczne i zapisującego je, co daje kompletnie odseparowany kawałek kodu.

Nie kompilowałem, nie testowałem, pokazuję tylko ideę.

2
MarekR22 napisał(a):

Jak wy sobie radzicie, z tym wytrychem, który tak naprawdę jest zawoalowaną odpowiedzią: nie mam argumentów i nie przyznam ci racji lub nawet mam gdzieś twoje argumenty?

Ale po co w ogóle sobie z tym radzić? Jeżeli ktoś chce radośnie tkwić w średniowieczu, to po co go pozbawiać tego snu na jawie? Jeżeli to osoba z zespołu, to spróbuj go przegłosować przekonując do swoich racji innych członków zespołu albo osobę decyzyjną. Jeżeli cały zespół chce tkwić w średniowieczu, to się dostosuj, albo zmień pracę.

Poza tym zastanów się czy w ogóle warto trzymać się jakichkolwiek dobrych praktyk. Ja ostatnimi czasy zacząłem wątpić czy to ma jakikolwiek sens...

Niejaki Jon Schlinkert twórca dziesiątków mikro modułów (mających po kilka linijek kodu), które wrzucił do npm i które przez przypadek zaplątały się w Webpacku i Babelu twierdzi na swoich linkedin, że jego moduły zostały ściągnięte już 2 miliardy razy i używają ich takie tuzy jak Microsoft, Google, NASA itd. Z kolei jak wejdziesz na jego githuba to zobaczysz nie najbrzydszą zieloną trawkę. Pan Schlinkert ma w d. dobre praktyki, albo to żeby jego kod chociaż działał poprawnie. Jego cechą charakterystyczną jest jakiś rodzaj biegunki developerskiej, która jak widać przynosi zamierzony skutek. Osoba postronna niezaznajomiona z tematem może odnieść wrażenie, że to wybitny specjalista, któremu warto zapłacić ciężkie pieniądze za konsulting.

Osobiście poważnie rozważam czy nie porzucić jakości, która często mnie blokuje, na rzecz kreatywnej biegunki programistycznej. Niektórzy mawiają "DONE IS BETTER THAN PERFECT" może warto ich posłuchać?!

1
public static void GenerateThumbnailFromImage(ThumbnailSize size)
{
    var image = System.Drawing.Image.FromStream(Image.Stream);

    int newHeight;
    int newWidth;
    int heightToCrop;
    int widthToCrop;

    if (image.Height < size.Height || image.Width < size.Width)
        throw new Exception("Image size cannot be smaller than thumbnail size.");

    var heightRatio = (float)size.Height / image.Height;
    var widthRatio = (float)size.Width / image.Width;

    if (heightRatio == widthRatio)
    {
        newHeight = size.Height;
        newWidth = size.Width;
        widthToCrop = 0;
        heightToCrop = 0;
    }
    else if (heightRatio > widthRatio)
    {
        newHeight = size.Height;
        newWidth = (int)(heightRatio * image.Width);
        heightToCrop = 0;
        widthToCrop = newWidth - size.Width;
    }
    else
    {
        newHeight = (int)(widthRatio * image.Height);
        newWidth = size.Width;
        heightToCrop = newWidth - size.Height;
        widthToCrop = 0;
    }

    var newStream = DrawImageService.DrawThumbnail(
        newHeight, newWidth,
        heightToCrop, widthToCrop,
        Image.Stream);

    Thumbnail = new Thumbnail(newStream, Image.Name);
}

Proszsz.
Nie sprawdzane.

Żadnych dziwnych strategij i refaktoringu który tylko zaciemnia kod. Struktura funkcji pozostaje w gruncie rzeczy taka sama.
Usunięte zbędne zmienne. Dodane potrzebne zmienne. Zmieniony wyjątek na bardziej sensowny. Wyrzucony pierwszy przypadek if jako nadmiarowy.
I do testów.

3

@Azarien: Głowy nie dam, że jest dobrze, ale można ten kod zapisać zwięźlej, czy to jest czytelne, to już każdy oceni:


public static void GenerateThumbnailFromImage(ThumbnailSize size)
    {
        var image = System.Drawing.Image.FromStream(Image.Stream);
        
        int newHeight = size.Height;
        int newWidth = size.Width;
        int heightToCrop = 0;
        int widthToCrop = 0;
        
        if (image.Height < size.Height || image.Width < size.Width)
            throw new Exception("Image size cannot be smaller than thumbnail size.");
        
        var heightRatio = (float)size.Height / image.Height;
        var widthRatio = (float)size.Width / image.Width;
        
        if (heightRatio > widthRatio)
        {
            newWidth = (int)(heightRatio * image.Width);
            widthToCrop = newWidth - size.Width;
        }
        
        if (heightRatio < widthRatio)
        {
            newHeight = (int)(widthRatio * image.Height);
            heightToCrop = newWidth - size.Height;
        }
        
        var newStream = DrawImageService.DrawThumbnail(
                newHeight, newWidth,
                heightToCrop, widthToCrop,
                Image.Stream);

        Thumbnail = new Thumbnail(newStream, Image.Name);
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1