{"id":5592,"date":"2015-07-06T16:15:05","date_gmt":"2015-07-06T13:15:05","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=5592"},"modified":"2015-06-27T23:35:21","modified_gmt":"2015-06-27T20:35:21","slug":"clash-template-delegate-patterns","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/","title":{"rendered":"The Clash of Template and Delegate Patterns"},"content":{"rendered":"<p>Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of those problems, but the other is still a problem. The problem comes when using something akin to the template pattern.<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<\/p>\n<h2><b>The Problem<\/b><\/h2>\n<p>For example, if you have this class:<\/p>\n<pre class=\" brush:php\">class TemplateUser:\r\n    def intermediate_step(self):\r\n        ...\r\n\r\n    def multi_step_operation(self):\r\n        ...\r\n        self.intermediate_step()\r\n        ...<\/pre>\n<p>Then you try to create a delegating class like this:<\/p>\n<pre class=\" brush:php\">class TemplateUserDelegator:\r\n    def __init__(self, delegate):\r\n        self.delegate = delegate\r\n\r\n    def intermediate_step(self):\r\n        ...\r\n        self.delegate.intermediate_step()\r\n        ...\r\n\r\n    def multi_step_operation(self):\r\n        ...\r\n        self.delegate.multi_step_operation()\r\n        ...<\/pre>\n<p>Unfortunately, when you run the line:<\/p>\n<pre class=\" brush:php\">TemplateUserDelegator(TemplateUser()).multi_step_operation()<\/pre>\n<p><code>TemplateUserDelegator<\/code>\u2018s wrapper of <code>intermediate_step()<\/code> doesn\u2019t get called. Why is that? Because you\u2019re asking <code>delegate<\/code> to run <code>multi_step_operation()<\/code>, which doesn\u2019t have <code>TemplateUserDelegator<\/code>\u2018s version of <code>intermediate_step()<\/code> within.<\/p>\n<h2><b>Attempts At Solutions<\/b><\/h2>\n<p>We could explicitly call the delegator\u2019s <code>intermediate_step()<\/code> within its <code>multi_step_operation()<\/code>, but that would result in calling <code>delegate<\/code>\u2018s <code>intermediate_step()<\/code> twice; once within the wrapped version and once within <code>delegate<\/code>\u2018s <code>multi_step_operation()<\/code>. There are some few cases where that could work.<\/p>\n<p>What if <code>TemplateUserDelegator<\/code>\u2018s <code>intermediate_step()<\/code> only did its own work without delegating to <code>delegate<\/code>\u2018s? Again, sometimes, that might work, but not usually. Often, it\u2019s not quite the case of the pure template pattern, where the intermediate steps are \u201cprotected\u201d. There are many times where the \u201cintermediate step\u201d can also be called on its own as a full step.<\/p>\n<p>For example, for a collection, it could have an <code>add()<\/code> method that adds one item to the collection and an <code>add_all()<\/code> method that adds many items to the collection at once. Likely, the <code>add_all()<\/code> method makes a call to <code>add()<\/code> for each item it\u2019s attempting to add. If you were to extend that collection with delegation and that extension does a transformation action to the item being added. What do you do then? About the only solution then is to completely reimplement <code>add_all()<\/code> without delegating. That\u2019s not very DRY, though, so we could really use something different.<\/p>\n<h2><b>Solution<\/b><\/h2>\n<p>The solution is to switch from the template pattern to the strategy pattern.<\/p>\n<p>So we\u2019d rewrite <code>TemplateUser<\/code> like this instead.<\/p>\n<pre class=\" brush:php\">class TemplateUser:\r\n    def __init__(self, strategy):\r\n        self.strategy = strategy\r\n\r\n    def intermediate_step(self):\r\n        self.strategy.intermediate_step(self)\r\n\r\n    def multi_step_operation(self):\r\n        ...\r\n        self.intermediate_step()\r\n        ...<\/pre>\n<p>Technically, since this strategy type only requires one method, it should be a callable instead and just called via <code>self.strategy()<\/code>.<\/p>\n<p>Note that <code>self<\/code> is also passed into the strategy method. This is to give it access to <code>TemplateUser<\/code>\u2018s fields if need be. This should actually be avoided in most cases. Most decoration\/delegation is done only to the input parameters and return values. Giving access to fields increases coupling. It is simply shown for the sake of being an example possibility.<\/p>\n<p>What if you can\u2019t make changes to <code>TemplateUser<\/code>? What then? Well, then you\u2019ll actually have to use a little bit of inheritance to enable the use of composition.<\/p>\n<pre class=\" brush:php\">class DelegatableTemplateUser(TemplateUser):\r\n    def __init__(self, strategy):\r\n        super().__init__(self)\r\n        self.strategy = strategy\r\n\r\n    def intermediate_step(self):\r\n        self.strategy.intermediate_step(super().intermediate_step)\r\n\r\n    def multi_step_operation(self):\r\n        self.strategy.multi_step_operation(super().multi_step_operation)<\/pre>\n<p>You use the new subclass to delegate to the strategy objects you provide, which have all the steps methods with the same name and same set of parameters, except it also needs a parameter to accept the base method as well. This allows the strategy to call the delegated-to method when it needs to, or skip calling it, if it prefers (which is not a good idea, in most cases).<\/p>\n<p>It can also take in <code>self<\/code> if it needs to, which is not shown in this example. This has the same warnings as it did with the previous solution.<\/p>\n<p>Note: do not accidentally call <code>super()<\/code>\u2018s methods when passing them into the strategy calls.<\/p>\n<h2><b>Outro<\/b><\/h2>\n<p>So that\u2019s how you can design the \u201ctemplate pattern\u201d to be used by the delegation pattern. The second solution can be kind of a pain, but if it needs to be done, then it\u2019s worth it.<\/p>\n<p>To prevent some of the negative comments I\u2019m going to get: yes, I know inheritance is good and useful at times, but the experts say to prefer composition over inheritance, and from what I\u2019ve seen, I\u2019m highly inclined to do that. I\u2019m trying to help people get out of ruts where it looks like they CAN\u2019T do the composition they want.<\/p>\n<p>On another note, I won\u2019t be posting for a little while now. I\u2019m going to be working on writing up a (hopefully) comprehensive guide to python descriptors. Sadly, it won\u2019t be posted right away either. I\u2019m looking to have it be a paid publication. When it\u2019s available, I\u2019ll let you guys know.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/programmingideaswithjake.wordpress.com\/2015\/06\/20\/the-clash-of-template-and-delegate-patterns\/\">The Clash of Template and Delegate Patterns<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Jacob Zimmerman at the <a href=\"http:\/\/programmingideaswithjake.wordpress.com\/\">Programming Ideas With Jake<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of those problems, but the other is still a problem. The problem comes when using something akin to the template pattern. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; The Problem For example, if &hellip;<\/p>\n","protected":false},"author":51,"featured_media":1651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[],"class_list":["post-5592","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>The Clash of Template and Delegate Patterns - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Clash of Template and Delegate Patterns - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2015-07-06T13:15:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jacob Zimmerman\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/jacobz_20\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jacob Zimmerman\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\"},\"author\":{\"name\":\"Jacob Zimmerman\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39\"},\"headline\":\"The Clash of Template and Delegate Patterns\",\"datePublished\":\"2015-07-06T13:15:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\"},\"wordCount\":720,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\",\"name\":\"The Clash of Template and Delegate Patterns - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"datePublished\":\"2015-07-06T13:15:05+00:00\",\"description\":\"Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"The Clash of Template and Delegate Patterns\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39\",\"name\":\"Jacob Zimmerman\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g\",\"caption\":\"Jacob Zimmerman\"},\"description\":\"Jacob is a certified Java programmer (level 1) and Python enthusiast. He loves to solve large problems with programming and considers himself pretty good at design.\",\"sameAs\":[\"https:\/\/programmingideaswithjake.wordpress.com\/\",\"https:\/\/x.com\/https:\/\/twitter.com\/jacobz_20\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/jacob-zimmerman\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The Clash of Template and Delegate Patterns - Web Code Geeks - 2026","description":"Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of","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:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/","og_locale":"en_US","og_type":"article","og_title":"The Clash of Template and Delegate Patterns - Web Code Geeks - 2026","og_description":"Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of","og_url":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_published_time":"2015-07-06T13:15:05+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","type":"image\/jpeg"}],"author":"Jacob Zimmerman","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/jacobz_20","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Jacob Zimmerman","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/"},"author":{"name":"Jacob Zimmerman","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39"},"headline":"The Clash of Template and Delegate Patterns","datePublished":"2015-07-06T13:15:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/"},"wordCount":720,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/","url":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/","name":"The Clash of Template and Delegate Patterns - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","datePublished":"2015-07-06T13:15:05+00:00","description":"Back in my delegate decorator article, I mentioned some weaknesses of the delegate pattern as a substitute to inheritance. The decorator solved one of","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/python\/clash-template-delegate-patterns\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/www.webcodegeeks.com\/category\/python\/"},{"@type":"ListItem","position":3,"name":"The Clash of Template and Delegate Patterns"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/f54a53cfb8523f4ef6012aa63f075c39","name":"Jacob Zimmerman","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2dfdd9e2d35ed2224faf73968f8c597b5489fc345287e06e2571d3935a6bcc86?s=96&d=mm&r=g","caption":"Jacob Zimmerman"},"description":"Jacob is a certified Java programmer (level 1) and Python enthusiast. He loves to solve large problems with programming and considers himself pretty good at design.","sameAs":["https:\/\/programmingideaswithjake.wordpress.com\/","https:\/\/x.com\/https:\/\/twitter.com\/jacobz_20"],"url":"https:\/\/www.webcodegeeks.com\/author\/jacob-zimmerman\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/5592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/51"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=5592"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/5592\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=5592"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=5592"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=5592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}