eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingJakie typowanie jest najlepsze i dlaczego statyczne?
Ilość wypowiedzi w tym wątku: 197

  • 111. Data: 2013-02-08 22:11:45
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: darekm <d...@e...com>

    W dniu 2013-02-08 19:18, Andrzej Jarzabek pisze:
    > On Feb 8, 10:20 am, Maciej Sobczak <s...@g...com> wrote:
    >> W dniu czwartek, 7 lutego 2013 23:07:34 UTC+1 użytkownik Andrzej Jarzabek napisał:
    >>
    >>> Normalnie, reflektujesz, wypisujesz checkboxy, z refleksji wynika, że
    >>> biorąc pod uwagę wszystkich checkboxy A jest lepsze od B, ale A ma tylko
    >>> 5 checkboxów po swojej stronie, a B 15, więc z liczenia wychodzi, że B
    >>> jest lepsze.
    >>
    >> Przepraszam, ale tego kompletnie nie zrozumiałem. Mogę prosić np. o analogię
    samochodową?
    >
    > Nie znam się na samochodach, ale powiedzmy, że porównujesz do floty
    > Forda Mondeo i Bentleya. Przy Bentleyu jest piętnaście checkboxów, a
    > przy Fordzie Mondeo tylko jeden "jest tańszy od Bentleya". Liczysz
    > checkboxy i wychodzi, że powinieneś wybrać Bentleya.
    >

    A może źle dobrane checkboxy, a w zasadzie jest ich za mało
    może powinno się dopisać:

    koszt części zamiennych
    czas oczekiwania na naprawę
    odległość do serwisu
    kosz ubezpieczenia
    prestiż
    reakcja sąsiadów
    możliwość montaży fotelika
    zachowanie w zimie, na mokrej drodze
    awaryjność

    i tak dalej jeszcze np 50..100..300 w zależności od wagi decyzji

    naturalnie to na czym nam bardziej zależy bardziej uszczegółowimy
    rozbijając na zagadnienia elementarne pozbywamy się problemu wag






    --
    Darek




  • 112. Data: 2013-02-09 14:22:40
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: Andrzej Jarzabek <a...@g...com>

    On 08/02/2013 20:56, darekm wrote:
    > W dniu 2013-02-08 18:14, Andrzej Jarzabek pisze:
    >
    >>> To że zawsze możesz użyć wszystko ma swoją drugą stronę: niczego nie
    >>> możesz zabronić. Przy statycznym typowaniu każda funkcja ma
    >>> zdefiniowane dla jakich typów i w jakim kontekście jest poprawna i w
    >>> innych jej nie użyjesz. A wraz ze wzrostem programu liczba kontekstów
    >>> niepoprawnych rośnie szybciej niż tych poprawnych.
    >>
    >> Można ograniczyć ten efekt odpowiednio projektując kod.
    >
    > Przy wsparciu języka to ograniczenie jest skuteczniejsze.

    Ale ma swój koszt.

    >>>> Bo zajmuje czas, bo wprowadza szum do kodu, bo utrudnia refaktoryzację.
    >>>> Może nie zawsze, ale przynajmniej niekiedy.
    >>> Co zajmuje czas: wklepanie kodu? Przecież to jest czas pomijalny.
    >> Wymyślenie zestawu typów i relacji między nimi, odpowiadające
    >> problemowi. Przerabianie tego zestawu w miarę jak problem się zmienia.
    >
    > Co jest prostsze: "odpowiednio" projektować kod, czy tylko wprowadzać
    > więcej typów wraz z ewentualnie duplikowaniem kodu, szczególnie że to
    > ostatnie jest w mniejszym lub większym zakresie mechaniczne.

    Odpowiednie projektowanie jest inne w językach statycznie typowanych niż
    dynamicznie typowanych. W statycznie typowanym języku też możesz mieć
    problem duplikacji kodu, który wykonuje te same operacje, ale na
    niekompatybilnych typach. Żeby zlikwidować ten problem musisz przerobić
    kod np. modyfikując hierarchię typów. Różne języki oferują różne
    idiomatyczne narzędzia do tego, interfejsy i generyki w Javie, w C++
    masz szablony ze specjalizacją i wielodziedziczenie, włącznie z
    dziedziczeniem normalnym i wirtualnym. Nie zawsze jest oczywiste, które
    rozwiązanie jest właściwe, i nie zawsze rozwiązanie, które likwiduje
    duplikację i "działa" ma jeszcze dodatkowo te zalety, że kod jest
    czytelny i łatwy w utrzymaniu.

    > Poza tym struktury danych i relacje między nimi masz dane w
    > specyfikacji. Typy to mechanizm separacji, aby błędnie nie mieszać
    > niewłaściwych struktur i narzędzi.

    W specyfikacji czego? W firmach, w których zdarzyło mi się pracować,
    programiści mieli dane co najwyżej specyfikacje wymagań, tworzenie typów
    danych do realizacji tych wymagań należało do zadań programisty.

    Oczywiście jeśli kto inny to zroi, to niczego to nie rozwiązuje, b nadal
    ktoś musi to zrobić - raczej jeszcze pogarsza to sprawę.

    >>> Refaktoryzacja: kompilator powie Ci gdzie NIE możesz użyć nowej
    >>> funkcji/struktury
    >>
    >> W pewnych sytuacjach tak, ale czasem ci powie, że błąd, bo typ X nie
    >> istnieje i faktycznie, po refaktoryzacji nie istnieje.
    >
    > czyli dobrze, nieprawdaż?

    Niedobrze, bo muszę się zastanawiać, jak wpasować wcześniej dobrze
    działający kod do nowego systemu typów - i ewentualne ponowne
    przerobienie tego systemu. W sytuacji z dynamicznym typowaniem nie masz
    tego problemu, bo o ile wykonanie danej operacji na danym obiekcie ma
    sens z punktu widzenia funkcjonalności, to możesz to po prostu zrobić.

    >>>> Wprowadzasz duplikację. No i pojawiają się dalsze problemy, co na
    >>>> przykład, jeśli chcesz skopiować structa i owej kopii dołożyć kilka
    >>>> nowych pól?
    >>>
    >>> Tylko wtedy gdy to ma sens, mogę zawsze przekazywać nie obiekty a pole.
    >>
    >> Przykład był przecież uproszczony, jeśli funkcja korzysta z siedmiu
    >> pól, to przekażesz jej siedem argumentów?
    >>
    >
    > zacytuję:
    > "Można ograniczyć ten efekt odpowiednio projektując kod."

    Rozmawiamy w tym momencie o bardzo konkretnym projekcie, który podobno
    miał dawać w języku ze statycznym typowaniem zalety języków typowanych
    dynamicznie.

    Oczywiście, że w językach statycznie typowanych można (zwykle) rozwiązać
    problem, o którym dyskutujemy w sposób ograniczający duplikację poprzez
    odpowiedni projekt, ale też nie znajdziesz sposobu, który jest równie
    wygodny, szybki, prosty i czytelny jak rozwiązanie w języku typowanym
    dynamicznie.

    >>> Po drugie to kompilator zabroni mi wywołać
    >>> foo(foo(c))
    >>
    >> Nawet jeśli właśnie foo(foo(c)) jest dokładnie tym, co chcesz zrobić.
    >
    > Jeśli tak jest to będzie istniała odpowiednia definicja.

    Sama się zaistniała?

    > Jeśli nic nie zrobię to znaczy że nie chcę takiej konstrukcji.
    > Mam wybór.

    Napisałeś taką konstrukcję, załóżmy, że dlatego, że chciałeś.

    >> Nie bardzo rozumiem, jak to się ma do tematu dyskusji. Chcesz
    >> powiedzieć, że samochody rodzinne są niepotrzebne, skoro można rodzinę
    >> zapakować w dwa tiry i wybrac sobie takie jezioro, do którego prawie
    >> dojeżdża uprawniona droga?
    >
    > Zupełnie odwrotnie. Pytanie brzmi: dlaczego tiry są takie popularne
    > skoro mają tyle ograniczeń. W analogii do języków z typowaniem
    > statycznym, w których tyle się trzeba "napracować" aby cokolwiek działało.

    No więc trochę nie trafiłeś z tą analogią, bo przecież ja nie mówię, że
    języki ze statycznym typowaniem są popularne bez powodu, tylko dyskutuję
    z tezą, że to, co dają języki dynamicznie typowane albo masz też w
    językach statycznie typowanych, albo jest bezużyteczne.


  • 113. Data: 2013-02-09 15:12:55
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "M.M." <m...@g...com>

    W dniu sobota, 9 lutego 2013 14:22:40 UTC+1 użytkownik Andrzej Jarzabek napisał:

    > Nie zawsze jest oczywiste, które
    > rozwiązanie jest właściwe, i nie zawsze rozwiązanie, które likwiduje
    > duplikację i "działa" ma jeszcze dodatkowo te zalety, że kod jest
    > czytelny i łatwy w utrzymaniu.

    Panowie dajcie jakiegoś linka do przykładów takich sytuacji. Chcę
    zobaczyć takie sytuacje w których ktoś zabrnął w projektowy-ślepy
    zaułek i w Java/C++ mam problem, a w Rubym, Pythonie nie ma problemu.
    Chodzi o problem tego typu, że w Java/C++ musi się wyraźnie więcej
    napracować, namyśleć, zastanowić, a w Rubmy i Pythonie rozwiązanie
    jest (raczej) jedno i przy pomocy prostej sztuczki dostosuje
    projekt do nowych wymagań.

    Nie potrafię dalej prowadzić dyskusji. Nie wiem o jakich
    zaletach/wadach rozmawiamy

    Pozdrawiam


  • 114. Data: 2013-02-09 16:29:21
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "AK" <n...@n...com>

    Użytkownik "M.M." <m...@g...com> napisał:

    > Nie potrafię dalej prowadzić dyskusji.
    > Nie wiem o jakich zaletach/wadach rozmawiamy

    A chcesz sie dowiedziec ?
    Jakos takie wrazenie odnosze, ze nie chcesz, a jedynym
    Twoim celem jest udowodnienie, ze statyczne typowanie jest
    najlepsze zawsze, wciaz i w ogole.
    Mylę się ? Udowodnij ze nie.

    PS: Najpierw trzeba zaczac "od poczatku" czyli od tego _czym_ jest
    statyczne typowanie.
    Jaki jest cel jego wprowadzenia i czy byl to cel przemyslany czy tylko
    "tak wyszlo" z czasem.

    AK


  • 115. Data: 2013-02-09 16:31:31
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "AK" <n...@n...com>

    Użytkownik "Roman W" <b...@g...pl> napisał:

    > No ale bez prymitywnego "double" nie istnialaby numeryka w Javie.

    Co ? :)
    Nie istnialaby, gdyby byla oparta wylacznie na java.lang.Double() ?
    Nie zmyslaj.

    AK


  • 116. Data: 2013-02-09 16:35:36
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "AK" <n...@n...com>

    Użytkownik "M.M." <m...@g...com> napisał:

    > Nie wiem o jaką użyteczność chodzi, ale może to by załatwiała metoda
    > wirtualna?

    Nie.

    AK


  • 117. Data: 2013-02-09 16:37:13
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "AK" <n...@n...com>

    Użytkownik "Stachu 'Dozzie' K." <d...@g...eat.some.screws.spammer.invalid> napisał:

    > To samo z czymkolwiek innym: obiekty można obsługiwać w sposób
    > jednolity, ale do typów wbudowanych trzeba specjalnie tworzyć dodatkowe
    > elementy.

    Jesli masz takie wyrafinowane potrzeby to sobie od poczatku uzywaj
    obiektowych odpowiednikow typow prostych i juz.
    Bedziesz mial jednolicie.
    Pytanie ile jest sutuacji gdzie obiektowosc takiego inta jest jest naprawde
    wazna w stosunku do jego zwyklego uzywania pozostawiam kazdemu
    wileoletniemu praktykowi do prywatnego rozwazenia/usmiechu:)

    PS: No chyba ze dla Ciebie jest problemem gdy musisz napisac np abs(a)
    zamiast a.abs(), czy str(a) zamiast a.toStr().
    Jesli jak, to wybacz. Wymiekam :)

    AK


  • 118. Data: 2013-02-09 17:01:06
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "M.M." <m...@g...com>

    W dniu sobota, 9 lutego 2013 16:29:21 UTC+1 użytkownik AK napisał:
    > Użytkownik "M.M." <m...@g...com> napisał:
    >
    >
    >
    > > Nie potrafię dalej prowadzić dyskusji.
    > > Nie wiem o jakich zaletach/wadach rozmawiamy
    >
    > A chcesz sie dowiedziec ?
    Dowiedzieć się chcę, inna sprawa czy będę mógł w swoich
    projektach zrezygnować z C++ na rzecz innego języka. Zwykle
    potrzebuję języka który się kompiluje do języka maszynowego,
    oszczędza każdy MB pamięci, w którym można przewidzieć czy
    pamięć cashe zostanie w miarę dobrze wykorzystana, itd.


    > Jakos takie wrazenie odnosze, ze nie chcesz,
    To bym nie wspominał że może coś ze mną nie tak i
    dlatego nie rozumiem i bym nie prosił o materiały.


    > a jedynym Twoim celem jest udowodnienie, ze
    > statyczne typowanie jest najlepsze zawsze, wciaz i w ogole.
    Nie mam ani takiego celu, ani przeciwnego. Na razie zwyczajnie
    nie widzę wyraźnych zalet, nie bardzo wiem jakie stanowisko
    przyjąć. Padło porównanie do asemblera i języka wysokiego
    poziomu. Nie wiem, ale podejrzewam, że typowanie statyczne i
    dynamiczne nie wprowadza aż tak wiele, jak wprowadziły języki
    wyższego poziomu niż asembler.


    > Mylę się ? Udowodnij ze nie.
    Daj linka do najlepszej Twoim zdaniem książki na ten temat,
    najlepiej polskojęzycznej, zamówię, przeczytam, pogadamy, to
    powinno udowodnić.

    Pozdrawiam


  • 119. Data: 2013-02-09 18:45:20
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: Andrzej Jarzabek <a...@g...com>

    On 08/02/2013 17:52, M.M. wrote:
    > W dniu piątek, 8 lutego 2013 18:14:45 UTC+1 użytkownik Andrzej Jarzabek napisał:
    >
    >> Wymyślenie zestawu typów i relacji między nimi, odpowiadające
    >> problemowi. Przerabianie tego zestawu w miarę jak problem się zmienia.
    > Moim zdaniem jest to kwestia szczęścia. Jeśli nie odgadniemy jak
    > projekt w przyszłości będzie się rozwijał, to w każdym języku
    > dogłębna (nie kłóćmy się o zmianę int na double - to niezauważalnie mały
    > nakład pracy) refaktoryzacja staje się koszmarem.
    > Przerabianie samochodu albo łodzi na amfibię zawsze jest trudniejszym
    > zadaniem niż produkcja amfibii od zera.

    Przecież nie mówimy o przerabianiu programu do wyceny instrumentów
    fianasowych na program do sterowania samolotem. Można przewidzieć, że
    przerabianie programu do wyceny instrumentów finansowych może np.
    uwzględnić inne rodzaje instrumentów finansowych i inne metody wyceny
    niż oryginalnie przewidywano.

    Problem jest taki, że jeśli spróbujesz zaprojektować swoją hierarchię
    typów tak, żeby uwzględnić wszelkie możliwe rodzaje instrumentów
    finansowych, to wykonasz gigantyczny kawał nikomu nie potrzebnej roboty,
    ale też stworzysz gorszy program, bo bardziej skomplikowany, trudniejszy
    do zrozumienia, a zatem łatwiej będzie popełnić w nim błąd, i trudniej
    go zmienić np. uwględniając instrument finansowy, którego nie
    uwzględniłeś w pierwotnym projekcie (bo, powiedzmy, jeszcze nie istniał).

    Natomiast jeśli chodzi o przerabianie programu do wyceny instrumentów
    tak, żeby wyceniał nowe instrumenty, żeby stosował nowe metody wyceny,
    czy żeby cośtam jeszcze robił z tymi instrumentami czy wycenami, czego
    pierwotnie nie przewidziałeś, to refaktoryzacja w celu uwzględnienia
    danej funkcjonalności nie musi być koszmarem, pod warunkiem, że się
    stosuje odpowiednie praktyki.

    No i oczywiście może tak być, że ta refaktoryzacja jest dużo prostsza,
    przyjemniejsza i mniej podatna na błędy jeśli stosujesz dynamiczny
    system typów.

    > Znowu muszę zapytać jak zdarta płyta: jaki jest przykład takiej refaktoryzacji
    > która będzie trudna w C++, a łatwa w Pythonie, Rubym i reszcie.

    PIeczołowice zaprojektowałeś system typów opierając się na założeniu, że
    dinozaur to rodzaj gada, a tu nagle się okazuje, że niektóre dinozaury,
    które musisz obsłużyć w swoim systemie, w myśl twojego systemu typów
    wcale nie są gadami tylko ptakami. W statycznym systemie typów musisz
    wszystko teraz przerabiać, przy dynamicznym typowaniu nie przejmujesz
    się - jeśli masz funkcję obsługującą dinozaura, to możesz tam wrzucić
    dinozaura, niezależnie od tgo, czy jest gadem czy nie.

    > Mnie się
    > wydaje to bardzo pomocne gdy kompilator C++ krzyczy już w trakcie
    > kompilacji że się typy nie zgadzają.

    Zwłaszcza jeśli wymaganą logikę możesz zaimplementować w tydzień, a
    przez kolejne trzy tygodnie będziesz uciszał krzyki kompilatora.


  • 120. Data: 2013-02-09 19:53:11
    Temat: Re: Jakie typowanie jest najlepsze i dlaczego statyczne?
    Od: "M.M." <m...@g...com>

    W dniu sobota, 9 lutego 2013 18:45:20 UTC+1 użytkownik Andrzej Jarzabek napisał:

    > Przecież nie mówimy o przerabianiu programu do wyceny instrumentów
    > fianasowych na program do sterowania samolotem.
    No więc jeśli rozmawiamy o przerabianiu tego typu, to z całym
    szacunkiem, ale nie rozumiem dlaczego w Java/C++ jest znacznie
    trudniej.

    > Można przewidzieć, że
    > przerabianie programu do wyceny instrumentów finansowych może np.
    > uwzględnić inne rodzaje instrumentów finansowych i inne metody wyceny
    > niż oryginalnie przewidywano.
    Zbliżamy się do konkretnych przykładów - fajnie.


    > Problem jest taki, że jeśli spróbujesz zaprojektować swoją hierarchię
    > typów tak, żeby uwzględnić wszelkie możliwe rodzaje instrumentów
    > finansowych, to wykonasz gigantyczny kawał nikomu nie potrzebnej roboty,
    > ale też stworzysz gorszy program, bo bardziej skomplikowany, trudniejszy
    > do zrozumienia, a zatem łatwiej będzie popełnić w nim błąd, i trudniej
    > go zmienić np. uwględniając instrument finansowy, którego nie
    > uwzględniłeś w pierwotnym projekcie (bo, powiedzmy, jeszcze nie istniał).
    Nie musi być tak, że program bardziej ogólny jest trudniejszy w
    analizie, zaprojektowaniu i implementacji niż program wyspecjalizowany.
    Powiedziałbym wręcz, że zwykle proście się pisze, jeśli od razu,
    nawet w wyspecjalizowanym programie, robi się dobre abstrakcje. Owszem,
    w prostym/wyspecjalizowanym programie, jest trochę szybciej jeśli
    niechlujnie sobie wrzucimy dane do kilku struktur/tablic. Zdarza mi
    się samemu tak niechlujnie pisać. Jednak takie programowanie naraża
    nas na straty czasu w trakcie debugowania. Narzut czasu na kilka
    definicji abstrakcyjnych klas zwróci się w postaci mniejszej ilości
    błędów.


    > Natomiast jeśli chodzi o przerabianie programu do wyceny instrumentów
    > tak, żeby wyceniał nowe instrumenty, żeby stosował nowe metody wyceny,
    > czy żeby cośtam jeszcze robił z tymi instrumentami czy wycenami, czego
    > pierwotnie nie przewidziałeś, to refaktoryzacja w celu uwzględnienia
    > danej funkcjonalności nie musi być koszmarem, pod warunkiem, że się
    > stosuje odpowiednie praktyki.
    Zgadzam się że nie musi. Dużo zależy od dobrego projektu, ale od
    szczęścia też nie mało. Skoro od szczęścia niemało to może dobrze
    się składa, mamy dzięki temu grunt na którym języki programowania mogą
    pomagać.


    > No i oczywiście może tak być, że ta refaktoryzacja jest dużo prostsza,
    > przyjemniejsza i mniej podatna na błędy jeśli stosujesz dynamiczny
    > system typów.
    Wiem od początku do czego zmierzasz, problem w tym, że nie wiem dlaczego
    masz rację.


    > PIeczołowice zaprojektowałeś system typów opierając się na założeniu, że
    > dinozaur to rodzaj gada, a tu nagle się okazuje, że niektóre dinozaury,
    > które musisz obsłużyć w swoim systemie, w myśl twojego systemu typów
    > wcale nie są gadami tylko ptakami. W statycznym systemie typów musisz
    > wszystko teraz przerabiać, przy dynamicznym typowaniu nie przejmujesz
    > się - jeśli masz funkcję obsługującą dinozaura, to możesz tam wrzucić
    > dinozaura, niezależnie od tgo, czy jest gadem czy nie.
    Zgadza się poza najważniejszym: "wszystko przerabiać". Zresztą
    nie wiem... może piszesz o jakimś przypadku w którym naprawdę wszystko
    trzeba przerabiać. Tak czy inaczej nie widzę tego że trzeba wszystko
    przerabiać. O jakie dokładnie przeróbki chodzi z tymi dinozaurami?
    Mam nadzieję że nie piszesz tego w nawiązaniu do naszych dawnych
    rozmów, kiedy to ja pisałem wręcz o całkowitym przepianiu programu od
    nowa. Wtedy pisałem tak w zupełnie innym kontekście, a mianowicie w
    kontekście ekstremalnej optymalizacji.


    Wracając do Twojego przykładu z dinozaurami. Przykład jest dobry, ale
    jeszcze za mało konkretny. Dlaczego w Java/C++ nie można takiego
    Dinozaura przerobić na klasę bazową, a następnie z niej wyprowadzić klas
    Gad i Ptak? Stare algorytmy przecież zadziałają tak samo jak działały do
    tej pory. Algorytmy na nowych cechach Ptaka trzeba dopisać bez względu na
    użyty język.


    > Zwłaszcza jeśli wymaganą logikę możesz zaimplementować w tydzień, a
    > przez kolejne trzy tygodnie będziesz uciszał krzyki kompilatora.
    Mój przykład z łodzią, samochodem i amfibią zamieniłeś na prosty
    program do instrumentów finansowych i skomplikowany program do instrumentów
    finansowych. Więc ja Twoje trzy tygodnie krzyków zamieniam na kilka
    godzin w stosunku tygodnia roboty, a przy okazji tych kilku godzin
    kompilator wychwyci błędy, które wyszłyby dopiero w trakcie uruchamiania.
    W sumie może być większy zysk czasu z powodu mniejszego nakładu pracy
    w trakcie uruchamiania.

    Pozdrawiam



strony : 1 ... 11 . [ 12 ] . 13 ... 20


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: