{"id":229608,"date":"2022-11-20T18:06:00","date_gmt":"2022-11-20T15:06:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=229608"},"modified":"2022-11-20T18:12:45","modified_gmt":"2022-11-20T15:12:45","slug":"de-tvaa-foersta-pelarna-i-oop","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/de-tvaa-foersta-pelarna-i-oop\/","title":{"rendered":"De tv\u00e5 f\u00f6rsta pelarna i OOP"},"content":{"rendered":"\n<p>N\u00e4r det kommer till att prata om objektorienterad programmering (eller OOP), kommer du sannolikt att h\u00f6ra om The Three Pillars of Object-Oriented Programming eller The Four Pillars of Object-Oriented Programming.<\/p>\n<p>Beroende p\u00e5 din bakgrund kanske du redan har h\u00f6rt talas om dem, vet vad de \u00e4r och beh\u00f6ver egentligen inte f\u00f6rdjupa dig i det f\u00f6r mycket. Men om du inte har det, tror jag att f\u00f6rst\u00e5else f\u00f6r dem \u00e4r grundl\u00e4ggande f\u00f6r objektorienterad programmering.<\/p>\n<p>Vi har t\u00e4ckt hela <strong><a href=\"https:\/\/tommcfarlin.com\/tag\/oop-analysis\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">analysfasen<\/a><\/strong> av objektorienterad programmering:<\/p>\n<ol>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-analys-del-1\/\" title=\"Analys, del 1\">Analys, del 1<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-analys-del-2\/\" title=\"Analys, del 2\">Analys, del 2<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-foerstaa-kundernas-foervaentningar\/\" title=\"F\u00f6rst\u00e5 kundernas f\u00f6rv\u00e4ntningar\">F\u00f6rst\u00e5 kundernas f\u00f6rv\u00e4ntningar<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-statement-of-work\/\" title=\"Arbetsbeskrivning\">Arbetsbeskrivning<\/a><\/li>\n<li><a href=\"https:\/\/wordpress.mediadoma.com\/sv\/objektorienterad-programmering-i-wordpress-regler-och-villkor\/\" title=\"Villkor\">Villkor<\/a><\/li>\n<\/ol>\n<p>Med det sagt, l\u00e5t oss g\u00e5 in i design- och implementeringsdiskussioner. Det \u00e4r trots allt vad m\u00e5nga vill hoppa till \u00e4nd\u00e5, eller hur?<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165086-61e77571592ef.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-165086-61e77571592ef.jpg\" alt=\"De tv\u00e5 f\u00f6rsta pelarna i OOP\"><\/a><\/p>\n<p>Innan jag skriver n\u00e5gon kod skulle jag vilja g\u00f6ra tv\u00e5 inl\u00e4gg om de fyra punkterna i objektorienterad programmering (eftersom jag \u00e4r en av dem som prenumererar p\u00e5 tanken att det finns fyra).<\/p>\n<h2>Tv\u00e5 pelare av OOP<\/h2>\n<p>\u00c5terigen, att f\u00f6rst\u00e5 dessa \u00e4r nyckeln till att f\u00f6rst\u00e5 grunden f\u00f6r objektorienterad programmering. Utan dem kommer det att bli sv\u00e5rt att navigera i resten av det som ska diskuteras i framtida inl\u00e4gg.<\/p>\n<p>Med det, l\u00e5t oss prata om var och en av dem. Vi tar upp de tv\u00e5 f\u00f6rsta i det h\u00e4r inl\u00e4gget och de tv\u00e5 sista i n\u00e4sta inl\u00e4gg.<\/p>\n<h3>1 Abstraktion<\/h3>\n<p>Generellt sett \u00e4r detta nyckeln till att skriva objektorienterad kod. Med det menar jag allt som finns i en klass. Vi abstraherar id\u00e9n om n\u00e5got till en klass. I m\u00e5nga b\u00f6cker kommer vi att se saker som <strong>Djur<\/strong> eller <strong>Bilar<\/strong> representerade som klasser.<\/p>\n<p>Det h\u00e4r fungerar i teorin, men i praktiken programmerar vi inte djur och inte heller programmerar vi bilar (\u00e4ven om jag antar att vi vid denna tidpunkt i historien kan h\u00e4vda att vi \u00e4r det, men jag avviker f\u00f6r du vet vad jag menar).<\/p>\n<p>Ist\u00e4llet kommer vi att abstrahera id\u00e9er i deras klasser. Och det finns en nyckelid\u00e9 h\u00e4r:<\/p>\n<blockquote>\n<p>En klass ska representera ett substantiv.<\/p>\n<\/blockquote>\n<p>Det vill s\u00e4ga, du b\u00f6r inte ha en klass som representerar n\u00e5got som &quot;l\u00f6pning&quot;. Ist\u00e4llet kan du ha n\u00e5got som k\u00f6rs och d\u00e4rf\u00f6r skulle <strong>k\u00f6rningar<\/strong> vara en metod. Och det \u00e4r den allm\u00e4nna uppdelningen av hur abstraktion fungerar:<\/p>\n<ol>\n<li>Det som ska representeras \u00e4r klassen,<\/li>\n<li>Saken g\u00f6r \u00e4r dess metoder,<\/li>\n<li>Och s\u00e4ttet du beskriver saken kan vanligtvis g\u00f6ras via dess attribut eller egenskaper.<\/li>\n<\/ol>\n<p>Det betyder inte att vi inte har funktioner eller metoder som \u00e4ndrar dess egenskaper, men de tre punkterna ovan \u00e4r bra tumregler. S\u00e5 n\u00e4r du designar en klass kan du fr\u00e5ga saker som:<\/p>\n<ul>\n<li>Skriver jag n\u00e5got?<\/li>\n<li>Skriver jag n\u00e5got att g\u00f6ra?<\/li>\n<li>Eller skriver jag n\u00e5got som beskriver n\u00e5got?<\/li>\n<\/ul>\n<p>F\u00f6r om du skriver en handling, \u00e4r det troligtvis gjort av n\u00e5got (eftersom saker agerar \u2013 de g\u00f6r saker). Och om du beskriver n\u00e5got, s\u00e5 h\u00e4nvisar det troligen till n\u00e5got (n\u00e4r var sista g\u00e5ngen du inte beskrev n\u00e5got?)<\/p>\n<p>Vettigt?<\/p>\n<h3>2 Inkapsling<\/h3>\n<p>S\u00e5 om vi skriver klasser \u2013 bra klasser \u2013 m\u00e5ste vi skriva dem p\u00e5 ett s\u00e5dant s\u00e4tt att vi kapslar in deras data ordentligt. Och inkapsling \u00e4r egentligen bara ett &quot;stort&quot; ord som h\u00e4nvisar till id\u00e9n om att hantera sitt ansvar (eller h\u00e5lla reda p\u00e5 dess data).<\/p>\n<p>S\u00e5, till exempel, om vi skulle skriva en klass f\u00f6r att representera ett WordPress-inl\u00e4gg s\u00e5 skulle vi ha en klass som heter <strong>Post<\/strong> med egenskaper som <strong>publicera, uppdatera, ta bort,<\/strong> \u00a0<strong>postData, publishDate, lastUpdatedData<\/strong>, <strong>deletedDate<\/strong> och s\u00e5 vidare.<\/p>\n<p>D\u00e5 skulle vi ha funktioner som \u00e4r speciellt utformade f\u00f6r att vidta \u00e5tg\u00e4rder p\u00e5 en instans av klassen <strong>Post<\/strong>.<\/p>\n<p>Som exempel kan vi \u2026<\/p>\n<ul>\n<li>publicera,<\/li>\n<li>uppdatering,<\/li>\n<li>eller ta bort ett inl\u00e4gg<\/li>\n<\/ul>\n<p>Dessa metoder kommer sannolikt att exponeras p\u00e5 ett s\u00e5dant s\u00e4tt att andra klasser kan dra nytta av dem. Dessutom kommer dessa metoder sannolikt ocks\u00e5 att dra nytta av andra egenskaper som <strong>publishDate<\/strong> eller <strong>deletedDate<\/strong>.<\/p>\n<p>Och det \u00e4r h\u00e4r begreppet synlighet kommer in i bilden. I objektorienterad programmering h\u00e4nvisar inkapsling inte bara till id\u00e9n om informationen som en klass inneh\u00e5ller utan hur den exponerar data.<\/p>\n<p>Dessa g\u00f6rs p\u00e5 tre s\u00e4tt som alla definieras nedan:<\/p>\n<ol>\n<li><strong>offentliga<\/strong> egenskaper och funktioner \u00e4r tillg\u00e4ngliga f\u00f6r alla att anv\u00e4nda dem; <strong>offentliga\u00a0<\/strong> fastigheter \u00e4r dock vanligtvis inte exponerade. Ist\u00e4llet ser vi till att de kan modifieras med en <strong>offentlig<\/strong> metod.<\/li>\n<li><strong>skyddade<\/strong> egenskaper och funktioner \u00e4r tillg\u00e4ngliga f\u00f6r att anv\u00e4ndas av klassen och alla andra klasser som \u00e4rver information fr\u00e5n den. Detta kommer att diskuteras mer i detalj i n\u00e4sta inl\u00e4gg.<\/li>\n<li><strong>privata<\/strong> egenskaper och funktioner \u00e4r de som uteslutande \u00e4r avsedda att anv\u00e4ndas inom ramen f\u00f6r en given klass. Dessa kan vara egenskaper som anv\u00e4nds f\u00f6r att sp\u00e5ra interna statusar eller metoder som anv\u00e4nds f\u00f6r att fungera som hj\u00e4lpfunktioner f\u00f6r offentliga funktioner f\u00f6r att slutf\u00f6ra sitt arbete.<\/li>\n<\/ol>\n<p>N\u00e4r vi forts\u00e4tter genom den h\u00e4r serien kommer vi att se vilken roll var och en av dessa spelar n\u00e4r vi skriver tydliga, l\u00e4tta att f\u00f6lja, v\u00e4l utformade klasser.<\/p>\n<p>F\u00f6r nu \u00e4r det dock viktigt att f\u00f6rst\u00e5 att dessa ord, <strong>offentliga, skyddade<\/strong> och <strong>privata<\/strong>, kallas synlighetsmodifierare eftersom de, som du kan konstatera, hanterar synligheten f\u00f6r en metod eller en egenskap med avseende p\u00e5 dess klass och klasser som \u00e4rver fr\u00e5n det och som interagerar med det.<\/p>\n<p>P\u00e5 tal om arv, jag kommer att prata om det i n\u00e4sta del av den h\u00e4r serien.<\/p>\n<h2>Abstraktion, inkapsling och WordPress<\/h2>\n<h4>De d\u00e5liga nyheterna: Kurser i WordPress<\/h4>\n<p>S\u00e5 h\u00e4r \u00e4r det: I WordPress ser vi ofta v\u00e4ldigt, v\u00e4ldigt stora klasser. Det h\u00e4r \u00e4r inte bra. I sj\u00e4lva verket \u00e4r dessa <a href=\"https:\/\/en.wikipedia.org\/wiki\/Anti-pattern\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">antim\u00f6nster som<\/a> kallas gudaklasser (tanken \u00e4r att du har en enda klass som kan allt).<\/p>\n<p>Och n\u00e4r du har en gudaklass verkar det bekv\u00e4mt eftersom du kan sl\u00e4ppa all funktionalitet p\u00e5 ett st\u00e4lle. Men<\/p>\n<ul>\n<li>det \u00e4r sv\u00e5rt att testa,<\/li>\n<li>den skalar inte,<\/li>\n<li>det spelar inte bra med en annan klass (f\u00f6r att inte tala om klasser eller tredjepartsbibliotek),<\/li>\n<li>den anpassar sig inte bra till f\u00f6r\u00e4ndringar.<\/li>\n<\/ul>\n<p>I slut\u00e4ndan, n\u00e4r du g\u00f6r det, g\u00f6r du inte objektorienterad programmering. Du tar funktioner och kastar in dem i en klass. Och det vill vi komma ifr\u00e5n.<\/p>\n<h4>De goda nyheterna: Skrivkurser p\u00e5 WordPress<\/h4>\n<p>Detta v\u00e4cker dock en fr\u00e5ga: Varf\u00f6r f\u00f6rs\u00f6ka l\u00e4ra sig objektorienterad programmering med WordPress om det inte \u00e4r ett gediget exempel p\u00e5 objektorienterad programmering?<\/p>\n<p>Det beror p\u00e5 att du fortfarande kan skriva bra objektorienterad kod p\u00e5 WordPress. Det kan fortfarande interagera bra med WordPress, och det kan fortfarande spela bra med m\u00e5nga andra aspekter av WordPress.<\/p>\n<p>Jag vet att det l\u00e5ter kontraintuitivt, men n\u00e4r vi dyker djupare in i att skriva objektorienterad kod p\u00e5 WordPress borde detta bli tydligt.<\/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>Innan jag skriver n\u00e5gon kod skulle jag vilja g\u00f6ra tv\u00e5 inl\u00e4gg om de fyra pelarna i OOP. De tv\u00e5 f\u00f6rsta \u00e4r Abstraktion och Encapsulation.<\/p>\n","protected":false},"author":1,"featured_media":165087,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[838,848,724],"tags":[1173],"class_list":["post-229608","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-foer-nyboerjare","category-handledningar","category-utvecklaren","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229608","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=229608"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/229608\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/165087"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=229608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=229608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=229608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}