Jaký webový framework zvolit?

gll

  • ****
  • 429
    • Zobrazit profil
    • E-mail
Re:Jaký webový framework zvolit?
« Odpověď #45 kdy: 07. 09. 2018, 12:38:34 »
.....

Zkuste být konkrétnější. Jinak to vypadá, že jen opakujete, co jste se někde dočetl.


xxx

Re:Jaký webový framework zvolit?
« Odpověď #46 kdy: 07. 09. 2018, 13:01:57 »
jak sem vyse psal a vy ste to nasledne potvrdil peti linkama, nad vice nez 5 mist se nedostanete, a to je pri vyberu prace zalostne malo, opet to napisu znova, v php/jave/.netu je tady toho "NASOBNE" vice a proto delat v CR (WEB!!!!!) python je uplny nesmysl pro karieru.

Tak snad si nečekal, že tady pošlu 100 linků? Dal jsem 4 na ukázku, zmínil pár dalších obecně, zbytek si dohledáš.

Nebudu popírat, že v php/java/.net je násobně víc pozic, ale proč by to mělo vadit? Já měnil práci dost nedávno a to že jsem silně preferoval Django vůbec neomezilo nabídku. Lidi sháněj všude a programátor si může vybírat podle čeho chce, klidně podle použité technologie.

Zbytek příspěvku jsem subjektivní, nepodložené výkřiky.

xxx

Re:Jaký webový framework zvolit?
« Odpověď #47 kdy: 07. 09. 2018, 13:33:19 »
a tak bych byl rád kdyby mi zde raději někdo porovnal Python a Node.js (a to jak z technické stránky tak i po stránce uplatnění těch technologií v praxi apod...)
Případně navhrněte i nějakou další alternativu.

Mám čerstvou zkušenost z firmy, kde se postupně použily všechny 3 zmiňované technologie.

Začalo to 2 vzájemně propojenými projekty v Nette (web a api zvlášť, ale nad stejnou db), které z různých (i netechnických) důvodů doiterovaly do hrůzy, kterou nikdo neuměl dát do kupy. Kromě jiných faktorů tam ale hrálo i roli to, že Nette je takové trochu nedodělané a věci, které jiné frameworky (nejen Django, ale třeba i Laravel) mají vyřešené, se řešily ručně.

Tým na to reagoval tak, že začali tlačit Node.js. Vzniklo dost microservices, které se nasekaly rychle, ale problém byl ve dvou věcech:
1) neexistence jasných standardů vedla k tomu, že každá služba byla udělaná jinak
2) velká rychlost jakou se proměňuje JS ekosystém - zažili jsme přechod npm -> yarn, kterým se rozbilo pár věcí nečekaným způsobem, callbacky -> Promise (různými způsoby: es6-promisify, bluebird a já nevím co ještě) -> async/await. i neustálé náhrady nějakých knihoven (node-uuid -> uuid, apod.).

Výsledkem bylo to, že na můj vkus se příliš energie věnovalo neustálým přepisům a refaktorům místo přidávání fíčur.

Nakonec jsme se dostali k tomu, že jsme jak zastaralé Nette, tak progresivní Node.js nahradili Pythonem, kde databázová a webová část se udělala v Djangu, na což se velmi hodí a to, co se hodilo řešit pomocí microservis se udělalo v asynchronním Pythonu (aiohttp).

Neříkám, že tahle zkušenost se dá doslova zobecnit, ale pát poučení bych si z ní vzal:

1) Na web použít vyspělý framework, jedno ve které jazyce (RoR, Django nebo Laravel mi přijdou ok), Nette má jedinou výhodu, že je v Česku populární

2) Node.js vyžaduje disciplínu, aby se člověk neutopil v možnostech, které nabízí a je třeba počítat, že se neustále mění

3) Použití nejnovějších technologií nevede k lepším výsledkům než staré, ale osvědčené nástroje (třeba nasazením GraphQL jsme si dost užili a vše se zlepšilo návratem k trapnému RESTu)

todul

Re:Jaký webový framework zvolit?
« Odpověď #48 kdy: 07. 09. 2018, 15:07:30 »
3) Použití nejnovějších technologií nevede k lepším výsledkům než staré, ale osvědčené nástroje (třeba nasazením GraphQL jsme si dost užili a vše se zlepšilo návratem k trapnému RESTu)

Což je zkušenost, kterou by vám řekl každý vývojář s praxí 20+ let , protože viděl x podobných módních vln. :)

agent

Re:Jaký webový framework zvolit?
« Odpověď #49 kdy: 07. 09. 2018, 15:09:38 »
Ďalšia vec, ktorú som si včera všimol. PHP má podobne ako JavaScript dva operátory na porovnanie, == a ===.
Operátor == má množstvo problémov, napr:
Kód: [Vybrat]
<?php
$x 
'12a';
$y 12;
echo (
$y == $x) ? 'equal' 'not equal';

Príklad vypíše equal. Číslo 12 a string '12b' sú podľa tohoto operátora rovnaké.
To je vcelku jasné, viz dokumentace o porovnávání pomocí "==" + chování převodní funkce intval v PHP:
"If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically."
intval: string "12b" => int 12

Operátor === sa odporúča používať, má odstraňovať problémy ==. Pritom prináša ďalšie problémy, trebárs:
Kód: [Vybrat]
<?php
$x 
100;
$y $x 0.0e0;
echo (
$x ==  $y) ? 'equal' 'not equal';
echo (
$x === $y) ? 'equal' 'not equal';

Pri pripočítaní nuly s desatinnou čiarkou dôjde k situácii, kde operátor === vráti 'not equal'.
Ani tady v tom nevidím žádné překvapení - $x je int, $y bude kvůli druhému operandu ve sčítání float (typ výsledku se určí podle typů operandů, ne výsledné hodnoty). A "===" pak samozřejmě porovnává i typ, ne jen hodnotu.

PHP si s typy prostě dělá co sám chce podobně jako JS a je na to potřeba si dávat pozor - pokud si nejsem jistý, doplním před výpočtem nebo porovnáváním konverzi na stejný typ.
Třeba C# je daleko striktnější (předpokládám i java) a pokus o porovnávání stringu a čísla pomocí == mi vůbec nedovolí.
 


PHP include/require versus Python import
« Odpověď #50 kdy: 07. 09. 2018, 16:03:44 »
Citace
Tomu chápem, akurát to pozajtra zabudnem. Python má jeden import, PHP má na výber štyri možnosti, a teraz programátor musí uvažovať, ktorú si má zvoliť. Je to čo mu sa tuším hovorí zbytočný mental burden.

Programátor uvažovat nemusí. Na include může rovnou zapomenout. Pro vkládání knihoven může používat pouze require_once, a dál uvažovat nemusí.

Python používá import v podobném duchu jako require_once. Python řeší moduly, PHP pouze vkládá soubory - i když to ve výsledku dopadne podobně.

PHP operátory == a ===
« Odpověď #51 kdy: 07. 09. 2018, 16:17:20 »
Citace
Ďalšia vec, ktorú som si včera všimol. PHP má podobne ako JavaScript dva operátory na porovnanie, == a ===.
Operátor == má množstvo problémov, napr:

Oba operátory pracují tak jak mají.

1) Operátor === a !== vyžadují pro rovnost 1) oba operandy musí být stejného typu, 2) oba oerandy musejí mít stejnou hodnotu. V případě objektů se za stejnou hodnotu považuje pouze to, že se jedná o stejné objekty.

2) Operátory == a != se naproti tomu snaží nejdříve provést typové konverze.

a) Všechny null operandy převede na prázdný string.
b) Pokud je alespoň jeden operand boolean, převede i druhý operand na boolean.
c) Pokud je alespoň jeden operand číslo, převede i druhý operand na číslo.

A pak teprve porovnává. S tím, že:

a) Při porovnávání objektů se porovnává rovnost typu objektů a rovnost všech astributů (proměnných) třídy.
b) Porovnávání pole s jakýmkoli jiným typem dopadne tak, že pole je vždy větší než to druhé.
c) Porovnávání objektu s čímkoli jiným - objekt je vždy větší.
d) Řetězce a čísla se porovnávají očekávaně (po typové konverzi).

Citace
Číslo 12 a string '12b' sú podľa tohoto operátora == rovnaké.

Protože jeden z operandů je číslo. Takže PHP převede i druhý operand "12b" na číslo. PHP bohužel řetězce na čísla převádí velkoryse, bere zepředu všechny číslice, dále to ignoruje. \intval("12b") je tedy 12.

Po typové konverzi pak PHP porovná 12 == 12, a to je "rovnaké".

Porovnávání reálných čísel dobrý programátor nedělá
« Odpověď #52 kdy: 07. 09. 2018, 16:25:40 »
Citace
Operátor === sa odporúča používať, má odstraňovať problémy ==. Pritom prináša ďalšie problémy, trebárs:

Kód: [Vybrat]
$x = 100;
$y = $x + 0.0e0;
echo ($x ==  $y) ? 'equal' : 'not equal';
echo ($x === $y) ? 'equal' : 'not equal';

Pri pripočítaní nuly s desatinnou čiarkou dôjde k situácii, kde operátor === vráti 'not equal'.

V každém programovacím jazyce platí, že:

a) Celá čísla jsou čísla přesná, tudíž jejich porovnávání dopadne vždy správně.
b) Reálná čísla (v plovoucí čárce) jsou čísla nepřesná, tudíž jejich porovnávání nemusí dopadnout správně.

V každém programovacím jazyce platí, že porovnávání dvou stejných reálných čísel může nebo nemusí ukázat rovnost. Je to proto, že reálná čísla nejsou přesná.

Právě tento fakt je jediným důvodem, proč se zavedla celá čísla v programovacích jazycích. Protože celá čísla se chovají předvídatelně, reálná čísla nikoli. Reálná čísla se nikdy, zdůrazňuji nikdy, neporovnávají přímo - protože nelze zaručit jak to dopadne.

Pokud už je nutné porovnávat reálná čísla, dává se tomu tolerance.

Namísto

if ($x == $y) echo "Reálná čísla jsou stejná";

se píše něco jako

if (\abs($x - $y) < 1e-5) echo "Reálná čísla jsou stejná";

PetrN

Re:Jaký webový framework zvolit?
« Odpověď #53 kdy: 07. 09. 2018, 16:29:58 »
PHP si s typy prostě dělá co sám chce podobně jako JS a je na to potřeba si dávat pozor - pokud si nejsem jistý, doplním před výpočtem nebo porovnáváním konverzi na stejný typ.

Vím, co máte na mysli, ale aby to někdo špatně nepochopil, PHP si s typy prostě nědělá co chce, pokud si to nepřejeme.


Kód: [Vybrat]
declare(strict_types=1);

function sum(int $a, int $b) {
    return $a + $b;
}

try {
    var_dump(sum(1, 2));
    var_dump(sum(1.5, 2.5));
} catch (TypeError $e) {
    echo 'Error: '.$e->getMessage();
}

Výsledek:
int(3)
Error: Argument 1 passed to sum() must be of the type integer, float given, called in - on line 10
http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration

Nikdo nikomu v PHP nezakazuje, aby si strikně dodržoval nějaká stanovená pravidla.

Zavírání DB připojení
« Odpověď #54 kdy: 07. 09. 2018, 16:33:37 »
Citace
[a) Máme Symfony controller a v ňom sa pripájame cez DBAL na databázu. Je potrebné nejako explicitne
uzatvoriť objekt connection?
Vraj netreba, lebo PHP má všetko na konci cyklu request/response uzavrieť, ale nejako sa mi to nezdá. V Jave poctivo voláme na objekte connection close metódu.

Kód: [Vybrat]
/**
 * @Route("/getdata", name="getdata")
 */
public function data(Connection $conn)
{
    $data = $conn->fetchAll("SELECT * FROM countries LIMIT 5");

    return $this->json([
        'data' => $data
    ]);
}

Já se ve všech programovacích jazycích a frameworcích řídím tím, že kdo objekt vytvořil, ten ho má zavřít. Je to takové nepsané pravidlo. Pokud je nutné zrušit objekt někým jiným - bývá to popsáno a zdůrazněno.

PHP výjimka v kontrolleru
« Odpověď #55 kdy: 07. 09. 2018, 16:39:36 »
Citace
c) Používať try/catch v kotrolleri alebo nie? Podľa PHP delusions https://phpdelusions.net/delusion/try-catch treba použiť try/catch len v zriedkavých prípadoch, inak to treba nechať doplávať do systémového kódu, ktorý by mal vygenerovať error page.

Pro výjimky platí to co všude.

a) Pokud víte, jak výjimku ošetřit, a dostat se do rozumného stavu - použijte try/catch, a výjimku chyťte a ošetřete.

b) Pokud nevíte, jak výjimku ošetřit, ale je třeba změnit typ/zprávu výjimky na něco jiného, pro volající vrstvy vhodnějšího - použijte try/catch, výjimku chytněte a vyhoďte namísto ní vhodnější výjimku.

c) Pokud nevíte co s výjimkou, nechte jí proplavat výše.

Citace
Ja som primárne Javista. V Java sa viem obvykle dopátrať ku best practices, v PHP sa mi to zdá viac zamotané.

Best practices jsou na 99 % společné mezi všemi jazyky.

V PHP je pouze více možností. A také se v PHP pohybují méně zkušení programátoři - takže se často dělají věci, které nejsou příliš dobré.

PHP si s typy dělá co chce
« Odpověď #56 kdy: 07. 09. 2018, 16:45:01 »
Citace
PHP si s typy prostě dělá co sám chce podobně jako JS a je na to potřeba si dávat pozor - pokud si nejsem jistý, doplním před výpočtem nebo porovnáváním konverzi na stejný typ.

PHP má jasně definováno, co se děje s typy. Dělá tedy přesně to, co má předepsáno.

Ochotnější automatické přetypování v PHP je důsledkem toho, že PHP vychází z Perlu.

JSH

Re:Porovnávání reálných čísel dobrý programátor nedělá
« Odpověď #57 kdy: 07. 09. 2018, 16:45:24 »
Citace
Operátor === sa odporúča používať, má odstraňovať problémy ==. Pritom prináša ďalšie problémy, trebárs:

Kód: [Vybrat]
$x = 100;
$y = $x + 0.0e0;
echo ($x ==  $y) ? 'equal' : 'not equal';
echo ($x === $y) ? 'equal' : 'not equal';

Pri pripočítaní nuly s desatinnou čiarkou dôjde k situácii, kde operátor === vráti 'not equal'.

V každém programovacím jazyce platí, že:

a) Celá čísla jsou čísla přesná, tudíž jejich porovnávání dopadne vždy správně.
b) Reálná čísla (v plovoucí čárce) jsou čísla nepřesná, tudíž jejich porovnávání nemusí dopadnout správně.

V každém programovacím jazyce platí, že porovnávání dvou stejných reálných čísel může nebo nemusí ukázat rovnost. Je to proto, že reálná čísla nejsou přesná.

Právě tento fakt je jediným důvodem, proč se zavedla celá čísla v programovacích jazycích. Protože celá čísla se chovají předvídatelně, reálná čísla nikoli. Reálná čísla se nikdy, zdůrazňuji nikdy, neporovnávají přímo - protože nelze zaručit jak to dopadne.

Pokud už je nutné porovnávat reálná čísla, dává se tomu tolerance.

Namísto

if ($x == $y) echo "Reálná čísla jsou stejná";

se píše něco jako

if (\abs($x - $y) < 1e-5) echo "Reálná čísla jsou stejná";
Ano, obecně to pro floaty platí. Jenže tady je zrovna důvod jiný. 100 je ve floatu exaktní, nedošlo tam k žádnému zaokrouhlení. Takže to porovnání vrací false z jiného důvodu. Podle popisu === bych tipoval, že je to proto, že integer a float to bere jako různé typy.

Re:Porovnávání reálných čísel dobrý programátor nedělá
« Odpověď #58 kdy: 07. 09. 2018, 17:02:22 »
Citace
Ano, obecně to pro floaty platí. Jenže tady je zrovna důvod jiný. 100 je ve floatu exaktní, nedošlo tam k žádnému zaokrouhlení. Takže to porovnání vrací false z jiného důvodu. Podle popisu === bych tipoval, že je to proto, že integer a float to bere jako různé typy.

To máte naprosto pravdu. Jsou to různé typy.


Jano7

Re:Jaký webový framework zvolit?
« Odpověď #59 kdy: 07. 09. 2018, 19:12:05 »
Citace
Ani tady v tom nevidím žádné překvapení - $x je int, $y bude kvůli druhému operandu ve sčítání float (typ výsledku se určí podle typů operandů, ne výsledné hodnoty). A "===" pak samozřejmě porovnává i typ, ne jen hodnotu.

Citace
PHP má jasně definováno, co se děje s typy. Dělá tedy přesně to, co má předepsáno.

Z dokumentácie sa to dá pochopiť, aký je tam rozdiel. Ale existuje tiež niečo ako zavedené postupy v programovaní, štandardné správanie.

Kód: [Vybrat]
int x = 100;
double y = x + 0.0e0;
System.out.println(x == y);

Java vráti true.

Kód: [Vybrat]
int x = 0;
double y = x + 0.0e0;

Console.WriteLine(x == y);

C# vráti True.

Kód: [Vybrat]
#!/usr/bin/perl

$x = 100;
$y = $x + 0.0e0;

print($x == $y);

Perl vráti 1.

Kód: [Vybrat]
#!/usr/bin/ruby

x = 100
y = x + 0.0e0

puts x == y

Ruby vráti true.

Kód: [Vybrat]
#!/usr/bin/python3

x = 100
y = x + 0.0e0

print(x == y)

Python vráti True.

Kód: [Vybrat]
let x = 100;
let y = x + 0.0e0;

console.log(x == y);
console.log(x === y);

JavaScript vráti true true.