{"id":1165,"date":"2010-11-09T09:00:47","date_gmt":"2010-11-09T16:00:47","guid":{"rendered":"https:\/\/simpleprogrammer.com\/?p=1165"},"modified":"2018-04-12T01:06:43","modified_gmt":"2018-04-12T05:06:43","slug":"back-to-basics-cohesion-and-coupling-part-2","status":"publish","type":"post","link":"https:\/\/simpleprogrammer.com\/back-to-basics-cohesion-and-coupling-part-2\/","title":{"rendered":"Back to Basics: Cohesion and Coupling Part 2"},"content":{"rendered":"<p>This post is a continuation of my post <a href=\"https:\/\/simpleprogrammer.com\/2010\/11\/04\/back-to-basics-cohesion-and-coupling-part-1\/\">on cohesion and coupling<\/a>, it is part of a series of <a href=\"https:\/\/simpleprogrammer.com\/2010\/10\/30\/getting-back-to-basics-introduction-and-why\/\">back to basics<\/a> posts examining and questioning some of the core principles and practices of software development.\\n\\nIn my last post I talked about what cohesion and coupling are and I talked about some of the benefits of each.\\n\\nNow I want to take a look at the actual application of cohesion and decoupling on software systems.\\n\\n<\/p>\n<h2>Granularity affects cohesion and coupling<\/h2>\n<p>\\n\\nHere is the key misunderstanding with cohesion and decoupling.\\n\\n<strong>Cohesion and decoupling are completely relative to the granularity of what is a module.<\/strong>\\n\\n<a href=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles.jpg\"><img loading=\"lazy\" decoding=\"async\" style=\"display: inline;\" title=\"MARBLES\" src=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg\" alt=\"MARBLES\" width=\"480\" height=\"340\" \/><\/a>\\n\\nFrom here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling.\\n\\nSee, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive.\\n\\nLet me give you an example.\u00a0 Let\u2019s take that linked list class we talked about above.\u00a0 If we define a module to be any class in our code, then it is pretty decoupled.\u00a0 But, if we define a module to be any class or primitive type in the system, suddenly our linked list implementation is going to be dependent on many other things.\u00a0 Now all the variables we declare in our class are dependencies on things like the Array and the String class or integer implementations.\\n\\nWhen we zoom deep down into the above level of what a module is we end up with many more dependencies which represent tighter coupling.\\n\\nWhat about cohesion?\u00a0 Consider if you will, <a href=\"http:\/\/wolfbyte-net.blogspot.com\/2007\/09\/if-something-is-worth-doing.html\">Enterprise FizzBuzz<\/a>.\u00a0 This is an implementation of the FizzBuzz problem:\\n\\n<\/p>\n<ul>\\n    <\/p>\n<li>Print the numbers from 1 to 100<\/li>\n<p>\\n    <\/p>\n<li>If the number is divisible by 3 print &#8220;Fizz&#8221; instead<\/li>\n<p>\\n    <\/p>\n<li>If the number is divisible by 5 print &#8220;Buzz&#8221; instead<\/li>\n<p>\\n    <\/p>\n<li>If the number is divisible 3 and 5 print &#8220;FizzBuzz&#8221; instead<\/li>\n<p>\\n<\/ul>\n<p>\\n\\nIt is an implementation of this simple problem using 3 assemblies and 16+ classes.\u00a0 If we consider a module to be a class, it is not very cohesive at all, since the responsibilities of what should be in a single method or two are spread out across 16.\u00a0 If we consider a module to be an assembly, it still isn\u2019t very cohesive.\\n\\nWe have to zoom all the way out to the module is a program level before this software becomes cohesive, but at that level it is very coupled to all the the various other frameworks that it depends on.\\n\\nThere are two important takeaways from this section:\\n\\n<\/p>\n<ol>\\n    <\/p>\n<li>How we define a module when looking at software affects cohesion and coupling.<\/li>\n<p>\\n    <\/p>\n<li>The granularity we use to build the software affects cohesion and coupling.\u00a0 (This one was hidden in the enterprise FizzBuzz example.\u00a0 In this case the author of the code defined a responsibility to be something very very small.)<\/li>\n<p>\\n<\/ol>\n<p>\\n\\nTo summarize, we can look at code from different levels of zooming in and out and determine its coupling and cohesiveness.\u00a0 We can also build software as different size \u201cLego blocks\u201d which has the same effect.\\n\\n<\/p>\n<h2>When cohesion and coupling are inversely related<\/h2>\n<p>\\n\\nWith that background, we can finally answer the question of whether or not it is possible to achieve high cohesion and loose coupling.\\n\\nThe answer is \u201cto a degree.\u201d\\n\\nIf we try to push too far into the loose coupling zone, we will find that we end up making our definition of a responsibility very very small at which point we lose the quality of cohesion.\\n\\nI\u2019m going to pick on <a href=\"https:\/\/simpleprogrammer.com\/2010\/11\/02\/back-to-basics-what-is-an-interface\/\">overuse of interfaces<\/a> again to give you an example.\\n\\nConsider what happens when we create an interface to \u201creduce coupling\u201d so that we can create unit tests.\u00a0 We end up decreasing cohesion because the class our class was referencing (one jump), now is an interface which is implemented by a class (two jumps.)\\n\\nNow consider what happens when we add a dependency injection module or even just a factory to get the implementation.\u00a0 Our once simple and highly cohesive implementation is spread out across an interface which is implemented by a class that we have to look up in a factory which contains some sort of a mapping file to map the interface to the implementation. (3-4 jumps.)\\n\\nI know this concept seems very strange, but let me see if I can explain it with a real world example.\\n\\nConsider again the highly cohesive baseball.\u00a0 It\u2019s already at the optimum coupling of 0.\u00a0 It doesn\u2019t depend on anything else.\u00a0 But, if we wanted to we could try to decouple it.\u00a0 How?\u00a0 We have to zoom in to a point where we could consider that the outer stitching is coupled to the casing which is coupled to the inner ball.\\n\\nWe could decouple that baseball by taking it apart and design some kind of interface which allows for different kinds of binding mechanisms for the outer shell and some kind of substrate to prevent the outer shell from directly touching the inner ball.\\n\\nIf we did that we\u2019d have pieces of the ball lying all over the place and it wouldn\u2019t be very cohesive or even functional.\\n\\nWe can do that exact thing with software.\u00a0 There is a point where we have achieved the maximum qualities of loose coupling and high cohesion, and we can try to push decoupling at the cost of cohesion.\\n\\n<\/p>\n<h2>Cohesion is more important<\/h2>\n<p>\\n\\nIt probably appears that I am saying that cohesion is more important than decoupling, and actually I am.\\n\\nWhy?\\n\\nIf you remember the advantages of tight cohesion and loose coupling, you might have realized that most of the advantages are the same except tight cohesion gives us the benefit of increased understanding.\\n\\nI tend to value understanding and simplicity in software above most other things, because they aid the most in maintenance and debugging.\\n\\nIt is very important that we consider cohesion when we seek to increase decoupling.\u00a0 It also can help give us a very clear measure of when we have maximized decoupling.\u00a0 <strong>At the point where any more decoupling will harm cohesion, we are done.<\/strong>\\n\\n<\/p>\n<h2>So is dependency injection bad?<\/h2>\n<p>\\n\\nNo, not at all.\u00a0 Dependency injection and other methods of decoupling have their places, but it is very important that we don\u2019t just blindly use them for every class in every situation.\\n\\nWe have to be conscious of what we are losing in cohesion and understandability when we consider using any kind of framework or pattern to decouple our software.\\n\\nI\u2019ll pick on one more thing here, since I think it is not very obvious.\u00a0 Consider how good a message bus can be for integrating different applications together.\u00a0 Messaging systems can decouple the different applications that need to communicate with each other making them highly cohesive and very loosely coupled.\\n\\nNow, consider how bad a message bus can be inside of an application.\u00a0 I know it is a fairly popular solution for decoupling events, commands, and other communication within an application, but many times the cost of the decoupling is a very high hit to cohesion and understandability.\\n\\nDon\u2019t get me wrong, sometimes an internal message bus is a good solution for an application, but in many cases it is going to hurt you more than help you.\\n\\n<\/p>\n<h2>It\u2019s all about right sized Lego blocks<\/h2>\n<p>\\n\\n<a href=\"http:\/\/www.hanselman.com\/blog\/\">Scott Hanselman<\/a> often likes to talk about \u201cright sized Lego blocks\u201d, and I agree with him 100%.\u00a0 Figuring out how to appropriately decouple your application while maintaining cohesion is all about figuring out what the ideal size of a module is.\\n\\nSometimes the answer might even be to split your application into multiple applications.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post is a continuation of my post on cohesion and coupling, it is part of a series of back to basics posts examining and questioning some of the core principles and practices of software development.\\n\\nIn my last post I talked about what cohesion and coupling are and I talked about some of the benefits&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2290,2185,148,45348],"tags":[],"class_list":["post-1165","post","type-post","status-publish","format-standard","hentry","category-architecture","category-best-practices","category-design","category-frameworks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Back to Basics: Cohesion and Coupling Part 2 - Simple Programmer<\/title>\n<meta name=\"description\" content=\"From here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling. See, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/simpleprogrammer.com\/products\/careerguide\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Back to Basics: Cohesion and Coupling Part 2 - Simple Programmer\" \/>\n<meta property=\"og:description\" content=\"From here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling. See, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/simpleprogrammer.com\/products\/careerguide\" \/>\n<meta property=\"og:site_name\" content=\"Simple Programmer\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-09T16:00:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-04-12T05:06:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg\" \/>\n<meta name=\"author\" content=\"John Sonmez\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"John Sonmez\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/back-to-basics-cohesion-and-coupling-part-2\\\/\"},\"author\":{\"name\":\"John Sonmez\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#\\\/schema\\\/person\\\/1abc70edfb189184827740310672de67\"},\"headline\":\"Back to Basics: Cohesion and Coupling Part 2\",\"datePublished\":\"2010-11-09T16:00:47+00:00\",\"dateModified\":\"2018-04-12T05:06:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/back-to-basics-cohesion-and-coupling-part-2\\\/\"},\"wordCount\":1337,\"commentCount\":6,\"image\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/marbles_thumb.jpg\",\"articleSection\":[\"Architecture\",\"Best Practices\",\"Design\",\"Frameworks\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/back-to-basics-cohesion-and-coupling-part-2\\\/\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide\",\"name\":\"Back to Basics: Cohesion and Coupling Part 2 - Simple Programmer\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/marbles_thumb.jpg\",\"datePublished\":\"2010-11-09T16:00:47+00:00\",\"dateModified\":\"2018-04-12T05:06:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#\\\/schema\\\/person\\\/1abc70edfb189184827740310672de67\"},\"description\":\"From here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling. See, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#primaryimage\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/marbles_thumb.jpg\",\"contentUrl\":\"https:\\\/\\\/simpleprogrammer.com\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/marbles_thumb.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/products\\\/careerguide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/simpleprogrammer.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Back to Basics: Cohesion and Coupling Part 2\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#website\",\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/\",\"name\":\"Simple Programmer\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/simpleprogrammer.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/simpleprogrammer.com\\\/#\\\/schema\\\/person\\\/1abc70edfb189184827740310672de67\",\"name\":\"John Sonmez\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/dc2f18dfa76e017566ce607de002d7abe4acfd5ec19a6db82c180b00867b8d94?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/dc2f18dfa76e017566ce607de002d7abe4acfd5ec19a6db82c180b00867b8d94?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/dc2f18dfa76e017566ce607de002d7abe4acfd5ec19a6db82c180b00867b8d94?s=96&d=mm&r=g\",\"caption\":\"John Sonmez\"},\"url\":\"https:\\\/\\\/simpleprogrammer.com\\\/author\\\/jsonmez\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Back to Basics: Cohesion and Coupling Part 2 - Simple Programmer","description":"From here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling. See, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/simpleprogrammer.com\/products\/careerguide","og_locale":"en_US","og_type":"article","og_title":"Back to Basics: Cohesion and Coupling Part 2 - Simple Programmer","og_description":"From here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling. See, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive...","og_url":"https:\/\/simpleprogrammer.com\/products\/careerguide","og_site_name":"Simple Programmer","article_published_time":"2010-11-09T16:00:47+00:00","article_modified_time":"2018-04-12T05:06:43+00:00","og_image":[{"url":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg","type":"","width":"","height":""}],"author":"John Sonmez","twitter_card":"summary_large_image","twitter_misc":{"Written by":"John Sonmez","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#article","isPartOf":{"@id":"https:\/\/simpleprogrammer.com\/back-to-basics-cohesion-and-coupling-part-2\/"},"author":{"name":"John Sonmez","@id":"https:\/\/simpleprogrammer.com\/#\/schema\/person\/1abc70edfb189184827740310672de67"},"headline":"Back to Basics: Cohesion and Coupling Part 2","datePublished":"2010-11-09T16:00:47+00:00","dateModified":"2018-04-12T05:06:43+00:00","mainEntityOfPage":{"@id":"https:\/\/simpleprogrammer.com\/back-to-basics-cohesion-and-coupling-part-2\/"},"wordCount":1337,"commentCount":6,"image":{"@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#primaryimage"},"thumbnailUrl":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg","articleSection":["Architecture","Best Practices","Design","Frameworks"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/simpleprogrammer.com\/products\/careerguide#respond"]}]},{"@type":"WebPage","@id":"https:\/\/simpleprogrammer.com\/back-to-basics-cohesion-and-coupling-part-2\/","url":"https:\/\/simpleprogrammer.com\/products\/careerguide","name":"Back to Basics: Cohesion and Coupling Part 2 - Simple Programmer","isPartOf":{"@id":"https:\/\/simpleprogrammer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#primaryimage"},"image":{"@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#primaryimage"},"thumbnailUrl":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg","datePublished":"2010-11-09T16:00:47+00:00","dateModified":"2018-04-12T05:06:43+00:00","author":{"@id":"https:\/\/simpleprogrammer.com\/#\/schema\/person\/1abc70edfb189184827740310672de67"},"description":"From here on out, I won\u2019t say class or software or system, I am going to say module when referring to cohesion and coupling. See, the problem is that we need to be able to define what a module is in order to determine if something is loosely coupled or highly cohesive...","breadcrumb":{"@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/simpleprogrammer.com\/products\/careerguide"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#primaryimage","url":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg","contentUrl":"https:\/\/simpleprogrammer.com\/wp-content\/uploads\/2010\/11\/marbles_thumb.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/simpleprogrammer.com\/products\/careerguide#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/simpleprogrammer.com\/"},{"@type":"ListItem","position":2,"name":"Back to Basics: Cohesion and Coupling Part 2"}]},{"@type":"WebSite","@id":"https:\/\/simpleprogrammer.com\/#website","url":"https:\/\/simpleprogrammer.com\/","name":"Simple Programmer","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/simpleprogrammer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/simpleprogrammer.com\/#\/schema\/person\/1abc70edfb189184827740310672de67","name":"John Sonmez","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/dc2f18dfa76e017566ce607de002d7abe4acfd5ec19a6db82c180b00867b8d94?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/dc2f18dfa76e017566ce607de002d7abe4acfd5ec19a6db82c180b00867b8d94?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dc2f18dfa76e017566ce607de002d7abe4acfd5ec19a6db82c180b00867b8d94?s=96&d=mm&r=g","caption":"John Sonmez"},"url":"https:\/\/simpleprogrammer.com\/author\/jsonmez\/"}]}},"_links":{"self":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/posts\/1165","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/comments?post=1165"}],"version-history":[{"count":0,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/posts\/1165\/revisions"}],"wp:attachment":[{"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/media?parent=1165"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/categories?post=1165"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/simpleprogrammer.com\/wp-json\/wp\/v2\/tags?post=1165"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}