{"id":229709,"date":"2022-11-22T15:13:00","date_gmt":"2022-11-22T12:13:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229709"},"modified":"2022-11-22T15:27:20","modified_gmt":"2022-11-22T12:27:20","slug":"abstrakta-klasser-del-2-abstrakta-klasser-och-graenssnitt","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-2-abstrakta-klasser-och-graenssnitt\/","title":{"rendered":"Abstrakta klasser, del 2 \u2013 Abstrakta klasser och gr\u00e4nssnitt"},"content":{"rendered":"\n<p>I <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-1-abstraherande-beteende\/\" title=\"f\u00f6rra inl\u00e4gget\">f\u00f6rra inl\u00e4gget<\/a><\/strong> i den h\u00e4r serien gick jag igenom:<\/p>\n<ul>\n<li>grunderna i abstrakta klasser,<\/li>\n<li>hur man implementerar dem,<\/li>\n<li>och gav exempel p\u00e5 arbetskoder.<\/li>\n<\/ul>\n<p>Och \u00e4ven om jag tror att f\u00f6rst\u00e5else av abstrakta klasser \u00e4r nyckeln till att l\u00e4gga en stark grund f\u00f6r objektorienterad programmering, ser jag ofta att det kan vara f\u00f6rvirrande n\u00e4r det g\u00e4ller att j\u00e4mf\u00f6ra dem med gr\u00e4nssnitt och att veta n\u00e4r de ska anv\u00e4ndas.<\/p>\n<h2>Abstrakta klasser och gr\u00e4nssnitt<\/h2>\n<p>S\u00e5 i det h\u00e4r inl\u00e4gget ska jag dela:<\/p>\n<ul>\n<li>en snabb uppdatering om vad gr\u00e4nssnitt \u00e4r,<\/li>\n<li>vad \u00e4r abstrakta klasser,<\/li>\n<li>och sedan hur man vet n\u00e4r man ska anv\u00e4nda den ena framf\u00f6r den andra.<\/li>\n<\/ul>\n<p>Det h\u00e4r borde inte vara en kodningsintensiv artikel, men det borde hj\u00e4lpa dig att veta n\u00e4r du ska skriva kod av en viss typ f\u00f6r att hj\u00e4lpa dig att b\u00e4ttre organisera dina projekt.<\/p>\n<h3>1 Gr\u00e4nssnitt<\/h3>\n<p>Kom ih\u00e5g att n\u00e4r det kommer till gr\u00e4nssnitt anv\u00e4nder vi ocks\u00e5 termen &quot;programmering till ett gr\u00e4nssnitt&quot; med tanken att gr\u00e4nssnittet definierar metoderna som en klass m\u00e5ste implementera f\u00f6r att uppfylla &quot;kontraktet&quot; med n\u00e4mnda gr\u00e4nssnitt.<\/p>\n<p><a href=\"https:\/\/gist.github.com\/tommcfarlin\/ff0bd4e2b7ceaebc957342dd41b7709e#file-02-cacheinterface-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Koden som<\/a> anv\u00e4ndes f\u00f6r att demonstrera ett grundl\u00e4ggande gr\u00e4nssnitt var:<\/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 kom ih\u00e5g att syftet med gr\u00e4nssnittet inte \u00e4r att definiera efter att koden har skrivits. Ist\u00e4llet \u00e4r det ett verktyg som anv\u00e4nds f\u00f6r att designa vad klasser ska implementera om de f\u00f6ljer ett visst paradigm eller om de kr\u00e4ver en viss upps\u00e4ttning funktioner.<\/p>\n<p>Det vill s\u00e4ga, om du ska designa en upps\u00e4ttning klasser som fungerar med cachning, skriver du inte klasserna f\u00f6rst. Du skriver gr\u00e4nssnittet f\u00f6rst, och sedan implementerar klasserna n\u00e4mnda gr\u00e4nssnitt.<\/p>\n<p>Tanken \u00e4r att alla klasser som implementerar gr\u00e4nssnittet kommer garanterat att ha dessa funktioner.<\/p>\n<h3>2 abstrakta klasser<\/h3>\n<p>Abstrakta klasser, \u00e5 andra sidan, l\u00e5ter oss g\u00f6ra <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/5b2936875807f041e98a87f8a5627e8b#file-00-taxonomy-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tv\u00e5 saker:<\/a><\/strong><\/p>\n<ol>\n<li>implementera funktionalitet som kan anv\u00e4ndas av underklasser,<\/li>\n<li>implementera metodsignaturer som underklasser m\u00e5ste implementera.<\/li>\n<\/ol>\n<p>Detta kan vara lite inkongruent till en b\u00f6rjan, men t\u00e4nk p\u00e5 detta:<\/p>\n<p>N\u00e4r du har en klass av en viss typ som kommer att ha konsekvent funktionalitet oavsett underklass, g\u00e5r funktionaliteten i den abstrakta klassen. N\u00e4r andra metoder beh\u00f6ver ha sin implementering av en metod, d\u00e5 tillhandah\u00e5ller du helt enkelt metodsignaturen och markerar den som <strong>abstrakt<\/strong>.<\/p>\n<p>H\u00e4r \u00e4r ett exempel fr\u00e5n ett <strong><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/abstrakta-klasser-del-1-abstraherande-beteende\/\" title=\"tidigare inl\u00e4gg:\">tidigare inl\u00e4gg:<\/a><\/strong><\/p>\n<p>Detta f\u00e5r oss alla att f\u00e5nga upp av de tidigare exemplen och de tidigare sakerna vi beh\u00f6ver fokusera p\u00e5 ang\u00e5ende gr\u00e4nssnitt och abstrakta klasser, men f\u00f6r vissa ger detta fortfarande inte mycket klarhet.<\/p>\n<p>Specifikt svarar detta fortfarande inte p\u00e5 fr\u00e5gan: Hur best\u00e4mmer vi n\u00e4r vi ska anv\u00e4nda en abstrakt klass och n\u00e4r vi ska anv\u00e4nda ett gr\u00e4nssnitt?<\/p>\n<p>P\u00e5 ytan kan det l\u00e5ta lite f\u00f6rvirrande, men det finns n\u00e5gra saker du kan anv\u00e4nda f\u00f6r att fatta beslutet.<\/p>\n<h2>N\u00e4r anv\u00e4nder vi var och en?<\/h2>\n<p>Kom ih\u00e5g att n\u00e4r det g\u00e4ller objektorienterad programmering kan vi dela upp det p\u00e5 tre olika s\u00e4tt:<\/p>\n<ul>\n<li>Klasser representerar en sak. Du kan betrakta dessa som ett substantiv.<\/li>\n<li>Attribut eller egenskaper \u00e4r som adjektiv. De beskriver f\u00f6rem\u00e5let eller n\u00e5got f\u00f6rem\u00e5let kan h\u00e5lla.<\/li>\n<li>Metoder eller funktioner \u00e4r som verb. De beskriver vad de inv\u00e4nder kan g\u00f6ra.<\/li>\n<\/ul>\n<p>N\u00e4r det kommer till ett gr\u00e4nssnitt, t\u00e4nk p\u00e5 vad gr\u00e4nssnittet g\u00f6r: Det beskriver, utan implementering, vad ett objekt kan g\u00f6ra. Och n\u00e4r det kommer till en abstrakt klass, beskriver den vad ett objekt \u00e4r under k\u00f6rning.<\/p>\n<p>Med andra ord, en bra tumregel \u00e4r att om du beh\u00f6ver tillhandah\u00e5lla en upps\u00e4ttning beteenden f\u00f6r ett objekt, \u00e4r ett gr\u00e4nssnitt en v\u00e4g att g\u00e5. Om du beh\u00f6ver beskriva vad ett objekt \u00e4r, anv\u00e4nd d\u00e5 en abstrakt klass.<\/p>\n<p>F\u00f6r abstrakta klasser skulle jag ocks\u00e5 ta detta ett steg l\u00e4ngre och s\u00e4ga att det hj\u00e4lper att beskriva en basniv\u00e5 av data som beskriver ett objekt eller vad det kan lagra f\u00f6rutom en basniv\u00e5 av funktionalitet.<\/p>\n<h3>Har du ett exempel?<\/h3>\n<p>Som med det mesta av inneh\u00e5llet i vart och ett av dessa inl\u00e4gg f\u00f6rs\u00f6ker jag ge exempel \u00e4ven om det inte \u00e4r specifikt gjort i kod. Detta kanske hj\u00e4lper till att f\u00f6rklara det \u00e4nnu mer:<\/p>\n<ul>\n<li><strong>Gr\u00e4nssnitt har ingen implementering.<\/strong> De garanterar bara vad en klass kommer att g\u00f6ra.<\/li>\n<li><strong>Abstrakta klasser b\u00f6r ha en basniv\u00e5 f\u00f6r implementering<\/strong>. Detta b\u00f6r representera vad en klass kan h\u00e5lla och g\u00f6ra men inte \u00e4r komplett. De kr\u00e4ver lite mer implementering fr\u00e5n underklassen.<\/li>\n<\/ul>\n<p>N\u00e4r du arbetar med objektorienterad kod hoppas jag att detta hj\u00e4lper till att ge n\u00e5gra riktlinjer f\u00f6r n\u00e4r du ska anv\u00e4nda vad. Om inte, tveka inte att l\u00e4mna en kommentar (n\u00e5got medlemmar har till\u00e5telse att g\u00f6ra :).<\/p>\n<p>Dessutom kommer vi att se detta i praktiken n\u00e4r vi kommer till att skriva objektorienterad kod (fr\u00e4mst f\u00f6r WordPress, men inte alltid).<\/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>Att f\u00f6rst\u00e5 skillnaden i abstrakta klasser och gr\u00e4nssnitt \u00e4r viktigt n\u00e4r man skriver objektorienterad kod.<\/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":[848,901,724],"tags":[1173],"class_list":["post-229709","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\/229709","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=229709"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229709\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/164774"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229709"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229709"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229709"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}