14. Elvek, mĂłdszertanok
=======================

ProgramozĂĄsi paradigmĂĄk
-----------------------

* A programok elkĂŠszĂ­tĂŠsĂŠhez absztrakciĂł szintjĂŠn a megkĂśzelĂ­tĂŠst lehet megprĂłbĂĄlni csoportosĂ­tani.
* Nem kizárólagosan ennyi van. A gyakrabban előfordulók/elfogadottak kerülnek említésre.
* Nem csak programozási, hanem általában programozás során előforduló nyelvek esetében beszélhetünk ezekről.

.. warning::

	Az elterjedt programozási nyelvek jelentős része multiparadigma nyelv!

ImperatĂ­v programozĂĄs
~~~~~~~~~~~~~~~~~~~~~~~~

* A megoldandĂł problĂŠmĂĄt lĂŠpĂŠsek, vĂŠgrehajtandĂł procedĂşrĂĄk sorozatĂĄra bontjuk.
* LeĂ­rjuk, hogy a gĂŠpnek mi utĂĄn mit kell majd elvĂŠgeznie.
* ProcedurĂĄlis programozĂĄs ennek az egyik leggyakoribb megvalĂłsĂ­tĂĄsa.

Objektum OrientĂĄlt ProgramozĂĄs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* RĂśviden OOP-kĂŠnt szokĂĄs emlegetni.
* Az ĂśsszetartozĂł adatokat ĂŠs a mĹąveleteiket egy egysĂŠgben, objektumokkĂŠnt kezeli.
* MegkĂźlĂśnbĂśztetĂźnk prototĂ­pus ĂŠs osztĂĄly alapĂş objektum orientĂĄltsĂĄgot.
* TisztĂĄn objektum orientĂĄlt nyelveknek nevezik azokat, melyekben minden objektum.
* Vannak objektum alapú nyelvek is, melyek használnak objektumokat, de saját típusokat nem lehet definiálni. (Egyszerűbb szkript nyelvekre jellemző.)

PĂŠldĂĄul: *SmallTalk*, *Java*

FunkcionĂĄlis programozĂĄs
~~~~~~~~~~~~~~~~~~~~~~~~

* A programokat, mint a matematikai ĂŠrtelemben vett fĂźggvĂŠnyeket tekinthetjĂźk.
* FĂźggvĂŠnyek hĂ­vnak fĂźggvĂŠnyeket.
* Egy igen lĂŠnyeges fogalma a mellĂŠkhatĂĄsmentessĂŠg. (*Pure function*)
* Az adatok ĂŠs a hozzĂĄ tartozĂł mĹąveletek kĂŠt kĂźlĂśn egysĂŠgben kezeljĂźk.
* Nagyon jól tesztelhetőek.
* A valĂłs problĂŠmĂĄk egy rĂŠszĂŠre nehezen illeszkednek.

PĂŠldĂĄul: *Haskell*, *Clojure*

DeklaratĂ­v programozĂĄs
~~~~~~~~~~~~~~~~~~~~~~

* Azt adjuk meg, hogy az eredmĂŠnyt milyen formĂĄban szeretnĂŠnk viszont lĂĄtni.
* Általåban rÜvid, tÜmÜr, emberek szåmåra egyszerŹbb, magasabb szintŹ megfogalmazåsåt adja a problÊmånak.
* A vĂŠgrehajtĂĄsa nehezebb. Bonyolultabb fordĂ­tĂĄsi, ĂŠrtelmezĂŠsi fĂĄzisra van hozzĂĄ szĂźksĂŠg.

PĂŠldĂĄul: *Prolog*, *SQL*

Elvek, ajĂĄnlĂĄsok
----------------

* Egyre gyakrabban/gyorsabban vĂĄltozĂł igĂŠnyek a szoftverrel szemben.
* A fejlesztĂŠsi ciklusok lerĂśvidĂźltek.
* Gyakori, 1-2 hetes kiadĂĄsok
* *ExtrĂŠm programozĂĄs*
* A tesztelĂŠsnek egyre fontosabb a szerepe.
* *Legacy kĂłd*: Nem az elkĂŠszĂ­tĂŠs ideje szĂĄmĂ­t, hanem, hogy mennyire van tesztelve/dokumentĂĄlva
* *Code Review*, *Pair Programming*
* Minőségre vonatkozó metrikák
* *Continuous Integration*: Mindig van egy stabil, az Ăśsszes teszteseten ĂĄtesett kiadĂĄs.

DRY
~~~

* *Dont Repeat Yourself*
* TĂśbbek kĂśzĂśtt az implementĂĄlt funkcionalitĂĄs felesleges redundanciĂĄjĂĄnak csĂśkkentĂŠsĂŠre tĂśrekszik.

SOLID
~~~~~

* Single responsibility
* Open-closed
* Liskov substitution
* Interface segregation
* Dependency inversion

MĂłdszertanok
------------

SCRUM
~~~~~

* Egy agilis szoftverfejlesztĂŠsi metodika.
* Keretet, ajĂĄnlĂĄsokat, szerepkĂśrĂśket ad.
* 1-4 hetes sprintekben lehet gondolkodni (nem hosszabb tĂĄvĂş fejlesztĂŠsekben).
* A cégek jelentős része aktuálisan ennek valamilyen változatát használja.

Tipikus szerepkĂśrĂśk

* *Scrum Master*: FelĂźgyeli, segĂ­ti a csapat mĹąkĂśdĂŠsĂŠt
* *Product Owner*: A termĂŠkkel kapcsolatos igĂŠnyeket kĂŠpviseli, segĂ­t priorizĂĄlni a feladatokat
* *Developers*: Fejlesztők

KANBAN
------

* A mĂłdszert a Toyota Motor Corporation-nĂŠl fejlesztettĂŠk ki.
* A Kanban szĂł kĂĄrtyĂĄt jelent.
* A kártyák egy-egy feladatot szimbolizálnak, amelyek sorban áthaladnak a különböző fejlesztési fázisokon.

TDD
~~~

*Test Driven Development*

A program fejlesztést 3, egymás után ismétlődő fázisra bontja.

* Teszt Ă­rĂĄsa az Ăşj funkcionalitĂĄs szĂĄmĂĄra. (Lefuttatva sikertelen lesz, amelyet ĂŠrdemes megnĂŠzni.)
* MinimĂĄlis funkcionalitĂĄs hozzĂĄadĂĄsa, amellyel mĂĄr sikeres lesz a teszt.
* A teszttel validĂĄlt kĂłd refaktorĂĄlĂĄsa.

Az említett módszereket különböző arányban és formában szokták használni.