Programistyczne WTF jakie Was spotkały

Odpowiedz Nowy wątek
2009-04-03 11:31
rnd
11

Dziś w pracy moim oczom ukazała się klasa na 30k linijek. W jednym pliku.
Jeszcze jestem w szoku :-D
A jakie Wy mieliście WTF?


#define TRUE FALSE
//Happy debugging suckers :D
edytowany 2x, ostatnio: Demonical Monk, 2011-12-04 00:47

Pozostało 580 znaków

2019-06-21 22:57
3

ladowanko

No to się naczekam :O

I jak to się skończyło? - Silv 2019-06-21 23:37
No nie miałem cierpliwości i zrobiłem restart aplikacji. Plus teraz zmieniłem VS na 19 na prywatnym kompie i nie powinno się już pojawić - błąd raczej dotyczył starszych wersji :D - LowSkiller 2019-06-22 09:58
Ale właściwie co to znaczy "to reload project"? - Silv 2019-06-22 15:53

Pozostało 580 znaków

2019-06-24 11:36
3

Code review C++. metoda uruchamiana raz na 15 minut - dosłownie.

void Class::Method(Arg arg)
{
    static std::vector<Data> tab;
    const auto _ = utils::finally([] { tab.clear(); });

    ....
}

Pytam się autora czemu to tak wygląda, bo jest to dziwne: "Optymalizacja pamięci" :|


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
w8, a C++ nie robi przypadkiem tego sam przy wychodzeniu z funkcji? Z racji RAII. - hauleth 2019-06-24 12:41
wystarczy wywalić static i drugą linijkę. Jak ktoś chce optymalizować pamięć to lepiej dopisać tab.reserve(jakasWartosc) (ale i tak jest to premature optimization). Wystarczy, że ktoś użyje tej metody w innym kontekście z innego wątku i będzie babol jakich mało. - MarekR22 2019-06-24 12:47
Aaaaa, rzeczywiście nie zauważyłem tego static. WTF? Dzięki bogom, że obecnie jak muszę zejść tak nisko to mam Rusta :D - hauleth 2019-06-24 12:48
Nie wiedziałem, że w C++ możesz nazwać zmienną _ - Pijak 2019-06-24 23:16
@Pijak: a czemu niby nie? - hauleth 2019-06-25 00:07
@hauleth: nie wiem, nie pomogę panu - Pijak 2019-06-25 10:03

Pozostało 580 znaków

2019-06-24 11:46
0
Integer sum = someMethod().anotherMethodA().anotherMethodB().anotherMethodC().anotherMethodD().anotherMethodE().anotherMethodF().anotherMethodG().anotherMethodH().anotherMethodI().anotherMethodJ().anotherMethodK();
edytowany 1x, ostatnio: au7h, 2019-06-24 11:46
Pokaż pozostałe 2 komentarze
przy kilku metodach to jeszcze spoko, ale jeżeli tam już jest z 10 tych metod to robi się miazga xD - au7h 2019-06-24 11:50
Różnie, jeśli jest to ładnie sformatowane to może być całkiem czytelne, nawet przy 10 metodach. - hauleth 2019-06-24 12:42
jeśli każda z tych metod jest z innego modułu, to jest to programistyczne WTF, które nawet ma nazwę: "train wreck". Jeśli te metody są czymś w stylu LinQ to jest to dość poręczne. - MarekR22 2019-06-24 12:43
Przykład mojego autorstwa (nie 10, ale 9 funkcji w ciągu) i powiedziałbym, że jest dość czytelnie. - hauleth 2019-06-24 12:47
A ja Tak wlasnie lubie tylko kazda metoda od bowej linijki. Tak sie pisze np. w Apache Camelu z tego co widzialem - Julian_ 2019-08-08 11:57

Pozostało 580 znaków

2019-06-24 14:42
0

https://www.wykop.pl/wpis/422[...]il-ikone-swiat-powariowal-he/


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Romek i Zenek wzięli ślub w Holandii. Kogo boli dupa w noc poślubną? Polski katotaliban. - Koziołek 2019-06-24 14:48
To trochę jak z flagami Francji na Fejsie. Jakoś flag Libii czy innej Palestyny nie widziałem, a też ich tam równali ostro bronią wszelaką. Takie wybiórce "wspieranie" osób, które nie mają z tym nic wspólnego. Groteskowe. - Marooned 2019-06-24 15:03
@Marooned: ok, jest to groteskowe, ale z drugiej strony jak popytasz tych ludzi, to okaże się, że we własnej firmie właściciel może robić, co chce i jak robi, to im przeszkadza. - Koziołek 2019-06-24 15:05
No jasne. Nie odlajkowuję za to stron na Fejsie, ale zwiększam dystans. To trochę jak omawiany dziś w innych komentarzach parytet aktorski, gdzie nawet w filmie o Eskimosach wypada by pojawił się Murzyn, Azjata i niepełnosprawna kobieta. - Marooned 2019-06-24 15:07
Chyba trzeba otworzyć jakiś nowy sturtup: coś w rodzaju SebaGit jedyny prawilny prawicowy version control. Widać, że jest na to zapotrzebowanie. - Tomek Pycia 2019-07-03 07:19

Pozostało 580 znaków

2019-06-24 15:52
13

CR
Code Review hinduskiego kodu ;)

Pokaż pozostałe 45 komentarzy
To zależy od kontekstu. Inaczej się podchodzi do pisania biblioteki, albo innego kodu używanego w wielu miejscach, a inaczej, jeśli to jest coś, co będzie wykorzystane tylko w 1 miejscu. isEmpty może się przydać, więc bym nie wywalał. Ale jeśli np. robisz aplikację sterującą automatyką, a klient zmienił sprzęt w fabryce, przez co zostały tylko sterowniki typu A, to bardzo sensowne jest usunięcie kodu odpowiedzialnego za obsługę urządzeń typu B, bo na pewno już do niczego on się już nie przyda. isEmpty, nawet jeśli chwilowo nieużywane, ma sens istnienia. - cerrato 2019-07-03 09:45
@cerrato to jest to co napisałem wyżej: Dla mnie „funkcja nie jest użyta” nie jest powodem dla jej usunięcia. Powodem jest „funkcja nie jest i nie będzie użyta, bo nie jest już potrzebna, została zastąpiona czym innym itp.” - Azarien 2019-07-03 09:46
No to dobra wiadomość - chyba mamy zgodność w tym zakresie :) - cerrato 2019-07-03 09:51
@Azarien dałbym suppressa, ale z komentarzem TODO, by sprawdzić za jakiś czas czy ta funkcja faktycznie do czegoś została użyta - viader 2019-07-03 09:52
tylko to musiałbym faktycznie widzieć użyteczność tej funkcji w najbliższym czasie - viader 2019-07-03 09:53

Pozostało 580 znaków

2019-07-03 18:42
7

Naprawdę ktoś miał na tyle śmiałości żeby w oficjalnej dokumentacji wpisać "or something? ;|

screenshot-20190703184155.png


edytowany 1x, ostatnio: TomRiddle, 2019-07-03 19:38
Pokaż pozostałe 15 komentarzy
@Silv: pytanie brzmi czy każdy Countable można nazwać collection, bo właśnie Countable tyczą się count(). I myślę że tak, można. - TomRiddle 2019-07-03 22:33
@PerlMonk - hamuj się z takimi komentarzami [usunąłem] - Marooned 2019-07-04 09:27
@Marooned: A taką fajną analogię zrobiłem :( - PerlMonk 2019-07-04 09:45
@PerlMonk: Nieadekwatną i nieodpowiednią, imo - TomRiddle 2019-07-04 09:47

Pozostało 580 znaków

2019-07-05 09:55
2

Może nie jest to programistyczne (chociaż jakby nie patrzeć to programowanie się za tym kryje), ale tak dzisiaj rzuciło mi się w oczy.

WTF.png

  • WTF.png (0,36 MB) - ściągnięć: 9
edytowany 1x, ostatnio: XardasLord, 2019-07-05 09:56
Pokaż pozostałe 6 komentarzy
@XardasLord na kafelku masz temperaturę w tej samej skali co aktualnie ustawioną w apce Pogoda. odpal Pogodę i przestaw na C. - Azarien 2019-07-09 16:12
@Patryk27 mam nadzieję, że nigdy nie będziesz odpowiedzialny za żaden UX - sugar_hiccup 2019-07-09 17:56
@sugar_hiccup: ale musisz to pisać na forum? - Silv 2019-07-09 18:08

Pozostało 580 znaków

2019-07-07 13:56
3

Ja dziś miałem nieco poważniejszy problem z t-mobile:
screenshot-20190707135515.png

Na szczęście w PDF już podali numer umowy :)

Niniejszym składam wypowiedzenie umowy o numerze NULL zawartej dnia UNDEFINIED ;) - cerrato 2019-07-07 15:18
Niestety, kara za wcześniejsze wypowiedzenie wynosi NaN - orchowskia 2019-07-07 17:30
@orchowskia: gorzej jakby inf - Pijak 2019-07-07 21:06

Pozostało 580 znaków

2019-07-07 14:05
2
orchowskia napisał(a):

Ja dziś miałem nieco poważniejszy problem z t-mobile:
screenshot-20190707135515.png

Na szczęście w PDF już podali numer umowy :)

Mi Virgin przysyla rachunek do 6 miejsc po przecinku
Witaj, w dniu 12/04/2019 wystawilismy fakture VAT na 10,166179 zl z platnoscia do 29/04/2019. Aktualne saldo Twojego konta to 10,17 zl do zaplaty. Dokonaj platnosci na konto ...


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
Pokaż pozostałe 2 komentarze
Za to za wielkosc tego rachunku ;] - stivens 2019-07-08 10:53
Trzymanie hajsu w typie zmiennoprzecinkowym... przecież to aż ręce opadają na taką głupotę. - Kamil Raju 2019-07-24 23:19
Skad wiesz jak trzymaja hajs? - stivens 2019-07-24 23:20
Myślisz, że to tylko frontend źle formatuje? Nie wiem, ja mam przed oczami, że wartość tej faktury w DB będzie dokładnie taka jak na rachunku. - Kamil Raju 2019-07-24 23:23
Trudno powiedziec - stivens 2019-07-24 23:26

Pozostało 580 znaków

2019-07-09 15:30
8

WTF z wczoraj:

Dodaję nowe funkcje do istniejącego kodu. Potrzebuję obiektu, który będzie ważny przez czas trwania całego żądania i będzie dostępny z dowolnego miejsca tak aby nie dodwac nowego parametru do każdej z 23459408 metod z 3545 warstw. Szukam, szukam, w końcu... JEST! To jest dokładnie to, czego mi potrzeba: RequestLocal<T>. Ma metody get() i set(). Aaa, no tak, czyli to jest taki jakby ThreadLocal<T> ale dla requestu, świetnie.

Rzucam się w wir kodowania, dopisuję static RequestLocal<X> costam = new RequestLocal<X>() i....
WTF?! RequestLocal jest interfejsem a nie klasą!

Szybki rzut oka w istniejący kod, w celu dowiedzenia się, jak się tego wynalazku używa. Okazuje się, że jak chcesz dodać własny RequestLocal:

  1. Musisz napisać nowa klasę (nazwijmy ją X), która implementuje RequestLocal<X.State>
  2. W klasie X musisz zdefiniować klasę wewnętrzną State, przechowującą stan współdzielony w kontekście requestu.
  3. W klasie X musisz dać pole ThreadLocal<X.State> które stanowi faktyczne miejsce składowania stanu, zarządzane przez set() i get().
  4. W klasie X musisz dodać statyczne pole public static X instance = new X(), aby inne fragmenty kodu miały do tego wynalazku dostęp.
  5. W interfejsie RequestLocal trzeba dopisać do pewnej tablicy ten X.instance
  6. W kolejnej klasie RequestLocals trzeba też uzupełnić kod o ten X.instance
  7. W paru innych miejscach trzeba dorzucić kod aby prawidłowo nasz stan X.State kopiował się między wątkami i faktycznie był ten sam dla całego requestu.

Jak napisałem innemu programiście, że to jest trochę "dziwny" design, to odpisał, że faktycznie, ale to tylko dlatego, że użyto dziedziczenia a nie kompozycji. :D
Chciałem być miły, więc nie przyznałem: "Tak, to na pewno przez brak kompozycji."


WTF z dzisiaj:

Mam komunikat klasy Message. Pytam kolegę, co wysyła te komunikaty do zdalnego serwera. Odpowiedź: ChannelWriter. Faktycznie, jest taka klasa i ma nawet pole queue z kolejką komunikatów do wysłania. Jak dotąd, całkiem logiczne. Szukam w kodzie ChannelWriter, gdzie jest jakieś "weź z kolejki i wrzuć do kanału", a tu zonk - nie ma. Szukam jeszcze raz. No, wtf, po prostu, nie ma! No to szukam jeszcze wystąpienia channel.write czy czegoś podobnego i znajduję takie coś:

channel.write(this), gdzie this to instancja... ChannelWriter.

Serio zajęło mi dobre kilkanaście minut rozczajenie jak to w ogóle działa, mimo że to w sumie banalnie proste:
Otóż na channelu jest zainstalowany (w innym miejscu) handler, który wyłapuje ten wrzucony ChannelWriter uprzednio zrobiwszy rzutowanie z Object, czyta jego kolejkę (package private), serializuje każdy komunikat i wysyła do kanału. :D Oczywiście kod handlera w zupełnie innym miejscu niż ChannelWriter.

edytowany 3x, ostatnio: Krolik, 2019-07-09 15:40
Pytanie czy ci programiści znają coś takiego jak code review - Sarrus 2019-07-09 15:38
Znają, znają. To jest wszystko kod, który przeszedł review, testy itp. I programiści raczej za 10k+ (USD miesięcznie). Idę po podwyżkę... - Krolik 2019-07-09 15:41
Najbardziej się denerwuję, właśnie jak widzę kod, który ogólnie wygląda nieźle i sprawia wrażenie uporządkowanego, przemyślanego i potencjalnie dobrego ale potem wgłębiam się w szczegóły i widzę jakiś WTF który praktycznie przekreśla wszystko co na początku pomyślałem. To takie uczucie jakbyś przeglądał elegancki kod aplikacji webowej opartej na MVC i nagle natrafił na CSSy w modelu. - Krolik 2019-07-09 15:56
Innymni słowy - nie mogę powiedzieć o tym kodzie, żeby to było takie najeżone błędami spaghetti jak kiedyś w innej firmie, która kodowała głównie studentami. Nasz kod jest zły w znacznie bardziej wyrafinowany sposób. - Krolik 2019-07-09 15:58
A to nie miało być użycie java traits, które poszło źle;p albo jest źle używane? - xxx_xx_x 2019-07-09 18:17
No raczej nie. Bo efekt tego jest taki, że de-facto całą logikę RequestLocal każdy implementator implementuje sobie sam. W sumie ten interfejs ma znikomy (żaden) sens, bo większość (całość?!) kodu i tak odwołuje się do konkretnych implementacji. - Krolik 2019-07-09 18:37

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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

Robot: Googlebot