Ce limbaje trebuie sa stapanesti pentru framework-uri

python
javascript
php

(Damian Florescu) #1

Cam ce ar trebui sa cunosc ca in palma pentru a folosi framework-urile?
DJango: Framework web pentry python ce ar trebui sa cunosc ca in palma pentru a lucra cu el ?
Zend 2,3 etc: Stiu PHP basic sintaxa, obiecte, etc. Este suficient sa ma apuc de un exeperiment in el?
Daca mai stiti frameworkuri web de orice fel as aprecia orice indicatie sau alternativa la zend. Initial am vrut sa incep cu laravel pe partea asta de frameworkuri web dar am auzit ca are update-uri dese care iti strica treaba. Voi ce spuneti ?


(Georgiana Gligor) #2

iti recomand sa inveti f bine lumbajul (“ca in palma”) mult inainte de frameworkuri

daca lucrezi in ritm de 8-9h/zi la treaba adta, uite metoda pe care o folosesc eu de vreo 7 ani: https://speakerdeck.com/gbtekkie/ipc-spring-2018-how-to-train-your-minions


#3

Laravel este grozav dacă vrei să-ți faci treaba repede, însă nu te poți numi programator dacă îl folosești fără să ajungi la un nivel de cunostințe foarte avansate în PHP și MySQL. Ce vreau să zic este că de multe ori un framework te oprește din acumularea de experiență într-un limbaj de programare fiindcă “te obligă” să înveți framework-ul, nu limbajul de programare.
Acum depinde de tine ce vrei să faci.
Django e foarte bun fiindcă ai în spate python cu care poți să faci chestii mult mai avansate decât cu php.


(Serghei Amelian) #4

Care-s chestiile alea? :slight_smile:


(Ionel Cristian Mărieș) #5

Metaclase, descriptori, biblioteci pentru aproape orice și mână liberă la integrat orice bibliotecă de sistem (ctypes, cffi, cython etc).

Eu nu îs de acord cu premisa că trebuie să știi Python ca în palmă mult înainte să fii competent cu Django. Nu trebuie să înțelegi metaclase ca să scrii un model, și nici nu trebuie sa fii expert în metaclase ca să întelegi cum implementează Django modele (cu metaclase, în caz că nu era evident).


Altă chestiune, nu te crampona în „ce ar trebui să fac/știu/aleg”. Chiar nu contează. Apucă-te de făcut ceva aplicație și o să îți dai seama. Aceeași dilemă o are și maică-mea cu „cum sărăcie ai știut că setarea X face Y să meargă în Windows”. Chestia e că nu am știut niciodată, pur și simplu am luat la rând toate setările până am dat de soluție. Diferența e că nu m-am cramponat în acest fals „nu știu ce să fac/știu/aleg”.


#6

Si cum acumulezi cunostintele acelea foarte avansate in conditiile curente de piata?


#7

Înveți framework-ul și nu doar atât, ci înveți și limbajul de programare în care a fost dezvoltat, astfel îți permiți să și umbli under the blanket la sursă și să tweak-uiești sau de ce nu, să dezvolți pachete pt framework.
Companiile mari care dezvoltă aplicații, de exemplu în Python, au de obicei și programatori în C sau C++ care dezvoltă librării custom pentru Python, Linux.


#8

Asta este altceva. Mai sus ati dat de inteles ca ar trebui sa devii expert in PHP inainte sa lucrezi cu un framework, ceea ce este destul de greu de realizat in momentul asta, tinand cont ca se cer cunostinte de frameworkuri si pentru pozitii de incepatori.


#9

Am zis: “însă nu te poți numi programator”. Anyway, nu mai contează ce zic, fiecare înțelege ce vrea.


(Serghei Amelian) #10

Şi ce anume te împiedică să faci toate chestiile astea în PHP?


#11

Python: https://docs.python.org/3/library/os.html
PHP: ?


(Serghei Amelian) #12

La aşa ceva te referi? http://php.net/manual/ro/ref.posix.php


(Ionel Cristian Mărieș) #13

Limbajul? :slight_smile: Nu te supăra dar le ridici la fileu - ca și cum te-ai duce la restaurant și ai întreba ce-l împiedică pe bucătar să-ți facă și revizia la mașină în timp ce iei masa, ca doară lucrează cu ulei … formulezi întrebările de parcă nu am ști PHP deloc …

Cel mai apropiat lucru de descriptorii din Python în PHP sunt metodele __get și __set - dar e ceva mult mai simplu. Nu neapărat un lucru rău dar nu permite decuplarea (cel puțin prin construcțiile native ale limbajului) implementării get/set de uzul lui.

PHP nu are metaclase deloc. Dacă vrei metaprogramare te descurci doar cu șiruri de caractere și eval.

La FFI și bibioteci PHP nu are suport nativ, iți copiezi niște DLL/SO-uri de pe internet și te rogi să meargă.


(Ionuț Staicu) #14

Poți explica (pentru cine nu a avut contact cu așa ceva) în câteva cuvinte ce sunt alea metaclase? Am găsit articol pe blogul tău dar… dacă nu am avut treabă cu Python (dincolo de hello world), mai mult mă bagă în ceață decât mă ajută.

Eventual și un usecase simplu?

Răspunsul ăsta de pe SO este atât de meta încât n-am înțeles mare lucru :smiley:

A metaclass is the class of a class. Like a class defines how an instance of the class behaves, a metaclass defines how a class behaves. A class is an instance of a metaclass.

Ce am înțeles eu din asta este că metaclass ar fi (oarecum) echivalentul moștenirii?


(Serghei Amelian) #15

M-am exprimat greşit, nu ziceam să lucrezi în PHP ca şi cum ai lucra in Python (altfel de ce naiba ar mai exista mai multe limbaje). Mă refeream la faptul că poţi să implementezi in PHP orice chestie pe care o poţi implementa în orice al limbaj. Că diferă metoda… e complet irelevant. Cel puţin pentru mine, syntactic sugar nu e vreo mare şmecherie.


(Ionel Cristian Mărieș) #16

Metaclasa controlează felul în care este „produsă” clasa, ca și cum ai avea un plugin la compilatorul de C++ care modifică clasele să fie un pic altfel (exemplu: să aibă logging în plus la toate metodele) - comparabil cu AOP din punctul ăsta de vedere, sau să producă ceva în funcție de ce conține clasa (exemplu: o schemă sql) - comparabil cu introspecția din punctul ăsta de vedere.

Cred că cel mai simplu e cel din cu modelele (Django, SqlAlchemy, Marshmallow etc), cam așa ar arata ultra-simplificat:

    class Field:
        def __repr__(self):
            return 'Field(name={.name})'.format(self)

    class Metaclass(type):
        def __new__(mcs, name, bases, attrs):
            fields = attrs.setdefault('fields', [])
            for name, value in attrs.items():
                if isinstance(value, Field):
                    value.name = name
                    fields.append(value)
            return super(Metaclass, mcs).__new__(mcs, name, bases, attrs)

    class Model(metaclass=Metaclass):
        a = Field()
        b = Field()

Ar merge așa:

    >>> print(MyModel.fields)
    [Field(name=a), Field(name=b)]

Practic tot ce face acea metaclasă e introspecție plus adăugarea unui camp nou (acel fields).