Co si myslíte o OOP?

Honza

Re:Co si myslíte o OOP?
« Odpověď #495 kdy: 05. 01. 2019, 23:12:40 »
Při chybě v programu to spadne už v testech - stejně jako při statickém typování.

Při statickém typování to nepůjde vůbec přeložit, chybu zjistíš ještě dřív, než napíšeš jedinou řádku testů.

Tohle je tady mylně považováno za výhodu statických jazyků, ale ten program nepůjde přeložit vůbec úplně celý.
Přitom v dynamickém jazyce mi ta hotová část programu může už dávno běžet...

A na to jsi přišel jak?
Je tu stále stejná skupina diskutujících. A tak jsem si dovolil představit si ten dokonalý statický typový systém, který nepotřebuje unit testy, a který se píše od začátku do konce na čisto, kdy až na konci se povede celý zkompilovat, což znamená, že je správně, a rovnou se posílá na produkci...  ;D  ;D (jen trocha ironie)


Re:Co si myslíte o OOP?
« Odpověď #496 kdy: 05. 01. 2019, 23:15:24 »
Při chybě v programu to spadne už v testech - stejně jako při statickém typování.

Při statickém typování to nepůjde vůbec přeložit, chybu zjistíš ještě dřív, než napíšeš jedinou řádku testů.

Tohle je tady mylně považováno za výhodu statických jazyků, ale ten program nepůjde přeložit vůbec úplně celý.
Přitom v dynamickém jazyce mi ta hotová část programu může už dávno běžet...

To je zcela zásadní výhoda statických jazyků. O tom, že  to není omyl, svědčí i všechny ty snahy naroubovat statickou typovou kontrolu na původně dynamicky typované jazyky. A zatímco opravuji kód, aby prošla typová kontrola, hotová část programu, tedy předchozí zkompilovatelná, odladěná, otestovaná a v mém oblíbeném VCS uložená verze, už dávno běží v produkčním nasazení. A já se přitom nemusím bát, že se z nějakého podivného důvodu do nějaké pomocné funkce, která normálně dostává řetězce a volá na ně clear(), dostane jako parametr handle k databázi :)

Kit

Re:Co si myslíte o OOP?
« Odpověď #497 kdy: 05. 01. 2019, 23:16:56 »
Při chybě v programu to spadne už v testech - stejně jako při statickém typování.
Při statickém typování to nepůjde vůbec přeložit, chybu zjistíš ještě dřív, než napíšeš jedinou řádku testů.

Nejprve se píší testy a teprve když neprojdou, píše se program.

Re:Co si myslíte o OOP?
« Odpověď #498 kdy: 05. 01. 2019, 23:25:00 »
... Ale třeba get_peer_address() má jistě smysl pro třídu network_socket. Hůř se ale bude hledat význam takové funkce pro string nebo int a s tím mi nepomůže, když tu funkci přesunu do samostatné třídy address_extractor. Jde mi o to, že některé operace nemají pro nějaké typy smysl, buď obecně nebo v kontextu konkrétního řešeného problému. Jakákoliv runtime reakce na volání takové operace s nevhodným typem argumentu je špatně, protože v prvé řadě nemělo dojít k tomu zavolání. Tedy jedná se o chybu v programu, kterou je nutno řešit úpravou kódu. Statické typování mi takovou chybu odhalí včas a bez toho, abych musel kvůli diagnostice psát víc, než jméno typu.

get_peer_address() má jako parametr int32, string nebo je to jedno? Návratová hodnota je big endian nebo little endian? Pro diagnostiku musíš psát i testy. Co když dostaneš 0.0.0.0 nebo 255.255.255.255? Bude to v pořádku?

Funkce get_peer_address() je buď metoda třídy network_socket bez parametrů, nebo je to samostatná funkce (nebo klidně metoda třídy address_extractor) s jedním parametrem typu network_socket. Návratová hodnota je typu socket_address, což je polymorfní typ zahrnující IPv4, IPv6 i řetězce (používané jako jména UNIX domain socketů). Všechny tyhle informace jsou explicitně napsané ve zdrojáku, z něj se automaticky přenesou do dokumentace (např. v C++ pomocí Doxygenu), a to všechno bez nutnosti napsat jediné slovo komentáře a jediný test zjišťující, zda se předávají nebo vrací hodnoty správných typů. Testy už píšu jen na ověření chování této funkce se smysluplnými typy parametrů.

Kit

Re:Co si myslíte o OOP?
« Odpověď #499 kdy: 05. 01. 2019, 23:27:03 »
Při chybě v programu to spadne už v testech - stejně jako při statickém typování.
Při statickém typování to nepůjde vůbec přeložit, chybu zjistíš ještě dřív, než napíšeš jedinou řádku testů.
Tohle je tady mylně považováno za výhodu statických jazyků, ale ten program nepůjde přeložit vůbec úplně celý.
Přitom v dynamickém jazyce mi ta hotová část programu může už dávno běžet...
To je zcela zásadní výhoda statických jazyků. O tom, že  to není omyl, svědčí i všechny ty snahy naroubovat statickou typovou kontrolu na původně dynamicky typované jazyky. A zatímco opravuji kód, aby prošla typová kontrola, hotová část programu, tedy předchozí zkompilovatelná, odladěná, otestovaná a v mém oblíbeném VCS uložená verze, už dávno běží v produkčním nasazení. A já se přitom nemusím bát, že se z nějakého podivného důvodu do nějaké pomocné funkce, která normálně dostává řetězce a volá na ně clear(), dostane jako parametr handle k databázi :)

Co jsou to "pomocné funkce"? Když mají vedlejší efekt, tak to jsou procedury, ne?

Je fakt, že statická typová kontrola se dostala i do PHP, ovšem používá se tam pouze v rozhraní, protože jinde by nedávala smysl.


O

Re:Co si myslíte o OOP?
« Odpověď #500 kdy: 05. 01. 2019, 23:32:40 »
Tohle je tady mylně považováno za výhodu statických jazyků, ale ten program nepůjde přeložit vůbec úplně celý.
Přitom v dynamickém jazyce mi ta hotová část programu může už dávno běžet...

To je zcela zásadní výhoda statických jazyků. O tom, že  to není omyl, svědčí i všechny ty snahy naroubovat statickou typovou kontrolu na původně dynamicky typované jazyky. A zatímco opravuji kód, aby prošla typová kontrola, hotová část programu, tedy předchozí zkompilovatelná, odladěná, otestovaná a v mém oblíbeném VCS uložená verze, už dávno běží v produkčním nasazení. A já se přitom nemusím bát, že se z nějakého podivného důvodu do nějaké pomocné funkce, která normálně dostává řetězce a volá na ně clear(), dostane jako parametr handle k databázi :)

Jestli potřebuješ staticky typovaný jazyk, aby sis byl jistý, že tvůj kód omylem nepromázne databázi, tak bys měl změnit obor. Nebo si alespoň pořídit hodně kvalitní pojistku na blbost.

Re:Co si myslíte o OOP?
« Odpověď #501 kdy: 05. 01. 2019, 23:35:38 »
Dynamické typování v tomto případě nemá žádnou výhodu. Bude to pomalejší a na chyby v programu se přijde až v runtime, kdy to celé spadne.

Při chybě v programu to spadne už v testech - stejně jako při statickém typování.

Pokud máš plné pokrytí. Za předpokladu jedné unity.

Pokud píšeš libku nebo nedejte bozi framework, tak se ti tohle ještě dál komplikuje...

K tomu mě napadá akademická otázka: Dá se pro libovolný program napsat testovací sada, která nalezne všechny chyby, jež by nalezla statická typová kontrola, a přitom nebude zahrnovat (jakkoliv zakamuflovanou) statickou typovou kontrolu?

Re:Co si myslíte o OOP?
« Odpověď #502 kdy: 05. 01. 2019, 23:36:19 »
Co jsou to "pomocné funkce"? Když mají vedlejší efekt, tak to jsou procedury, ne?

Používám terminologii mého oblíbeného C++.

Kit

Re:Co si myslíte o OOP?
« Odpověď #503 kdy: 05. 01. 2019, 23:37:04 »
... Ale třeba get_peer_address() má jistě smysl pro třídu network_socket. Hůř se ale bude hledat význam takové funkce pro string nebo int a s tím mi nepomůže, když tu funkci přesunu do samostatné třídy address_extractor. Jde mi o to, že některé operace nemají pro nějaké typy smysl, buď obecně nebo v kontextu konkrétního řešeného problému. Jakákoliv runtime reakce na volání takové operace s nevhodným typem argumentu je špatně, protože v prvé řadě nemělo dojít k tomu zavolání. Tedy jedná se o chybu v programu, kterou je nutno řešit úpravou kódu. Statické typování mi takovou chybu odhalí včas a bez toho, abych musel kvůli diagnostice psát víc, než jméno typu.

get_peer_address() má jako parametr int32, string nebo je to jedno? Návratová hodnota je big endian nebo little endian? Pro diagnostiku musíš psát i testy. Co když dostaneš 0.0.0.0 nebo 255.255.255.255? Bude to v pořádku?

Funkce get_peer_address() je buď metoda třídy network_socket bez parametrů, nebo je to samostatná funkce (nebo klidně metoda třídy address_extractor) s jedním parametrem typu network_socket. Návratová hodnota je typu socket_address, což je polymorfní typ zahrnující IPv4, IPv6 i řetězce (používané jako jména UNIX domain socketů). Všechny tyhle informace jsou explicitně napsané ve zdrojáku, z něj se automaticky přenesou do dokumentace (např. v C++ pomocí Doxygenu), a to všechno bez nutnosti napsat jediné slovo komentáře a jediný test zjišťující, zda se předávají nebo vrací hodnoty správných typů. Testy už píšu jen na ověření chování této funkce se smysluplnými typy parametrů.

A jak je to s těmi IP 0.0.0.0 nebo 255.255.255.255? Jsou validní nebo ne?

Z toho, co jsi napsal, nemusím v PHP řešit vůbec nic, proto mi ten příklad připadal trochu odtržený od reality. Vlastně ani nepotřebuji metodu get_peer_address(), neboť tu hodnotu mám nachystanou v $_SERVER["REMOTE_ADDR"].

BaldSlattery

Re:Co si myslíte o OOP?
« Odpověď #504 kdy: 05. 01. 2019, 23:37:38 »
Dynamické typování v tomto případě nemá žádnou výhodu. Bude to pomalejší a na chyby v programu se přijde až v runtime, kdy to celé spadne.

Při chybě v programu to spadne už v testech - stejně jako při statickém typování.

Pokud máš plné pokrytí. Za předpokladu jedné unity.

Pokud píšeš libku nebo nedejte bozi framework, tak se ti tohle ještě dál komplikuje...
Dá se pro libovolný program napsat testovací sada, která nalezne všechny chyby, jež by nalezla statická typová kontrola, a přitom nebude zahrnovat (jakkoliv zakamuflovanou) statickou typovou kontrolu?
Ne

BoneFlute

  • *****
  • 2 043
    • Zobrazit profil
Re:Co si myslíte o OOP?
« Odpověď #505 kdy: 05. 01. 2019, 23:42:16 »
Kód: [Vybrat]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def vypis(kolekce):
    print(type(kolekce))
    for i in kolekce:
        print(i)
    print()

seznam = ["Alfa", 42, 42, ("Beta", "Gamma")]
mnozina = {"Alfa", 42, 42, ("Beta", "Gamma")}
vypis(seznam)
vypis(mnozina)

Jak vidíš, tak proceduře vypis() je v daném případě jedno, zda jí předhodíš seznam nebo množinu. Vypíše obojí. Pokud je budu potřebovat rozlišit, stále ještě mohu použít reflexi.

Tento příklad krásně ilustruje problém dynamicky typovaných jazyků. Procedura vypis() implicitně předpokládá, že parametr kolekce se dá iterovat a že iterací dostanu objekty, pro které má smysl volat print(). Když nebudou splněny obě tyto podmínky, funkce havaruje. Pravděpodobně vyhodí nějakou výjimku, kterou buď očekávám a musím na ni nějak zareagovat, nebo výjimka shodí celý program. Kdybych se chtěl výjimce vyhnout, musel bych v kódu nějak ošetřit chování funkce pro všechny typy, které nejsou "iterable<printable>". Ovšem ze zadání může plynout, že nemá smysl volat vypis() na takové typy. Ve staticky typovaném jazyce bych jednoduše přidal parametru kolekce typ iterable<printable> a mohl bych se spolehnout, že případné chyby odhalí kompilátor při překladu. V dynamicky typovaném jazyce můžu tento požadavek tak akorát napsat do dokumentace a případně doufat, že na každé použití této funkce někdo napíše test, že se v tom kokrétním místě vždy volá se správným typem.

Na tomto příkladu můžeme vidět ještě jednu vlastnost dynamických typů.

Jsem pečlivý programátor, a do tý funkce print() dám aserci, abych varoval, že vkládám špatné vstupy. Tím dosáhnu toho, že ta funkce bude házet výjimky, což je ale další rozměr, který té funkci přidám. Ty výjimky musím ne/odchytit. Nesmí se mi poplést. Neměl bych je přehlédnout. A hlavně, hmm, kdy vlastně nastane? Díky Murphymu, tak na produkci, a budu rád, když budu logovat.

Statické typování má tu výhodu, že taková situace jednoduše neexistuje. Pokud popletu vstupy, tak to na mě zařve kompilátor. Hned! Nemusím testovat, jestli ta funkce vyhodila nějakou chybu, protože jsem se překlpl. Spustu věcí nemusím dělat. Kód je kratší a přímočařejší.

Kit

Re:Co si myslíte o OOP?
« Odpověď #506 kdy: 05. 01. 2019, 23:43:55 »
Co jsou to "pomocné funkce"? Když mají vedlejší efekt, tak to jsou procedury, ne?
Používám terminologii mého oblíbeného C++.

Samozřejmě, chápu to. Syntakticky je to funkce, sémanticky procedura. Dají se tedy používat oba pojmy. Už když jsem se učil Pascal, tak k nám začínal pronikat jazyk C, ve kterém byl rozdíl mezi procedurou a funkcí jaksi setřen. Už tenkrát mi C nebylo sympatické.

Re:Co si myslíte o OOP?
« Odpověď #507 kdy: 05. 01. 2019, 23:49:18 »

A já se přitom nemusím bát, že se z nějakého podivného důvodu do nějaké pomocné funkce, která normálně dostává řetězce a volá na ně clear(), dostane jako parametr handle k databázi :)

Jestli potřebuješ staticky typovaný jazyk, aby sis byl jistý, že tvůj kód omylem nepromázne databázi, tak bys měl změnit obor. Nebo si alespoň pořídit hodně kvalitní pojistku na blbost.

Já už jsem ve svém programátorském životě viděl příliš mnoho chyb, které jsem buď sám udělal, nebo jsem je musel opravit, o nichž jsem byl přesvědčený, že nemohou nastat... :)

S trochou nadsázky - programátoři se dělí do několika podmnožin:
  • Ti, kteří dělají chyby, a nevědí, co s tím.
  • Ti, kteří dělají chyby, ale snaží se z nich poučit a snaží se používat nástroje, které jim pomohou chyby lépe odhalovat a odstraňovat.
  • Ti, kteří nedělají chyby.

Programátoři z první podmnožiny potřebují nabrat zkušenosti nebo, když toho nejsou schopni, najít si jiný obor. Programátoři z druhé podmnožiny dávají přednost staticky typovaným jazykům, protože jim pomáhají diagnostikovat chyby. Pro programátory ze třetí podmnožiny jsou lepší dynamicky typované jazyky, protože je nebrzdí v tvůrčím rozletu. Drobný problém je, že třetí podmnožina je prázdná.

v

Re:Co si myslíte o OOP?
« Odpověď #508 kdy: 05. 01. 2019, 23:50:22 »
K tomu mě napadá akademická otázka: Dá se pro libovolný program napsat testovací sada, která nalezne všechny chyby, jež by nalezla statická typová kontrola, a přitom nebude zahrnovat (jakkoliv zakamuflovanou) statickou typovou kontrolu?
+1

Re:Co si myslíte o OOP?
« Odpověď #509 kdy: 05. 01. 2019, 23:55:08 »
Dá se pro libovolný program napsat testovací sada, která nalezne všechny chyby, jež by nalezla statická typová kontrola, a přitom nebude zahrnovat (jakkoliv zakamuflovanou) statickou typovou kontrolu?
Ne

Já si to myslím taky, ale na akademickou otázku by mě zajímala akademická odpověď, tedy přeformulování otázky do formální podoby a matematický důkaz...