{"id":230284,"date":"2022-11-22T15:54:00","date_gmt":"2022-11-22T12:54:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230284"},"modified":"2022-11-22T15:54:07","modified_gmt":"2022-11-22T12:54:07","slug":"abstraktit-luokat-osa-2-abstraktit-luokat-ja-kaeyttoeliittymaet","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/abstraktit-luokat-osa-2-abstraktit-luokat-ja-kaeyttoeliittymaet\/","title":{"rendered":"Abstraktit luokat, osa 2 \u2013 Abstraktit luokat ja k\u00e4ytt\u00f6liittym\u00e4t"},"content":{"rendered":"\n<p>T\u00e4m\u00e4n <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/abstract-classes-osa-1-abstraktiokaeyttaeytyminen\/\" title=\"sarjan edellisess\u00e4 postauksessa\">sarjan edellisess\u00e4 postauksessa<\/a><\/strong> k\u00e4vin l\u00e4pi:<\/p>\n<ul>\n<li>abstraktien luokkien perusteet,<\/li>\n<li>miten ne toteutetaan,<\/li>\n<li>ja toimitti toimivia koodiesimerkkej\u00e4.<\/li>\n<\/ul>\n<p>Ja vaikka uskon, ett\u00e4 abstraktien luokkien ymm\u00e4rt\u00e4minen on avainasemassa luotaessa vahvaa perustaa olio-ohjelmoinnille, huomaan usein, ett\u00e4 voi olla h\u00e4mment\u00e4v\u00e4\u00e4 verrattaessa niit\u00e4 rajapintoihin ja tiet\u00e4\u00e4, milloin niit\u00e4 tulee k\u00e4ytt\u00e4\u00e4.<\/p>\n<h2>Abstraktit luokat ja k\u00e4ytt\u00f6liittym\u00e4t<\/h2>\n<p>Joten t\u00e4ss\u00e4 postauksessa aion jakaa:<\/p>\n<ul>\n<li>nopea p\u00e4ivitys siit\u00e4, mit\u00e4 k\u00e4ytt\u00f6liittym\u00e4t ovat,<\/li>\n<li>mit\u00e4 abstrakteja luokat ovat,<\/li>\n<li>ja sitten kuinka tiet\u00e4\u00e4, milloin k\u00e4ytt\u00e4\u00e4 toista.<\/li>\n<\/ul>\n<p>T\u00e4m\u00e4n artikkelin ei pit\u00e4isi olla koodausintensiivinen, mutta sen pit\u00e4isi auttaa tiet\u00e4m\u00e4\u00e4n, milloin tietyn tyyppist\u00e4 koodia tulee kirjoittaa, jotta projekteja voidaan organisoida paremmin.<\/p>\n<h3>1 Liit\u00e4nn\u00e4t<\/h3>\n<p>Muista, ett\u00e4 mit\u00e4 tulee rajapintoihin, k\u00e4yt\u00e4mme my\u00f6s termi\u00e4 &quot;ohjelmointi rajapinnalle&quot; ajatuksena on, ett\u00e4 rajapinta m\u00e4\u00e4rittelee menetelm\u00e4t, jotka luokan tulee toteuttaa t\u00e4ytt\u00e4\u00e4kseen &quot;sopimuksen&quot; mainitun rajapinnan kanssa.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external\"><\/a>Perusk\u00e4ytt\u00f6liittym\u00e4n esittelyyn k\u00e4ytetty <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">koodi oli:<\/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>Mutta muista, ett\u00e4 k\u00e4ytt\u00f6liittym\u00e4n tarkoitus ei ole m\u00e4\u00e4ritell\u00e4 koodin kirjoittamisen j\u00e4lkeen. Sen sijaan se on ty\u00f6kalu, jolla suunnitellaan, mit\u00e4 luokkien tulisi toteuttaa, jos ne noudattavat tietty\u00e4 paradigmaa tai edellytt\u00e4v\u00e4t tiettyj\u00e4 toimintoja.<\/p>\n<p>Eli jos aiot suunnitella joukon luokkia, jotka toimivat v\u00e4limuistin kanssa, et kirjoita luokkia ensin. Kirjoitat ensin k\u00e4ytt\u00f6liittym\u00e4n ja sitten luokat toteuttavat mainitun rajapinnan.<\/p>\n<p>Ajatuksena on, ett\u00e4 kaikilla rajapinnan toteuttavilla luokilla on taatusti n\u00e4m\u00e4 toiminnot.<\/p>\n<h3>2 abstraktia luokkaa<\/h3>\n<p>Toisaalta abstraktit luokat antavat meille mahdollisuuden tehd\u00e4 <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">kaksi asiaa:<\/a><\/strong><\/p>\n<ol>\n<li>toteuttaa toimintoja, joita alaluokat voivat k\u00e4ytt\u00e4\u00e4,<\/li>\n<li>toteuttaa menetelm\u00e4n allekirjoitukset, jotka alaluokkien on toteutettava.<\/li>\n<\/ol>\n<p>T\u00e4m\u00e4 saattaa aluksi kuulostaa hieman ep\u00e4johdonmukaiselta, mutta harkitse t\u00e4t\u00e4:<\/p>\n<p>Kun sinulla on tietyntyyppinen luokka, jolla on johdonmukainen toiminnallisuus alaluokasta riippumatta, toiminnallisuus menee abstraktiin luokkaan. Kun muilla menetelmill\u00e4 on oltava menetelm\u00e4n toteutus, annat vain menetelm\u00e4n allekirjoituksen ja merkitset sen <strong>abstraktiksi<\/strong>.<\/p>\n<p>T\u00e4ss\u00e4 esimerkki <strong><a href=\"https:\/\/wordpress.mediadoma.com\/fi\/abstract-classes-osa-1-abstraktiokaeyttaeytyminen\/\" title=\"edellisest\u00e4 postauksesta:\">edellisest\u00e4 postauksesta:<\/a><\/strong><\/p>\n<p>T\u00e4m\u00e4 saa meid\u00e4t kaikki kiinni aiemmista esimerkeist\u00e4 ja aiemmista asioista, joihin meid\u00e4n on keskitytt\u00e4v\u00e4 koskien k\u00e4ytt\u00f6liittymi\u00e4 ja abstrakteja luokkia, mutta joillekin t\u00e4m\u00e4 ei viel\u00e4k\u00e4\u00e4n tarjoa paljon selkeytt\u00e4.<\/p>\n<p>Tarkemmin sanottuna t\u00e4m\u00e4 ei viel\u00e4k\u00e4\u00e4n vastaa kysymykseen: Kuinka p\u00e4\u00e4t\u00e4mme milloin k\u00e4yt\u00e4mme abstraktia luokkaa ja milloin k\u00e4ytt\u00f6liittym\u00e4\u00e4?<\/p>\n<p>P\u00e4\u00e4lle katsottuna se saattaa kuulostaa hieman h\u00e4mment\u00e4v\u00e4lt\u00e4, mutta on olemassa muutamia asioita, joiden avulla voit tehd\u00e4 p\u00e4\u00e4t\u00f6ksen.<\/p>\n<h2>Milloin k\u00e4yt\u00e4mme jokaista?<\/h2>\n<p>Muista, ett\u00e4 olio-ohjelmoinnin osalta voimme jakaa sen kolmeen eri tavalla:<\/p>\n<ul>\n<li>Luokat edustavat asiaa. Voit pit\u00e4\u00e4 n\u00e4it\u00e4 substantiivina.<\/li>\n<li>Attribuutit tai ominaisuudet ovat kuin adjektiiveja. Ne kuvaavat esinett\u00e4 tai jotain, mit\u00e4 esine voi sis\u00e4lt\u00e4\u00e4.<\/li>\n<li>Menetelm\u00e4t tai funktiot ovat kuin verbej\u00e4. He kuvaavat, mit\u00e4 vastustaja voi tehd\u00e4.<\/li>\n<\/ul>\n<p>Nyt kun kyse on k\u00e4ytt\u00f6liittym\u00e4st\u00e4, mieti mit\u00e4 k\u00e4ytt\u00f6liittym\u00e4 tekee: Se kuvaa ilman toteutusta, mit\u00e4 objekti voi tehd\u00e4. Ja mit\u00e4 tulee abstraktiin luokkaan, se kuvaa, mik\u00e4 objekti on ajon aikana.<\/p>\n<p>Toisin sanoen hyv\u00e4 nyrkkis\u00e4\u00e4nt\u00f6 on, ett\u00e4 jos sinun on m\u00e4\u00e4ritett\u00e4v\u00e4 objektin k\u00e4ytt\u00e4ytymismallit, k\u00e4ytt\u00f6liittym\u00e4 on oikea tapa edet\u00e4. Jos sinun on kuvattava, mik\u00e4 objekti on, k\u00e4yt\u00e4 abstraktia luokkaa.<\/p>\n<p>Abstraktien luokkien osalta otan t\u00e4m\u00e4n my\u00f6s askeleen pidemm\u00e4lle ja sanoisin, ett\u00e4 se auttaa kuvaamaan perustietotasoa, joka kuvaa objektia tai mit\u00e4 se voi tallentaa perustoimintojen lis\u00e4ksi.<\/p>\n<h3>Onko sinulla esimerkki\u00e4?<\/h3>\n<p>Kuten useimpien n\u00e4iden viestien sis\u00e4ll\u00f6ss\u00e4, yrit\u00e4n antaa esimerkkej\u00e4, vaikka se ei ole erityisesti tehty koodilla. Ehk\u00e4 t\u00e4m\u00e4 selvent\u00e4\u00e4 asiaa tarkemmin:<\/p>\n<ul>\n<li><strong>Liit\u00e4nn\u00f6ill\u00e4 ei ole toteutusta.<\/strong> Ne takaavat vain sen, mit\u00e4 luokka tekee.<\/li>\n<li><strong>Abstrakteilla luokilla tulisi olla perustason toteutus<\/strong>. T\u00e4m\u00e4n pit\u00e4isi edustaa sit\u00e4, mit\u00e4 luokka voi sis\u00e4lt\u00e4\u00e4 ja tehd\u00e4, mutta se ei ole t\u00e4ydellinen. Ne vaativat hieman enemm\u00e4n toteutusta alaluokasta.<\/li>\n<\/ul>\n<p>Kun ty\u00f6skentelet oliopohjaisen koodin kanssa, toivon, ett\u00e4 t\u00e4m\u00e4 auttaa antamaan ohjeita siit\u00e4, milloin mit\u00e4kin k\u00e4ytt\u00e4\u00e4. Jos ei, \u00e4l\u00e4 ep\u00e4r\u00f6i j\u00e4tt\u00e4\u00e4 kommenttia (jollakin j\u00e4senell\u00e4 on lupa tehd\u00e4 :).<\/p>\n<p>Lis\u00e4ksi n\u00e4emme t\u00e4m\u00e4n k\u00e4yt\u00e4nn\u00f6ss\u00e4, kun p\u00e4\u00e4semme kirjoittamaan oliopohjaista koodia (etenkin WordPressille, mutta ei aina).<\/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>Abstraktien luokkien ja rajapintojen erojen ymm\u00e4rt\u00e4minen on t\u00e4rke\u00e4\u00e4 oliopohjaista koodia kirjoitettaessa.<\/p>\n","protected":false},"author":1,"featured_media":164774,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[719,895,843],"tags":[1166],"class_list":["post-230284","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kehittaejae","category-koodi","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=230284"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/230284\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=230284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=230284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=230284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}