konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Jakub Fila:
(...)
Zachęcam do przeglądania starych kodów pisanych w Fortranie,C,Cobolu w latach 80tych i 90tych, nie celem powielania stylu, ale spojrzenia na to, jak programiści radzili sobie z potencjalnymi problemami wydajnościowymi.

Chyba tylko po to aby potraktować to jako ciekawostkę historyczną :)

Temat: Wywołanie metody obiektu zawartego w kolekcji

Sergiusz B.:
Jakub Fila:
(...)
Zachęcam do przeglądania starych kodów pisanych w Fortranie,C,Cobolu w latach 80tych i 90tych, nie celem powielania stylu, ale spojrzenia na to, jak programiści radzili sobie z potencjalnymi problemami wydajnościowymi.

Chyba tylko po to aby potraktować to jako ciekawostkę historyczną :)

Oraz walczyć z "RAM is cheap and thinking hurts" :)

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Adrian Olszewski:

Oraz walczyć z "RAM is cheap and thinking hurts" :)

Do tego nie trzeba wertować źródeł Cobola z lat 80, naprawdę :)
Kamil Sławiński

Kamil Sławiński Senior iOS Developer

Temat: Wywołanie metody obiektu zawartego w kolekcji

W czasach kiedy często jednym z najistotniejszych kryteriów jest czytelność i łatwość utrzymania kodu, warto zerknąć czasem na konstrukcje krytyczne wydajnościowo (również te sprzed lat). Przydałby się wątek z takimi właśnie perełkami (jak np: InvSqrt() użyty w grze Quake 3). Jeżeli chodzi o kwestię języka programowania tych konstrukcji nie wydaje mi się on aż tak istotny(ważne żeby był zrozumiały dla większości), natomiast analiza stosowanego podejścia jest jak najbardziej wartościowa.
Jakub Fila

Jakub Fila Inżynieria / finanse
/ zarządzanie

Temat: Wywołanie metody obiektu zawartego w kolekcji

Sergiusz B.:

Chyba tylko po to aby potraktować to jako ciekawostkę historyczną :)

Napisałem przecież, że nie w celach kopiowania konstrukcji (tym bardziej, że to nie OOP), ale żeby sprawdzić, jak optymalizowano kod.

Tymczasem, starczy zajrzeć w dowolny kod pisany dziś na potrzeby dużych klientów bankowość, ubezpieczenia, ewidencje itp.) i włos się jeży na głowie, kiedy się widzi ogromną ilość rzutowań, nieoptymalnie pisane sql'e, ogromną ilość zagnieżdżeń itp. Potem mamy sytuacje, w których przy zwykłym obciążeniu mamy dziesiątki procesorów, a i tak nie wystarcza...

Kolejna rzecz, którą lubią programiści .NET, oraz Java (ja przyznam, że też), to wykorzystywanie refleksji tam gdzie trzeba i tam gdzie nie trzeba, podczas gdy to naprawdę kosztuje...

Zboczyliśmy jednak nieco z głównego tematu.

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Jakub Fila:
Sergiusz B.:

Chyba tylko po to aby potraktować to jako ciekawostkę historyczną :)

Napisałem przecież, że nie w celach kopiowania konstrukcji (tym bardziej, że to nie OOP), ale żeby sprawdzić, jak optymalizowano kod.

Wtedy były zupełnie inne cele optymalizacji niż teraz. Mikro-optymalizacja dzisiaj b. często jest źródłem problemów, a nie korzyści. Dzisiaj systemy są kilka klas bardziej złożone niż wtedy i krytyczna jest wydajna architektura, design systemu, modułów, a nie kilka milisekund wygrane na jakichś stuczkach z ery assemblera. Kluczem jest znajomość mechaniki .NETa kiedy np. on generuje dodatkowy kod "pod maską", o którym nie wiemy, a który dodaje pracy GC i tym samym spowalnia całość.

Tymczasem, starczy zajrzeć w dowolny kod pisany dziś na potrzeby dużych klientów bankowość, ubezpieczenia, ewidencje itp.) i włos się jeży na głowie, kiedy się widzi ogromną ilość rzutowań, nieoptymalnie pisane sql'e, ogromną ilość zagnieżdżeń itp.

No właśnie - nie trzeba znać kodu Carmacka na pamięć aby przystrzegać pewnych podstawowych reguł (zresztą .NET ma bardzo silną matematykę). Sam widziałem taki śmieciowy kod i to często pisany przez programistów wielkich firm, np. pewna duża firma na A, albo C, albo I :) Niestety tak to właśnie jest jak szukając optymalizacji kosztowej do pisania kodu zatrudnia się świeżo upieczonych studentów, praktykantów czy juniorów...
Kolejna rzecz, którą lubią programiści .NET, oraz Java (ja przyznam, że też), to wykorzystywanie refleksji tam gdzie trzeba i tam gdzie nie trzeba, podczas gdy to naprawdę kosztuje...

Refleksja jest b. kosztowna i wielu ludzi tego nie rozumie - vide jeden z przykładów w tym wątku...

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Sergiusz B.:
Refleksja jest b. kosztowna i wielu ludzi tego nie rozumie - vide jeden z przykładów w tym wątku...

Sądzę,że potrawisz uważnie i ze zrozumieniem czytać to co jest napisane. Także zrozumiałeś zapewne, ze to był raczej taki przykład dla sztuki a nie odpowiedź na pytanie autora wątku. Refleksja jest kosztowna, ale są zastosowania, do których jest stworzona. Swoją drogą w zamieszczonym przykładzie narzutu nie ma dużego na czas wykonania, dzięki temu, że metoda jest generyczna i defacto typy są dostarczane od razu, nie ma potrzeby ładowania assembly.
Ale z refleksji można korzystać chociażby w przypadku, gdy dostarczamy możliwość uruchamiania pluginów w aplikacji. Dzięki niej możemy sprawdzić kod, który dostarcza, ktoś i go zweryfikować, czy posiada odpowiednie metody, typy itp..
Przydatna jest również jeśli chcemy dynamicznie w trakcie trawnia wykonania np podmienić biblioteki bez potrzeby ponownego uruchamiania całej aplikacji ( różne np. serwerowe aplikacje, które muszą działać cały czas) i podmienić w locie definicje pewnych metod. Jest wiele zastosowań do których refleksja się przydaje i w wielu jest używana. Ale to wszystko za pewne wiesz:)
Odpowiem prosto : rozumiem to, ale są czasami momenty, w których narzut jest akceptowalny, chociażby w takich przykładach jw. :) Oczywistym jest, że jeśli mam to być często używany fragment to użycie refleksji nie jest najlepszym wyjściem.Łukasz Machowski edytował(a) ten post dnia 30.05.10 o godzinie 19:30

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Łukasz Machowski:

(...)
I nie lubię ludzi, którzy nie potrafią czy nawet celowo nie chcą powiedzieć konkretnie o kogo im chodzi. I prosiłbym nie sugerować, bo to nie ma nic wspólnego z profesjonalizmem, który swego czasu podnosiłeś, w którejś dyskusji.

Łukasz, jeśli uraziłem Ciebie tą wypowiedzią to przepraszam - nie takie były intencje. Następnym razem proponuję tego typu sprawy załatwiać na priv, to tak a propos profesjonalizmu :) no i mniej emocji, w końcu jesteśmy tutaj po to aby sobie nawzajem pomagać i uzupełniać wiedzę, której napewno masz sporo.

Tę grupę czyta wielu juniorów dlatego uważam, że podając przykłady powinniśmy też opisywać trochę kontekst, a nie tylko kawałek kodu.

Co do ładowania assembly to pomimo tego, że metoda jest generyczna .NET i tak załaduje assembly jeśli aktywowany typ pochodzi z zewnątrz. Przeważnie dzieje się to na etapie start-upu aplikacji kiedy JIT analizuje całe drzewo kodu i ładuje wszystko co napotka (m.in. stąd takie duże "working sety" aplikacji .NET, szczególnie Windows Formsowych).

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Sergiusz B.:
Łukasz, jeśli uraziłem Ciebie tą wypowiedzią to przepraszam - nie takie były intencje. Następnym razem proponuję tego typu sprawy załatwiać na priv, to tak a propos profesjonalizmu :) no i mniej emocji, w końcu jesteśmy tutaj po to aby sobie nawzajem pomagać i uzupełniać wiedzę, której napewno masz sporo.

Tak można to odebrać. Skoro nie zamierzone to było to ja również przepraszam, za Swoje słowa. Co do priv, to ja na skrzynkę nic nie dostałem:)
Tę grupę czyta wielu juniorów dlatego uważam, że podając przykłady powinniśmy też opisywać trochę kontekst, a nie tylko kawałek kodu.

Odwiedza wiem. Ale mam nadzieję, że nie bierze wszystkiego za pewnik, tylko sprawdza i się upewnia.
Co do ładowania assembly to pomimo tego, że metoda jest generyczna .NET i tak załaduje assembly jeśli aktywowany typ pochodzi z zewnątrz. Przeważnie dzieje się to na etapie start-upu aplikacji kiedy JIT analizuje całe drzewo kodu i ładuje wszystko co napotka (m.in. stąd takie duże "working sety" aplikacji .NET, szczególnie Windows Formsowych).

Tak, ale jeśli pochodzi z wewnątrz to już go i tak załadował i nie będzie tego robił za każdym razem, mimo , że samo wywołanie będzie dynamiczne. Także w konkretnie tym przypadku nie będzie to znaczący narzut na wydajność. Chociaż zgadzam się, jeśli miałby czytać to za każdym razem z assembly innego i często wykonywać to było by to wolne. Na podobnej zasadzie działa Composite UI Application Block. Ładuje wszystko na starcie i dynamicznie podczas startu buduje.Composite Application Guidance for WPF and Silverlight działa podobnie, chociaż tutaj mamy większe możliwości już i możemy łądować dopiero na żądanie użycia.Łukasz Machowski edytował(a) ten post dnia 30.05.10 o godzinie 20:28

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

http://www.flickr.com/photos/deia/6460689/ - drugi rząd, środkowy obrazek.

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

osobiście wolę tą wersję:

Obrazek

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Tę grupę czyta wielu juniorów dlatego uważam (...)
no właśnie, dlatego warto od razu podkreślić, że lepiej dostać InvalidCastException niż nic nie mówiący NullReferenceException.

Reasumując (dla juniorów):
1. mojArrayList[0] as JakisMojTyp - zwraca null'a, jak się nie uda
2. (JakisMojTyp)mojArrayList[0] - wyrzuca InvalidCastException

Ad.1: antycypując nulla nie powinniśmy tworzyć takiej kontrukcji:
(mojArrayList[0] as JakisMojTyp).JakasMetodaTypu()

Uzasadnienie: NullReferenceException po prostu nie podaje prawdziwej przyczyny i tym samym utrudnia diagnozę błędu -> zwiększa koszt produkcji softu.

Dla mnie NullReferenceException to zmora śniąca się po nocach:)

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

maciek kański:

Ad.1: antycypując nulla nie powinniśmy tworzyć takiej kontrukcji:
(mojArrayList[0] as JakisMojTyp).JakasMetodaTypu()

Dlatego też dodałem, że elementy kolekcji nietypowanej powinny być weryfikowane gdzieś indziej, najlepiej (pod kątem wydajności, ale to też zależy od specyfiki kodu) przy dodawaniu / modyfikowaniu tych elementów.
Uzasadnienie: NullReferenceException po prostu nie podaje prawdziwej przyczyny i tym samym utrudnia diagnozę błędu -> zwiększa koszt produkcji softu.

A o stack-trace słyszeli? ;) Na poważnie to im więcej o wyjątku wiemy tym oczywiście lepiej.

Skoro już jestesmy przy kosztach produkcji to o ile ten exception zwiększa te koszta? :)Sergiusz B. edytował(a) ten post dnia 04.06.10 o godzinie 14:36

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Sergiusz B.:
Dlatego też dodałem, że elementy kolekcji nietypowanej powinny być weryfikowane gdzieś indziej,
Dodałeś dopiero po fakcie. Jeżeli się zgadzasz to po prostu popraw swojego posta tak, aby juniorzy, o których się martwisz, nie nabrali złych nawyków od doświadczonego PMa:)
Na poważnie to im więcej o wyjątku wiemy tym oczywiście lepiej.
Więc jeżeli się zgadzasz to nie wiem po co komentujesz, zamiast się poprawić. Przecież uwagę zwrócono Ci już 10 dni temu!
Skoro już jestesmy przy kosztach produkcji to o ile ten exception zwiększa te koszta?
Skoro zgodni jesteśmy, że zwięszka to chyba wystarczy. Nie zmianiajmy tematu (dla dobra czytających to juniorów) - chcesz o kosztach, załóż drugi wątek.

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Maciek, nie spinaj się tak - to szkodzi na nerwy ;)

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Maciek, zauwaz ze kolega Sergiusz az przez dwa lata byl programista i to od razu Seniorem i Team Leaderem takze moze miec racje......

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Pawel K.:
Maciek, zauwaz ze kolega Sergiusz az przez dwa lata byl programista i to od razu Seniorem i Team Leaderem takze moze miec racje......

W Warszawie czas płynie bardziej intensywnie :)

Na poważnie to Panowie proponuje skończyć już wymianę tych uprzejmości, ew. zapraszam na priv jeśli ktoś czuje nieodpartą potrzebę.

Miłego dnia.

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

maciek kański:
Reasumując (dla juniorów):
1. mojArrayList[0] as JakisMojTyp - zwraca null'a, jak się nie uda
2. (JakisMojTyp)mojArrayList[0] - wyrzuca InvalidCastException

Jeszcze dokładniej (Juniorom :-)) zasada na ogół jest taka:
1. używamy mojArrayList[0] as JakisMojTyp wtedy kiedy możemy dostać instancje objektu typu JakisMojTyp ale niekoniecznie musimy czyli wtedy kiedy jeśli objekt nie jest typu JakiśMojTyp jest sytuacją naturalną. Np. mamy kolekcję w której jest wiele typów i chcemy tylko na jednym z nich coś zrobić. Temu przebieg programu jest kontrolowany poprawnie za pomocą instrukcji warunkowych a nie wyjątków.

2. Używamy (JakisMojTyp)mojArrayList[0] kiedy mojArrayList[0] musi być typem JakisMojTyp a jeśli nie jest to znaczy że z programem dzieję się coś złego. Wtedy w catchu mamy obsługę nietypowej sytułacji i jakąś ścieżkę awaryjną (ale nie inną ściżkę jak w przypadku if/else).

Sergiusz:
Skoro już jestesmy przy kosztach produkcji to o ile ten exception zwiększa te koszta? :)

Wstajesz rano, wychodzisz do pracy, docierasz do pracy, odpalasz komputer, otwierasz ałtluka i widzisz maila:
Witam,
Dziś po uruchomienu programu system się zawiesił po czym dostałem taki komunikat:
InvalidCastException in
a.b.c()
d.e.f()
g.h.i()
Proszę o szybkie zdiagnozowanie i zlikwidowanie usterki. Niestety nie będę osiągalny do końca tygodnia ze względu na wyjazd służbowy.
Pozdrawiam,
Klient


pod nim drugi mail:
Witam,
Dziś po uruchomienu programu system się zawiesił po czym dostałem taki komunikat:
NullReferenceException in
a.b.c()
d.e.f()
g.h.i()
Proszę o szybkie zdiagnozowanie i zlikwidowanie usterki. Niestety nie będę osiągalny do końca tygodnia ze względu na wyjazd służbowy.
Pozdrawiam,
Klient

Który z powyższych maili pozwoli zdiagnozować błąd bez dodatkowych maili z pytaniami do klienta? (który sobie pojechał)

Po którym mailu otwieramy metody i od razu wiemy gdzie jest błąd i po paru godzinach robimy update systemu z nowym patchem?

Klient wyjechał, nie może nam zrobić dump-a, nie może odpowiedzieć (albo nie potrafi).

To są koszta ;-)Karim Agha edytował(a) ten post dnia 11.06.10 o godzinie 01:48

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Karim Agha:

To są koszta ;-)

Dlatego zanim oddamy soft klientowi robimy testy, testy, testy i jeszcze troszeczkę testów i nigdy na testach nie oszczędzamy :)

Poza tym z mojego doświadczenia mogę powiedzieć, że historia troszkę naciągana bo zazwyczaj albo mamy dostęp do środowisk klienta w ramach umowy utrzymaniowej i analizujemy "na miejscu", albo błąd jest replikowany "in-house" z danymi klienta, które ten błąd wygenerowały. Poza tym, jeśli błąd jest ważny to zawsze jest osoba, która ze strony klienta jest kompetentna w temacie (bo to im zależy przede wszystkim), a jeśli nie ma to... no cóż, zawieramy takie kontrakty i takie warunki SLA aby brak dostępności źródła wiedzy po stronie klienta w nas nie biły :)

Jak widać jest mnóstwo możliwości aby zorganizować efektywny flow tego typu incydentów co oczywiście nie zmienia faktu, że znany exception jest lepszy niż nieznany :)

konto usunięte

Temat: Wywołanie metody obiektu zawartego w kolekcji

Sergiusz B.:
Karim Agha:

To są koszta ;-)

Dlatego zanim oddamy soft klientowi robimy testy, testy, testy i jeszcze troszeczkę testów i nigdy na testach nie oszczędzamy :)

Poza tym z mojego doświadczenia mogę powiedzieć, że historia troszkę naciągana bo zazwyczaj albo mamy dostęp do środowisk klienta w ramach umowy utrzymaniowej i analizujemy "na miejscu", albo błąd jest replikowany "in-house" z danymi klienta, które ten błąd wygenerowały. Poza tym, jeśli błąd jest ważny to zawsze jest osoba, która ze strony klienta jest kompetentna w temacie (bo to im zależy przede wszystkim), a jeśli nie ma to... no cóż, zawieramy takie kontrakty i takie warunki SLA aby brak dostępności źródła wiedzy po stronie klienta w nas nie biły :)

Jak widać jest mnóstwo możliwości aby zorganizować efektywny flow tego typu incydentów co oczywiście nie zmienia faktu, że znany exception jest lepszy niż nieznany :)

Masz 100% racji...
... ale tylko w przypadku oprogramowania na zamówienie ;-)

Następna dyskusja:

iteracja po parametrach met...




Wyślij zaproszenie do