{"id":229663,"date":"2022-11-21T11:42:00","date_gmt":"2022-11-21T08:42:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229663"},"modified":"2022-11-21T16:57:28","modified_gmt":"2022-11-21T13:57:28","slug":"objektorienteeritud-programmeerimine-liideste-moistmine","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/et\/objektorienteeritud-programmeerimine-liideste-moistmine\/","title":{"rendered":"Objektorienteeritud programmeerimine: liideste m\u00f5istmine"},"content":{"rendered":"\n<p>Siinkohal \u00fctleksin, et objektorienteeritud programmeerimise m\u00f5istmise alused on loodud.<\/p>\n<p>T\u00e4psemalt olen k\u00e4sitlenud j\u00e4rgmist:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"Abstraktsioon\">Abstraktsioon<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-esimest-sammast\/\" title=\"Kapseldamine\">Kapseldamine<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-teist-sammast\/\" title=\"P\u00e4rand\">P\u00e4rand<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/et\/oop-kaks-teist-sammast\/\" title=\"Pol\u00fcmorfism\">Pol\u00fcmorfism<\/a><\/li>\n<\/ol>\n<p>Ja, jah, vaieldakse selle \u00fcle, mis on alused (st m\u00f5ned ei viska pol\u00fcmorfismi segusse, kuigi ma teen). Kuid \u00fclaltoodud neli peaksid andma kindla aluse, millelt j\u00e4tkata oma objektorienteeritud programmeerimisoskuste arendamist.<\/p>\n<p>Neid on rohkemgi, kuid ma arvan, et need pole nii s\u00fcgavad, \u00fcksikasjalikud v\u00f5i raskesti m\u00f5istetavad kui m\u00f5ned eelnimetatud m\u00f5isted. Siis j\u00e4lle tulevad erinevad asjad teistele kergemini.<\/p>\n<p>Igal juhul on j\u00e4rgmised kaks teemat, millest on oluline aru saada:<\/p>\n<ol>\n<li>Liidesed<\/li>\n<li>Abstraktsioon<\/li>\n<\/ol>\n<p>Ma r\u00e4\u00e4gin iga\u00fchest eraldi, kuid veenduge, et olete k\u00f5igepealt lugenud <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">p\u00f5hialuste<\/a> seeriat, sest \u00fclaltoodud kaks teemat v\u00f5imaldavad teil neile toetuda ja neid \u00e4ra kasutada.<\/p>\n<p>Ebam\u00e4\u00e4rane, ma tean, aga lubage mul selgitada ja siis minna sealt edasi.<\/p>\n<h2>Liideste m\u00f5istmine<\/h2>\n<p>K\u00f5ige tavalisem liidese m\u00e4\u00e4ratlus, mida t\u00f5en\u00e4oliselt kuulete, on see, et tegemist on lepinguga. See pole vale, kuid arvan, et see j\u00e4tab palju soovida.<\/p>\n<p>N\u00e4iteks kui m\u00f5tlete lepingutele, m\u00f5tlete t\u00f5en\u00e4oliselt millelegi, mis on v\u00e4ga seotud, palju k\u00f5nepruuki, keeruline protsess millegi allkirjastamiseks, kuup\u00e4evaks saamiseks, t\u00f6\u00f6valmistamiseks ja nii edasi.<\/p>\n<p>Kuid mis puudutab programmeerimisliidest, siis see pole tegelikult nii. Tegelikult v\u00e4idan, et liideste m\u00e4\u00e4ratlemine v\u00f5ib muuta programmeerimise lihtsamaks ja see leevendab palju b\u00fcrokraatiat, kuna muudab asjad v\u00e4ga mustaks v\u00f5i valgeks, mida midagi peaks rakendama.<\/p>\n<h3>M\u00f5ni s\u00f5na liideste kohta<\/h3>\n<p>Meie t\u00f6\u00f6stus kasutab s\u00f5na &quot;liides&quot; kahe asja jaoks:<\/p>\n<ul>\n<li>Disainerid ja kasutajad kasutavad m\u00f5istet liides, et kirjeldada, mida nad n\u00e4evad ja kuidas nad rakendusega suhtlevad. See h\u00f5lmab selliseid asju nagu nupud, rippmen\u00fc\u00fcd ja muud elemendid, mida saame puudutada.<\/li>\n<li>Programmeerijad kasutavad seda terminit, et viidata sellele, milliseid funktsioone alamklass peab liidese j\u00e4rgimiseks rakendama. Seda nimetatakse liidese programmeerimiseks.<\/li>\n<\/ul>\n<p>Viimast selles artiklis k\u00e4sitletakse. Ja ei, me ei kavatse kasutada t\u00fc\u00fcpilisi n\u00e4iteid, nagu programmeerimine <strong>loomaliidesele<\/strong> v\u00f5i mis iganes. Selle asemel vaatame seda tegelike koodin\u00e4idiste p\u00f5hjal.<\/p>\n<h3>Programmeerimine liidesele<\/h3>\n<p>Me defineerime &quot;liidesesse programmeerimist&quot; kui viisi, kuidas saame kirjutada koodi, mis rakendab nimetatud liideses m\u00e4\u00e4ratletud funktsioonide allkirju.<\/p>\n<p>Aga mis on meetodi allkirjad? Lihtsamalt \u00f6eldes h\u00f5lmavad meetodi allkirjad:<\/p>\n<ul>\n<li>funktsiooni nimetuse nimi,<\/li>\n<li>argumendid, mida see n\u00f5uab,<\/li>\n<li>n\u00e4htavuse muutja<\/li>\n<\/ul>\n<p>Klassi kontekstis n\u00e4ete seda <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmiselt:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) \n  {\n    \/\/ method implementation\n  }\n}\n<\/code><\/pre>\n<p>Lihtne, eks?<\/p>\n<p>\u00dclaltoodud koodis n\u00e4eme, et <strong>komplekti<\/strong> funktsioon aktsepteerib kasutatavat <strong>v\u00f5tit<\/strong> ja <strong>v\u00e4\u00e4rtust<\/strong> ning funktsioonile p\u00e4\u00e4seb juurde iga objekt, millel on klassile viide.<\/p>\n<p>Kuid liidesed v\u00f5ivad ka seda sisaldada. Siiski on hoiatus: liidestel pole meetodi rakendamist.<\/p>\n<p>Nii et selle asemel <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">:<\/a><\/p>\n<pre><code>&lt;?php\n\nclass Cache \n{\n  public function set($key, $value) {\n    set_transient($key, $value);\n  }\n}\n<\/code><\/pre>\n<p>N\u00e4ete <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">seda:<\/a><\/p>\n<pre><code>&lt;?php\n\ninterface iCache \n{\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n<\/code><\/pre>\n<p>Kuid \u00fclaltoodud koodis on ka paar n\u00fcanssi, mida t\u00e4hele panna.<\/p>\n<ul>\n<li>See kood ei m\u00e4\u00e4ratle seda klassina. Selle asemel nimetatakse seda <strong>liideseks<\/strong>.<\/li>\n<li>Klassi nime ees on i, mis n\u00e4itab, et tegemist on liidesega. See ei ole n\u00f5utav; see on konventsioon.<\/li>\n<li>Meetodil pole rakendust. Sellel pole midagi peale allkirja.<\/li>\n<\/ul>\n<p>Liidese loomisel \u00fctleme, nagu eespool mainitud, et mis iganes klass seda liidest rakendab, m\u00e4\u00e4rab selles sisalduvad meetodid.<\/p>\n<p>Nii et kui peaksime k\u00f5ik \u00fclaltoodud asjad kokku siduma, n\u00e4eks l\u00f5plik teostus v\u00e4lja <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">j\u00e4rgmine<\/a> (kuigi ideaaljuhul hoiaksime seda eraldi failides):<\/p>\n<pre><code>&lt;?php\n\ninterface iCache {\n  public function set($key, $value);\n  public function get($key);\n  public function has($key);\n}\n\npublic class SimpleCache implemnents iCache\n{\n  public function set($key, $value)\n  {\n    set_transient($key, $value, DAY_IN_SECONDS);\n  }\n\n  public function get($key)\n  {\n    if (!$this-&gt;has($key))\n    {\n      return false;\n    }\n    return get_transient($key);\n  }\n\n  public function has($key)\n  {\n    return false !== get_transient($key);\n  }\n}\n<\/code><\/pre>\n<p>Ja nii sobivad liidesed ja klassid kokku.<\/p>\n<h2>See on see?<\/h2>\n<p>Lihtsamalt \u00f6eldes jah. Kuid oma kogemuse p\u00f5hjal olen avastanud, et see on midagi enamat kui lihtsalt meetodite m\u00e4\u00e4ratlemine ja nende rakendamine.<\/p>\n<p>Sageli on lihtne m\u00e4\u00e4ratleda klasse, seej\u00e4rel m\u00e4\u00e4ratleda liides ja seej\u00e4rel liides rakendada. Aga see on <strong>t\u00e4iesti<\/strong> tagurpidi. Selle asemel peame oma t\u00f6\u00f6 \u00fcle strateegilisemalt m\u00f5tlema.<\/p>\n<p>Selle asemel, et asuda liidesesse, mis eesm\u00e4rgi t\u00e4ielikult kaotab, peame alustama laialt, et meie klassid saaksid spetsialiseeruda sellele, mida nad teevad, rakendades samal ajal funktsioone, mis on \u00fchised mitte ainult sellele klassile, vaid ka teistele klassidele, mis v\u00f5ivad vajada samu funktsioone.<\/p>\n<p>\u00dclaltoodud n\u00e4idet kasutades v\u00f5ib meil olla <strong>SimpleCache<\/strong>, <strong>TransientCache<\/strong> v\u00f5i m\u00f5nda muud t\u00fc\u00fcpi vahem\u00e4lu. Olenemata sellest, millist t\u00fc\u00fcpi vahem\u00e4lu me rakendame, rakendavad nad liidest ja funktsionaalsus j\u00e4etakse liidest rakendava klassi hooleks.<\/p>\n<p>Seega m\u00e4\u00e4ratleme, milline v\u00f5ib vahem\u00e4lu k\u00f5rgel tasemel v\u00e4lja n\u00e4ha, kuid rakendusklassid m\u00e4\u00e4ravad t\u00e4pselt, kuidas need toimivad.<\/p>\n<hr \/>\n<p>Kui olete WordPressi arendaja ja soovite \u00f5ppida, kuidas praktilisi objektorienteeritud tehnikaid kasutades rakenduse peale asju ehitada, siis <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">miks mitte saidiga liituda?<\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programmeerimisliidese \u00fcks m\u00e4\u00e4ratlus on see, et see on leping. Arvan, et liideste m\u00f5istmisel j\u00e4tab see palju soovida.<\/p>\n","protected":false},"author":1,"featured_media":164880,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[718,894,842],"tags":[1165],"class_list":["post-229663","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arendaja","category-kood","category-opetused","tag-affiai-et"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229663","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/comments?post=229663"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/posts\/229663\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/media?parent=229663"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/categories?post=229663"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/et\/wp-json\/wp\/v2\/tags?post=229663"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}