{"id":229657,"date":"2022-11-21T11:55:00","date_gmt":"2022-11-21T08:55:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229657"},"modified":"2022-11-21T17:07:54","modified_gmt":"2022-11-21T14:07:54","slug":"objektorienterad-programmering-foerstaa-graenssnitt","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-foerstaa-graenssnitt\/","title":{"rendered":"Objektorienterad programmering: F\u00f6rst\u00e5 gr\u00e4nssnitt"},"content":{"rendered":"\n<p>Vid det h\u00e4r laget skulle jag s\u00e4ga att grunden f\u00f6r att f\u00f6rst\u00e5 objektorienterad programmering har lagts.<\/p>\n<p>Specifikt har jag t\u00e4ckt:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"Abstraktion\">Abstraktion<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/\" title=\"Inkapsling\">Inkapsling<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/\" title=\"Arv\">Arv<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/de-andra-tvaa-pelarna-i-oop\/\" title=\"Polymorfism\">Polymorfism<\/a><\/li>\n<\/ol>\n<p>Och, ja, det finns en viss debatt om vad som utg\u00f6r grunden (det vill s\u00e4ga, vissa kastar inte in polymorfism i mixen \u00e4ven om jag g\u00f6r det). Men de fyra ovanst\u00e5ende borde ge en solid grund f\u00f6r att forts\u00e4tta bygga dina objektorienterade programmeringsf\u00e4rdigheter.<\/p>\n<p>Det finns fler, men jag tror inte att de \u00e4r lika djupa, detaljerade eller sv\u00e5ra att f\u00f6rst\u00e5 som n\u00e5gra av de tidigare n\u00e4mnda begreppen. \u00c5terigen, olika saker blir l\u00e4ttare f\u00f6r andra.<\/p>\n<p>I vilket fall som helst \u00e4r f\u00f6ljande tv\u00e5 \u00e4mnen som \u00e4r viktiga att f\u00f6rst\u00e5:<\/p>\n<ol>\n<li>Gr\u00e4nssnitt<\/li>\n<li>Abstraktion<\/li>\n<\/ol>\n<p>Jag kommer att prata om varje separat men se till att du har l\u00e4st <a href=\"https:\/\/tommcfarlin.com\/tag\/oop-fundamentals\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Fundamentals<\/a> -serien f\u00f6rst eftersom ovanst\u00e5ende tv\u00e5 \u00e4mnen g\u00f6r att du kan lita p\u00e5 dem och dra nytta av dem.<\/p>\n<p>Vague, jag vet, men l\u00e5t mig f\u00f6rklara och sedan g\u00e5 d\u00e4rifr\u00e5n.<\/p>\n<h2>F\u00f6rst\u00e5 gr\u00e4nssnitt<\/h2>\n<p>Den absolut vanligaste definitionen av ett gr\u00e4nssnitt som du sannolikt kommer att h\u00f6ra \u00e4r att det \u00e4r ett kontrakt. Detta \u00e4r inte fel, men jag tycker att det l\u00e4mnar mycket \u00f6vrigt att \u00f6nska.<\/p>\n<p>Till exempel, n\u00e4r du t\u00e4nker p\u00e5 kontrakt t\u00e4nker du f\u00f6rmodligen p\u00e5 n\u00e5got som \u00e4r v\u00e4ldigt involverat, mycket jargong, en komplicerad process att f\u00e5 n\u00e5got undertecknat, daterat, redo att arbeta och g\u00f6ra s\u00e5 vidare.<\/p>\n<p>Men n\u00e4r det kommer till programmeringsgr\u00e4nssnitt \u00e4r detta verkligen inte fallet. Faktum \u00e4r att jag skulle h\u00e4vda att definition av gr\u00e4nssnitt kan g\u00f6ra programmering enklare och det minskar mycket byr\u00e5krati eftersom det g\u00f6r saker v\u00e4ldigt svarta eller vita om vad n\u00e5got ska implementera.<\/p>\n<h3>Ett ord om &quot;gr\u00e4nssnitt&quot;<\/h3>\n<p>V\u00e5r bransch anv\u00e4nder ordet &quot;gr\u00e4nssnitt&quot; f\u00f6r tv\u00e5 saker:<\/p>\n<ul>\n<li>Designers och anv\u00e4ndare anv\u00e4nder termen gr\u00e4nssnitt f\u00f6r att beskriva vad de ser och hur de interagerar med applikationen. Detta inkluderar saker som knappar, rullgardinsmenyer och andra element som vi kan &quot;r\u00f6ra&quot;.<\/li>\n<li>Programmerare anv\u00e4nder termen f\u00f6r att referera till vilka funktioner en underklass m\u00e5ste implementera f\u00f6r att f\u00f6lja ett gr\u00e4nssnitt. Detta kallas &quot;programmering till ett gr\u00e4nssnitt&quot;.<\/li>\n<\/ul>\n<p>Det senare \u00e4r vad som kommer att diskuteras i den h\u00e4r artikeln. Och nej, vi kommer inte att anv\u00e4nda typiska exempel som programmering till ett <strong>djurgr\u00e4nssnitt<\/strong> eller vad som helst. Ist\u00e4llet kommer vi att titta p\u00e5 att g\u00f6ra det fr\u00e5n faktiska kodexempel.<\/p>\n<h3>Programmering till ett gr\u00e4nssnitt<\/h3>\n<p>Vi definierar &quot;programmering till ett gr\u00e4nssnitt&quot; som ett s\u00e4tt f\u00f6r oss att skriva kod som implementerar signaturerna f\u00f6r funktioner definierade i n\u00e4mnda gr\u00e4nssnitt.<\/p>\n<p>Men vad \u00e4r metodsignaturer? Enkelt uttryckt inkluderar metodsignaturer:<\/p>\n<ul>\n<li>namnet p\u00e5 namnet p\u00e5 funktionen,<\/li>\n<li>argumenten som kr\u00e4vs,<\/li>\n<li>synlighetsmodifieraren<\/li>\n<\/ul>\n<p>I samband med en klass kommer du att se det <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-00-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5 h\u00e4r:<\/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>L\u00e4tt, eller hur?<\/p>\n<p>I koden ovan kan vi se att <strong>set<\/strong> -funktionen accepterar en <strong>nyckel<\/strong> och ett <strong>v\u00e4rde<\/strong> som kommer att anv\u00e4ndas och funktionen \u00e4r tillg\u00e4nglig f\u00f6r alla objekt som har en referens till klassen.<\/p>\n<p>Men gr\u00e4nssnitt kan ocks\u00e5 inneh\u00e5lla detta. Det finns dock en varning: Gr\u00e4nssnitt har ingen metodimplementering.<\/p>\n<p>S\u00e5 hellre \u00e4n n\u00e5got <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-01-cache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">s\u00e5nt h\u00e4r:<\/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>Du kommer att <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">se detta:<\/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>Men det finns ocks\u00e5 ett par subtiliteter att notera i koden ovan.<\/p>\n<ul>\n<li>Den h\u00e4r koden definierar den inte som en klass. Ist\u00e4llet kallar det det ett <strong>gr\u00e4nssnitt<\/strong>.<\/li>\n<li>Klassnamnet har ett &#8217;i&#8217; prefix f\u00f6r att indikera att det \u00e4r ett gr\u00e4nssnitt. Detta kr\u00e4vs inte; det \u00e4r en konvention.<\/li>\n<li>Metoden har ingen implementering. Den har inget annat \u00e4n en signatur.<\/li>\n<\/ul>\n<p>N\u00e4r vi skapar ett gr\u00e4nssnitt s\u00e4ger vi, som n\u00e4mnts ovan, att vilken klass som \u00e4n implementerar gr\u00e4nssnittet kommer att definiera metoderna som det inkluderar.<\/p>\n<p>S\u00e5 om vi skulle knyta ihop allt som vi har sett ovan, skulle den slutliga implementeringen se <a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-03-simplecache-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ut s\u00e5 h\u00e4r<\/a> (\u00e4ven om vi helst skulle beh\u00e5lla detta i separata filer):<\/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>Och det \u00e4r s\u00e5 gr\u00e4nssnitt och klasser passar ihop.<\/p>\n<h2>Det \u00e4r allt?<\/h2>\n<p>Enkelt uttryckt, ja. Men enligt min erfarenhet har jag funnit att det \u00e4r mer \u00e4n att bara definiera metoderna och implementera dem.<\/p>\n<p>Ofta \u00e4r det l\u00e4tt att definiera klasser, sedan definiera gr\u00e4nssnittet och sedan implementera gr\u00e4nssnittet. Men det \u00e4r <strong>helt<\/strong> bakv\u00e4nt. Ist\u00e4llet m\u00e5ste vi t\u00e4nka mer strategiskt kring v\u00e5rt arbete.<\/p>\n<p>Ist\u00e4llet f\u00f6r att backa in i ett gr\u00e4nssnitt, som helt motverkar syftet, m\u00e5ste vi b\u00f6rja brett s\u00e5 att v\u00e5ra klasser kan specialisera sig p\u00e5 vad de g\u00f6r samtidigt som de implementerar funktionalitet som inte bara \u00e4r gemensam f\u00f6r den klassen utan andra klasser som kan beh\u00f6va samma funktionalitet.<\/p>\n<p>Med exemplet ovan kan vi ha en <strong>SimpleCache,<\/strong> en <strong>TransientCache<\/strong> eller n\u00e5gon annan typ av cache. Oavsett vilken typ av cache vi implementerar kommer de att implementera gr\u00e4nssnittet, och funktionaliteten kommer att \u00f6verl\u00e5tas till klassen som implementerar gr\u00e4nssnittet.<\/p>\n<p>S\u00e5 vi definierar hur en cache kan se ut p\u00e5 en h\u00f6g niv\u00e5, men de implementerande klasserna kommer att definiera exakt hur de fungerar.<\/p>\n<hr \/>\n<p>Om du \u00e4r en WordPress-utvecklare och vill l\u00e4ra dig hur du bygger saker ovanp\u00e5 applikationen med hj\u00e4lp av praktiska, objektorienterade tekniker, <a href=\"https:\/\/tommcfarlin.com\/registration-info\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">varf\u00f6r inte g\u00e5 med p\u00e5 webbplatsen?<\/a><\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En definition av ett programmeringsgr\u00e4nssnitt \u00e4r att det \u00e4r ett kontrakt. Jag tror att det l\u00e4mnar mycket \u00f6vrigt att \u00f6nska n\u00e4r man f\u00f6rst\u00e5r gr\u00e4nssnitt.<\/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":[848,901,724],"tags":[1173],"class_list":["post-229657","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229657","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=229657"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229657\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164880"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229657"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229657"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229657"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}