Programování

Diskuze na neherní témata.

Moderátor: Faskal

Uživatelský avatar
York
Příspěvky: 17402
Registrován: 24. 2. 2012, 17:31

Re: Programování

Příspěvek od York »

Ressurection: Rozhodně. Programování her je taky dobrej trénink, když to nemáš jak uplatnit v práci.


Pokračování refactoringu

Pro přehlednost repostnu výchozí stav:

Kód: Vybrat vše

function workingDay()
{
  wakeUp();
  cleanTeeth();
  makeBreakfast();
  eatBread();
  drinkTea();
  goToWork();
  singIn();
  while (!endOfWork)
  {
    doSomeWork();
    while(!endOfMeeting)
    {
       answerBoss();
       dozeOff();
    }
  }
  signOut();
  travelHome();
  haveDinner();
  sleep();
}
Kde začnu je celkem jedno - můžu se nejdřív zbavit dvakrát vnořeného cyklu, nebo třeba popřemýšlet nad tím, z jakých bloků se skládá celý working day, nebo třeba vzít celou snídani (i s přípravou) a udělat z ní samostatnou funkci.

S tím souvisí jedna dost podstatná věc: Programovací příklady si často vybírají něco reálného, dobře představitelného. Mohlo by se pak zdát, že hlavním smyslem objektů a funkcí je simulovat nějaké reálné věci nebo jevy - to ale není tak docela pravda. Classy (objekty), funkce a moduly jsou abstraktní, programovací konstrukty a slouží rozdělení programu do menších celků a k vytváření programovacích schémat. Když z něčeho děláte modul, tak většinou proto, abyste do něj nemuseli hrabat, když děláte na něčem nesouvisejícím. Kritérium je to, do čeho musíte hrabat, nikoliv jaké reálné entitě ten modul odpovídá.

Co to pro nás znamená? Funkci workingDay() můžu refactorovat takhle:

Kód: Vybrat vše

function workingDay()
{
  wakeUp();
  surviveDay();
  sleep();
}
Ale taky třeba takhle:

Kód: Vybrat vše

function workingDay()
{
  preWork();
  work();
  postWork();
}
Bez dalšího kontextu se nedá říct, které z těch řešení je lepší. To záleží na tom, co budou dělat ty vnořené metody.

Mluvím o tom proto, že při refactoringu dost často pomůže podívat se o patro nebo dvě výš. Pokud někdo přede mnou spojil drinkTea() a goToWork() do jedné funkce, může dávát smysl tuhle funkci úplně zrušit, drinkTea() přihodit k té předcházející (nejspíš haveBreakfast()) a goToWork() k té následující. Tenhle příklad jsem zvolil mimo jiné proto, že je na něm dobře vidět, že každý program je při běhu vlastně jedna velká nudle a je jedno, jak je rozsekaná do logických celků - tak jako tak se musí příkazy vykonat ve správném pořadí.

K tomuhle přerovnávání funkcí (s tím, že občas nějaká zanikne a kód se rozloží mezi jiné) často dochází například když mezi nim potřebujete předávat nějakou stavovou informaci. V takovém případě je většinou dobrý nápad mít jednu funkci, která se bude o tu stavovou informaci starat a předávat ji dál.


Vnořené cykly

Vnořeného cyklu se dá vždycky zbavit voláním funkce. Cykly z našeho příkladu by tedy mohl vypadat třeba nějak takhle:

Kód: Vybrat vše

function workRoutine()
{
  let meetingCounter = 0;

  while (!endOfWork)
  {
    doSomeWork(meetingCounter);
    attendMeeting();
    meetingCounter++;
  }
}

function attendMeeting()
{
  while(!endOfMeeting)
  {
    answerBoss();
    dozeOff();
  }
}
Do funkce workRoutine() jsem přidal meetingCounter jakou příklad stavové proměnné, o kterou se stará funkce workRoutine() a distribuuje ji dál (předává ji funkci doSomeWork()).

Na konec příklad, jak může vypadat kompletně refactorovaná funkce workingDay():

Kód: Vybrat vše

function workingDay()
{
  preWork();
  goToWork();
  work();
  travelHome();
  postWork();
}

function preWork()
{
  wakeUp();
  cleanTeeth();
  makeBreakfast();
  haveBreakfast();
}

function haveBreakfast()
{
  eatBread();
  drinkTea();
}

function work()
{
  singIn();
  workRoutine();
  signOut();
}

function postWork()
{
  haveDinner();
  sleep();
}

function workRoutine()
{
  let meetingCounter = 0;

  while (!endOfWork)
  {
    doSomeWork(meetingCounter);
    attendMeeting();
    meetingCounter++;
  }
}

function attendMeeting()
{
  while(!endOfMeeting)
  {
    answerBoss();
    dozeOff();
  }
}
Poznámka na závěr: Na příkladu je dobře vidět, že refactoring může dost výrazně prodloužit kód (ale i zkrátit). Hlavně z toho důvodu je dobré to nepřehánět - není rozhodně nutné rozdělit úplně každou funcki, která má víc než 5 řádků, nebo se nevejde na obrazovku, nebo tak něco. Když třeba máte jeden velký switch a v něm 50 casů, je blbost z toho dělat 10 funkcí po 5 casech. Zato je ale určitě dobrý nápad tělo každého casu zredukovat na jedno volání funkce.

Samostatnou funkci si rozhodně zaslouží kód, který se volá opakovaně. Kdykoliv máte pocit "něco hodně podobného jsem před chvílí psal", tak je to téméř určitě žhavý kandidát na vytvoření funkce. Těla cyklů si o to přímo říkají. Casy ve switchi jakbysmet.

Stejně tak je dobré vytvořit rozdělit do funkcí kód, který se týká různých logických akcí. Když ale máte za sebou 20 sekvenčních příkazů, které třeba všechny čtou data, není nutné to rozdělit na víc funkcí (a naopak je dobrý nápad refactorovat to obráceně a dát to do jedné funkce, pokud to tak není).
Uživatelský avatar
Pieta
sofistikovaný troll
Příspěvky: 15020
Registrován: 6. 9. 2006, 19:08
Bydliště: Praha, ale původem jsem z Hostivaře
Kontaktovat uživatele:

Re: Programování

Příspěvek od Pieta »

Resurrection píše: 1. 12. 2017, 08:40- Zjistite, ze vsechny programovaci jazyky delaji +- to same a hlavni odlisnost je syntaxe => dokazete se pomerne snadno naucit jakykoliv dalsi programovaci jazyk.
Tohle je možná až velké zjednodušení - když vedle sebe postavíš C a Prolog, tak tam moc styčných bodů nenajdeš. Když vedle sebe postavíš C a Lisp, bude to o něco lepší, ale pořád jsou tam dost fundamentální rozdíly nejen ve formě, ale i funkci. Když vedle nich postavíš SQL, tak najednou zjistíš, že vlastně existujou i jazyky, co jsou počítačové, ale nejsou programovací... Podobně můžeš najít kontrast mezi low a high level jazykem, objektovým a neobjektovým...

Jazyky v jedné rodině se často inspirujou mezi sebou navzájem a jsou si podobné, takže tam často tvoje tvrzení platí, ale to už tak nějak plyne z povahy věci - jazyky, které umějí FOR cyklus, jsou si tím podobné. Jazyky, které FOR cyklus neznají nebo v nich nedává smysl, nutně budou na spoustu věcí koukat jinak.

[/pedant]
Cicho żono, deszczyk padał, ja nie słyszał kto to gadał.
Cicho żono, deszczyk rosił, ja nie słyszał kto to prosił.
Uživatelský avatar
York
Příspěvky: 17402
Registrován: 24. 2. 2012, 17:31

Re: Programování

Příspěvek od York »

Pieta: To máš sice pravdu, ale v drtivé většině praktických aplikací se používají jazyky ze stejné skupiny. Výrazně jiné jazyky mají obvykle uplatnění jen na velmi specifické věci (prolog se například tuším používá v search enginech).
Uživatelský avatar
Pieta
sofistikovaný troll
Příspěvky: 15020
Registrován: 6. 9. 2006, 19:08
Bydliště: Praha, ale původem jsem z Hostivaře
Kontaktovat uživatele:

Re: Programování

Příspěvek od Pieta »

York píše: 1. 12. 2017, 12:34 Pieta: To máš sice pravdu, ale v drtivé většině praktických aplikací se používají jazyky ze stejné skupiny. Výrazně jiné jazyky mají obvykle uplatnění jen na velmi specifické věci (prolog se například tuším používá v search enginech).
Však píšu, že [/pedant], ne? Prostě když někdo řekne, že všechny jazyky, přijde mi vhodné dodat, že úplně všechny jazyky ne. Zvlášť když mě jedna taková velmi specifická věc živí, že? d-:
Cicho żono, deszczyk padał, ja nie słyszał kto to gadał.
Cicho żono, deszczyk rosił, ja nie słyszał kto to prosił.
Uživatelský avatar
York
Příspěvky: 17402
Registrován: 24. 2. 2012, 17:31

Re: Programování

Příspěvek od York »

Pieta píše: 1. 12. 2017, 14:03Však píšu, že [/pedant], ne?
Což mi připomíná: Kde máš otevírací tag? Takhle si parser určitě bude myslet, že do toho spadají i všechny příspěvky před tebou :-)
Uživatelský avatar
Pieta
sofistikovaný troll
Příspěvky: 15020
Registrován: 6. 9. 2006, 19:08
Bydliště: Praha, ale původem jsem z Hostivaře
Kontaktovat uživatele:

Re: Programování

Příspěvek od Pieta »

York píše: 1. 12. 2017, 14:05Což mi připomíná: Kde máš otevírací tag?
Někde v sedmdesátkách minulého století. d-:
Cicho żono, deszczyk padał, ja nie słyszał kto to gadał.
Cicho żono, deszczyk rosił, ja nie słyszał kto to prosił.
Sosacek
Příspěvky: 25723
Registrován: 14. 7. 2004, 19:30

Re: Programování

Příspěvek od Sosacek »

No nevim. SQL je hodne jine, nez ruzne klony Ccka a a je to asi nejpouzivanejsi programovaci jazyk na svete.

A vetsina praktickych aplikaci ma v sobe SQL.
But nobody came.
Uživatelský avatar
OnGe
malý zelený křečopažout
Příspěvky: 13205
Registrován: 5. 2. 2010, 09:27
Kontaktovat uživatele:

Re: Programování

Příspěvek od OnGe »

SQL není programovací jazyk. Je to dotazovací jazyk.
OnGe tu není, je tu jenom Zuul
Sosacek
Příspěvky: 25723
Registrován: 14. 7. 2004, 19:30

Re: Programování

Příspěvek od Sosacek »

Je to jazyk pro popis transformace dat. Transformovani dat je programovani, jako kazde jine a vetsina programu nedela nic jineho, nez transformace dat.

EDIT: pieto hod sem nejakou solidni scd2 at kluci vidi, co je to programovani.
But nobody came.
Uživatelský avatar
OnGe
malý zelený křečopažout
Příspěvky: 13205
Registrován: 5. 2. 2010, 09:27
Kontaktovat uživatele:

Re: Programování

Příspěvek od OnGe »

To je hodně volná definice. Do toho by se vešlo i účetnictví.
OnGe tu není, je tu jenom Zuul
Sosacek
Příspěvky: 25723
Registrován: 14. 7. 2004, 19:30

Re: Programování

Příspěvek od Sosacek »

Jak se tu resilo, co je dobre na Pythonu - je jednoduchy a pritom dost highlevel a pritom dost citelny (asi az na ty List comprehensions, na ktere to chce zkusenosti z matiky).

Tady jsou dva fragmenty, kde by to melo byt videt - podotykam, ze je to PoC kod, ne produkcni kod, takze je tam trochu moc veci zahardkodovano.
Obrázek

Obrázek

Moje zkusenosti z jinych jazyku jsou, ze to samozrejme neni nic, co by jinde neslo, ale bylo by to na dost vic radku, a o dost travnejsi a mene citelne.

(argparse modul je milacek)
But nobody came.
Uživatelský avatar
Pieta
sofistikovaný troll
Příspěvky: 15020
Registrován: 6. 9. 2006, 19:08
Bydliště: Praha, ale původem jsem z Hostivaře
Kontaktovat uživatele:

Re: Programování

Příspěvek od Pieta »

Sosacek píše: 1. 12. 2017, 17:44No nevim. SQL je hodne jine, nez ruzne klony Ccka a a je to asi nejpouzivanejsi programovaci jazyk na svete.

A vetsina praktickych aplikaci ma v sobe SQL.
Asi tak. Ono když SQL prohlásíš za programovací jazyk, nikdo ti hlavu neutrhne, ale na druhou stranu v SQL nedokážeš dělat to, co se obvykle myslí programováním*, pokud tam nepřilepíš nějakou vhodnou nadstavbu (PL/SQL a podobné). Takže se myslím dá snadno argumentovat pro to, že je, i že není, a pak začnou všichni listovat v definicích a tlouct o stůl skriptama a to nikdo nechceme. (:

Podobná témata - je regexp programovací jazyk? Je XSLT? A je vůbec důležité, jestli je programovací, v okamžiku, kdy to programátor stejně potřebuje znát, aby mu jeho program fungoval?
Prostě svět počítačů je plný protipříkladů na "všechny jazyky dělají +- totéž, liší se hlavně syntaxí". Když se místo toho řekne, že "většina běžně používaných high-level procedurálních jazyků atd atd", bude to myslím obhajitelnější.

*) On z druhé strany třeba ten Prolog je hodně na hraně a taky tam neuděláš to, co se obvykle myslí programováním. Hmm.
Sosacek píše: 1. 12. 2017, 18:27EDIT: pieto hod sem nejakou solidni scd2 at kluci vidi, co je to programovani.
Teď nevím, jestli ti rozumím. Jako že scd2 znám (byť ne pod tímhle jménem, protože já teorii DB často přes praxi ani nevidím (: ), ale nenapadá mě, jak z toho udělat něco vizuálně zajímavýho bez spousty keců okolo.
Cicho żono, deszczyk padał, ja nie słyszał kto to gadał.
Cicho żono, deszczyk rosił, ja nie słyszał kto to prosił.
Sosacek
Příspěvky: 25723
Registrován: 14. 7. 2004, 19:30

Re: Programování

Příspěvek od Sosacek »

Pieta píše: 1. 12. 2017, 22:26 na druhou stranu v SQL nedokážeš dělat to, co se obvykle myslí programováním
Co se obvykle mysli programovanim?

Programy 1) transformuji data uvnitr pocitace 2) interaguji s vnejsim svetem. SQL ma omezene schopnosti v 2), ale v 1) je asi nejlepsi vubec*. SQL sice nema for cykly, a neodkladas tam data do promennych, ale to je hlavne proto, ze je nepotrebuje, protoze uz od zakladu pracuje s mnozinami, ne s jednotlivymi kusy neceho.

* Rkova knihovna dplyr je ve skutecnosti silnejsi nez SQL, protoze umi deklarativne (ve skoro-SQL syntaxi) popsat iterativni vypocty, coz je v SQL problem, protoze v lead/lag se nemuzes odkazat na sloupecek, ktery zrovna definujes.
Teď nevím, jestli ti rozumím. Jako že scd2 znám (byť ne pod tímhle jménem, protože já teorii DB často přes praxi ani nevidím (: ), ale nenapadá mě, jak z toho udělat něco vizuálně zajímavýho bez spousty keců okolo.
Rikal jsem si, ze bys sem mohl poslat kod z praxe, co dela scd2 - to je solidni psycho a je na prvni pohled jasne, ze to je program - ktery navic dela veci, ze kterych by ti jeblo, kdybys je delal imperativne.

Ale melo by dojit, ze kdyz delas Oracle a ne Teradatu, ze kolem toho nebudes, plus poslat kod z prace na forum je trochu divny, ja taky radsi udelal odlisnou verzi.
But nobody came.
Uživatelský avatar
York
Příspěvky: 17402
Registrován: 24. 2. 2012, 17:31

Re: Programování

Příspěvek od York »

Ono jde spíš o to, že mezi řekněme SQL a Pythonem si nevybíráš, pokud teda zrovna nejsi Pieta. Pokud děláš něco s databází, tak potřebuješ SQL a něco k tomu. Stejně tak když děláš webovou aplikaci, tak potřebuješ html + css + něco k tomu (ok, javascipt k tomu, zrovna v tomhle případě bez transpilování není na výběr). Regulární výrazy to samé (u těch se teda liší syntaxe v různých jazycích, ale to je detail).

PS: Přiznejte se, kdo jste mi sežral příspěvek?
Uživatelský avatar
Pieta
sofistikovaný troll
Příspěvky: 15020
Registrován: 6. 9. 2006, 19:08
Bydliště: Praha, ale původem jsem z Hostivaře
Kontaktovat uživatele:

Re: Programování

Příspěvek od Pieta »

Trochu se obávám, že z Yorkova úmyslu mít tu takový úvod do programování děláme kůlničku na dříví. (: Jestli mi vyjde čas, zkusím se přes víkend vyvětit i k té refaktorizaci a spol.
Sosacek píše: 1. 12. 2017, 22:46Co se obvykle mysli programovanim?

Programy 1) transformuji data uvnitr pocitace 2) interaguji s vnejsim svetem. SQL ma omezene schopnosti v 2), ale v 1) je asi nejlepsi vubec*. SQL sice nema for cykly, a neodkladas tam data do promennych, ale to je hlavne proto, ze je nepotrebuje, protoze uz od zakladu pracuje s mnozinami, ne s jednotlivymi kusy neceho.
SQL je deklarativní a ne imperativní, třeba. Nepřemýšlíš tam moc v algoritmech (vím, zjednodušuju). Definuj-naplň-použij proměnné tam probíhá v úplně jiných měřítcích. Naopak tam od začátku máš kupu relativně neobvyklých témat - persistentní a sdílená data, atomizace operací a další složitosti kolem souběžných přístupů, ... Nebo vezmi už jen to, jak je SQL divně high a low level zároveň...
Sosacek píše: 1. 12. 2017, 22:46* Rkova knihovna dplyr je ve skutecnosti silnejsi nez SQL, protoze umi deklarativne (ve skoro-SQL syntaxi) popsat iterativni vypocty, coz je v SQL problem, protoze v lead/lag se nemuzes odkazat na sloupecek, ktery zrovna definujes.
A to je moc pěkný!
Rikal jsem si, ze bys sem mohl poslat kod z praxe, co dela scd2 - to je solidni psycho a je na prvni pohled jasne, ze to je program - ktery navic dela veci, ze kterych by ti jeblo, kdybys je delal imperativne.

Ale melo by dojit, ze kdyz delas Oracle a ne Teradatu, ze kolem toho nebudes, plus poslat kod z prace na forum je trochu divny, ja taky radsi udelal odlisnou verzi.
Pořád si nejsem jistej, že se chytám - pro mě je scd2 to, že informace o něčem nedržím jako fakta, ale jako fakta v čase; ale pracuju s tím jako s každýma jinýma datama, takže tam nevidím to psycho.

Příklad inspirovaný praxí - za moje služby mi druhá strana poslala tři splátky po 10k Euro, kolik mi z toho přibylo do rozpočtu? Odpověď - to záleží na tom, k jakému datu se ta eura rozhodnu započítat, protože rozpočet je ve złotych. Celkem normální záležitost, žádné psycho.
Cicho żono, deszczyk padał, ja nie słyszał kto to gadał.
Cicho żono, deszczyk rosił, ja nie słyszał kto to prosił.
Odpovědět

Zpět na „Rozličný pokec“

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 7 hostů