{"id":60,"date":"2021-10-08T16:19:47","date_gmt":"2021-10-08T16:19:47","guid":{"rendered":"http:\/\/www.jimiatl.com\/blog\/?p=60"},"modified":"2021-10-08T17:25:09","modified_gmt":"2021-10-08T17:25:09","slug":"the-ultimate-guide-to-understanding-classes-and-objects","status":"publish","type":"post","link":"https:\/\/www.jimiatl.com\/blog\/2021\/10\/08\/the-ultimate-guide-to-understanding-classes-and-objects\/","title":{"rendered":"The Ultimate Guide to Understanding Classes and Objects"},"content":{"rendered":"\r\n<p>Classes in object oriented programming are the heart of the programming paradigm. Without them, we could not mimic objects in the real world as we currently do in programming. By the time you are finished with this article, you should have a solid or much improved understanding of what classes are and how they work in the object oriented paradigm.<\/p>\r\n\r\n\r\n\r\n<p>Classes are software\u2019s way of imitating an object. Let\u2019s think about any object. It can either perform actions or be configured to your liking. So if we have a car as an object for example, it can be a certain color and have a certain horsepower, and it can perform actions like drive, brake, turn on windshield wipers and so forth.<\/p>\r\n\r\n\r\n\r\n<p>So using the car as the example, we\u2019d want to create a class (or blueprint for how the object is made). This is very similar to a blueprint for a building or highway intersection. We will also want to add attributes that are important to our object. Of course, you can go into great detail or keep it shallow depending on the needs of your program or your capabilities.<\/p>\r\n\r\n\r\n<p><script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6139628998219680\" crossorigin=\"anonymous\"><\/script><br>\r\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-6139628998219680\" data-ad-slot=\"8570050779\"><\/ins><br>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script><\/p>\r\n\r\n\r\n\r\n<p>So for our car, we\u2019ll keep it somewhat shallow and discuss the software principle containment. We\u2019ll have attributes such as color, make, model, horsepower. Actually, this could be much easier done by going to a car website and configuring a new car. All those things you can configure are practically the same as the attributes you\u2019d have in your car. Now the car can accelerate, maintain speed (cruise), decelerate, turn and so forth. So we\u2019ll want to have these as behaviors of the car. Note, you only want the behaviors that you will support or are important to your program. Just because you can put a behavior in your class, doesn\u2019t necessarily mean you should.<\/p>\r\n\r\n\r\n\r\n<p>Alright, now let\u2019s get to the nitty gritty. There are a few concepts that must be understood to truly get the benefits of OOP. First is how to create the object. This is done with the constructor. In the constructor, we put anything that initializes the state of object when it is created especially if we don\u2019t want to use setters and getters all the time. We also have the destructor, which is called right before the object is destroyed. If you understand callbacks, the constructor is like a callback for object creation and the destructor is like a callback but prior to destruction.<\/p>\r\n\r\n\r\n\r\n<p>Now let\u2019s switch gears and use guitars as that is the main photograph for this article and we get to do more architecting \ud83d\ude42 . So we look at the guitars and decide that we need a class so we can create Guitar objects. Our end goal is to have a person play the Guitar in software.<\/p>\r\n\r\n\r\n<p><script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6139628998219680\" crossorigin=\"anonymous\"><\/script><br>\r\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-6139628998219680\" data-ad-slot=\"8570050779\"><\/ins><br>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script><\/p>\r\n\r\n\r\n\r\n<p>Ok so first we look for possible attributes. What can we say about the guitar? It has a color, a number of strings, is it electric or not and any other differences an expert guitarist might observe. So we add these variables as attributes.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/\/pseudocode\r\nClass Guitar\r\n\r\n  int color;\r\n  int num_strings;  \/\/how many strings - for maintenance - int\r\n  bool is_electric; \/\/is it electric? Boolean<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Ok, so we\u2019ve got some attributes that will tell us about the guitar. Now we want to think about the behaviors or functionality of the guitar. To do this, we will create 2 other objects since on its own, I can\u2019t think of too many behaviors for the guitar. So we want to create a Person object. The person will play the guitar (which the guitar cannot do on its own traditionally anyways). So the person is not too important, they just need to be able to pick up a pick and strum the guitar. We will want the name of the person so we can display what Person object is playing the guitar.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Class Person\r\n\r\n  int age;     \/\/not needed, we don\u2019t care for this project\r\n  string name; \/\/who is playing the guitar<\/code><\/pre>\r\n\r\n\r\n\r\n<p>So for containment. The idea is the person will pick up the pick and guitar and play it. So the person needs to have a way to contain a pick object and a guitar object. We will also need a song (class) that will be played, otherwise, we&#8217;d have no clue how to play the guitar. Let\u2019s create those.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Class Person\r\n  .\r\n  .\r\n  .\r\n  Pick * picklist; \/\/holds the picks the user contains\r\n  Guitar * guitar; \/\/holds the current guitar\r\n  Song * song;     \/\/song guitarist will play .. could be a string also based on design<\/code><\/pre>\r\n\r\n\r\n\r\n<p>We might also make an electric guitar that has the characteristics of a normal guitar but is electric. I do not know enough about guitars to give exact information, but bear with me and we\u2019ll bring it all together.<\/p>\r\n\r\n\r\n<p><script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6139628998219680\" crossorigin=\"anonymous\"><\/script><br>\r\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-6139628998219680\" data-ad-slot=\"8570050779\"><\/ins><br>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script><\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Class ElectricGuitar extends Guitar {\r\n  \/\/inherits from Guitar\r\n  \/\/automatically has variables color, num_strings, is_electric\r\n  \/\/can add more specific attributes and functions for this class here\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>\/\/we can add things specific to guitar as additional attributes and functions<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Class Pick\r\n  int color; \/\/create a pick class and give it a color<\/code><\/pre>\r\n\r\n\r\n\r\n<p>So now we have most of the objects for a person playing a guitar. Note as in the real world, we have a class for each object (Object Oriented Programming OOP). We\u2019ll need to instantiate those classes and produce actual objects, but we have a blueprint for how we want to do that based on the classes we created for our software. So we know we want a person to play the guitar. So that will be an action or function in the Person class. We may also verify in that function that the guitar has been picked up already, or we may require that this person picks up a Guitar when they are created. We can do this in the constructor, but for now let&#8217;s add the function to our class.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Class Person\r\n  .\r\n  .\r\n  .\r\n  playGuitar()<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Since we are using OOP, we don\u2019t actually need to pass a guitar to the function, we can just check the one contained within the Person object, since we designed it that way. You could also require that the Guitar be passed to the function by adding a parameter for the guitar. For now, we will just use OOP and check if the person has a guitar. If we wanted to force a guitar to be picked up by each user (Software assumes the person has a guitar already), we\u2019d use the constructor.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>Class Person\r\n  .\r\n  .\r\n\r\n  construct(Guitar g, Pick p) {\r\n    this.guitar = g; \/\/assign the guitar given to function to our object\r\n    this.pick   = p; \/\/assign the pick passed to the function to our pick\r\n    this.song   = getRandomSong();\r\n  }\r\n\r\n  function playGuitar(){\r\n    if (guitar == NULL){\r\n      \/\/user does not have a guitar\r\n      \/\/force user to pick up a guitar from random list or exit function\r\n      this.guitar = getRandomGuitar();\r\n    }\r\n\r\n    if (pick == NULL){\r\n      \/\/same choices, usually getters and setters would set these variables after object creation\r\n      this.pick = getRandomPick();\r\n    }\r\n\r\n    \/\/now we know that the user has guitar and pick\r\n    \/\/let\u2019s play the guitar\r\n\r\n    guitar.play(this, song); \/\/pass this object to the play function of Guitar class\r\n  }\r\n\r\n\/\/Let\u2019s see how the play function in the Guitar class might look since that \r\n\/\/is doing the heavy lifting in the playGuitar function in the Person class\r\n\r\nClass Guitar{\r\n  function play(Person * p, Song * music){\r\n    \/\/play the guitar according to the song\r\n    \/\/move person p's fingers and the guitar's strings to music melody\r\n    \/\/to play, we need to move the strings and set the position so it looks like it is being played\r\n    \/\/insert those details here based on design choices, implementation, and so forth\r\n  }\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Alright, that should possibly be good enough at this time, we can always refine what is needed, which you will often do. At the moment this is like creating a rough draft. So let\u2019s write a main routine and start using this stuff to see how classes and objects work together to aid in your program.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>function main\r\n  Person you = new Person(); \/\/if constructor requires a guitar, you\u2019d need to create a guitar and pick and pass them to constructor\r\n  Person me  = new Person();\r\n  Pick apick = new Pick();\r\n\r\n  Guitar my_guitar  = new Guitar();\r\n  Guitar you_guitar = new ElectricGuitar(); \/\/Electric guitar is a type of guitar so it can be stored as a Guitar (for polymorphism sake)<\/code><\/pre>\r\n\r\n\r\n\r\n<p>So now we\u2019ve created a bunch of objects, hopefully now you\u2019ve seen the differences between objects and classes. In the above snippet, the classes are always the same and usually have Class to signify it is a class. The classes are on the left (variable type) and each object is to the right (object name for this type). So the class is like a blueprint, however, the objects, are actual creations or instances of the class. So if you have a blueprint, you\u2019d use the blueprint to create the real object. The classes we created above are Person, Pick and Guitar (Song is left as an exercise \ud83d\ude42 ). The objects however are <strong>you<\/strong> of type <i>Person<\/i>, <strong>me<\/strong> of type <i>Person<\/i>, <strong>apick<\/strong> of type <i>Pick<\/i>, <strong>my_guitar<\/strong> of type <i>Guitar<\/i>, <strong>you_guitar<\/strong> of type <i>ElectricGuitar<\/i>. We have 3 classes and 5 objects. We can create many more objects from our blueprints, but in this case we&#8217;ve only created 5 objects of 3 different types &#8211; ElectricGuitar is of type Guitar through inheritance.<\/p>\r\n\r\n\r\n<p><script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6139628998219680\" crossorigin=\"anonymous\"><\/script><br>\r\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-6139628998219680\" data-ad-slot=\"8570050779\"><\/ins><br>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script><\/p>\r\n\r\n\r\n<p>So we have a class that serves as the blueprint, but just as in the real world, two objects are independent of each other although they may have the same features or blueprint that they were created from. Such as two people. They are both people (of the Person class) but what happens to one person does not affect the other. You might say the constructor of a person in the real world is giving birth. This creates the person with certain hair color, DNA characteristics, physique and so on. But then we need to fast forward so the person can do things (as we can do in programming \ud83d\ude42 ) So in the main above, we have <i>you<\/i> Person and <i>me<\/i> Person. Any modifications we make to <i>you<\/i> will not affect <i>me<\/i> (unless globals and shared memory is used and it is designed that way). Same with the two Guitars, <i>my_guitar<\/i> is a completely different object than <i>you_guitar<\/i>, however, they are both of type Guitar (not exactly in this case, since more specifically one is of type ElectricGuitar which is of type Guitar). Ok, now that we have the objects we need, we want to have the person pick up a guitar and pick. So we will write something like<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>me.setGuitar(my_guitar);\r\nyou.setGuitar(you_guitar);\r\nme.setPick(aPick);   \/\/pick up the aPick that was a created object\r\nyou.setPick();       \/\/pick up a random pick\r\nme.setSong(\u2018My favorite country song\u2019);\r\nyou.setSong(\u2018My favorite rock song\u2019);<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Note these look just like setters and getters. Yet we did not think of setters and getters, we just wanted to have the person be able to obtain a guitar and pick. If you think about why different concepts in programming exist, it can deepen your understanding quite a bit. Just as in the real world, someone complains and the company takes steps to address the complaints, writers of programs also complain to which the program creator must also address.<\/p>\r\n\r\n\r\n\r\n<p>Ok, so now we have the guitar set, which for our program means the person has picked up the the guitar. For a little more practicality, let\u2019s assume a row of guitars is shown to a user and the user selects a guitar by touching it. After it is touched, we will get the guitar they touched and call a function very similar to setGuitar etc.<\/p>\r\n\r\n\r\n\r\n<p>Now we suggested that we want the person to play the guitar, which will then call play on the guitar objects. This is what is meant by implementation. Whatever method you choose to show a guitar playing is what you would drop into this function. Note you can easily switch out how it is played without affecting the rest of the program (abstraction). It\u2019s pretty cool if you have an understanding of this last concept especially if compared to functional programming.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>me.playGuitar(); \/\/will play my_guitar with person me\r\nyou.playGuitar(); \/\/will play electric guitar you_guitar with person you<\/code><\/pre>\r\n\r\n\r\n\r\n<p>&#8211;Revision made while writing this example &#8212; So after looking at the prior calls, I realized you\u2019d want to play a song. And Songs are different. They have different tunes and different lengths, so it would make sense to have a Song class and set the song prior to playing the guitar. This also belongs to the Person class since the person picks the song, although some guitars have songs that they can play internally (designed that way). To do that, you\u2019d just rearrange variables and what object owns what. This is the essence of design. There are in essence infinite ways to design a solution to a problem, so knowing the trade offs and such of each decision you make can be very beneficial to the end result.<\/p>\r\n\r\n\r\n<p><script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6139628998219680\" crossorigin=\"anonymous\"><\/script><br>\r\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-6139628998219680\" data-ad-slot=\"8570050779\"><\/ins><br>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script><\/p>\r\n\r\n\r\n<p>In the above example, we randomize a song in the constructor, however, we could also check if the song has been set when playGuitar is called and randomize if not like we did the other variables. Since we have separate objects all created from the same classes, we know that when me.playGuitar() is called, the person me will play a Guitar with the favorite country song. And when you.playGuitar() is called, the person will play an Electric Guitar with the favorite rock song. <strong>It is very important to understand the previous sentence so please take your time and possibly re-read above until the previous sentence makes sense to you.<\/strong> So to recap, we have 1 class from which we created 2 independent objects. Based on how those objects are configured, they will act\/play accordingly.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">Same concepts .. Real World Exercise<\/h3>\r\n\r\n\r\n\r\n<p>So one last thing to ensure we understand objects and classes. There are many additional tools in programming languages, but they really just stem from the real world and things us programmers need to make programming more secure and less error prone. So to ensure understanding, let\u2019s actually produce this post image in a program. First we want to create all these guitars. So we have to assume we have a class named Guitar. So our main function will look something like this.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>function main\r\n  \/\/create the guitars\r\n  Guitar guitar8323 = new Guitar();\r\n  Guitar guitar8326 = new Guitar();\r\n  Guitar guitar8353 = new Guitar();\r\n  Guitar guitar8366 = new ElectricGuitar();\r\n  Guitar guitar8392 = new Guitar();\r\n  Guitar guitar8357 = new Guitar();\r\n  Guitar guitar8391 = new ElectricGuitar();\r\n  Guitar guitar8367 = new ElectricGuitar();\r\n  Guitar guitar8301 = new Guitar();<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Now we\u2019ve created the guitars, we need some way of saying that we have these guitars and they are available. So seems like a list will make the most sense here, of course you can use an array and so on based on what is important to your program.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>list&lt;Guitar&gt; my_list;\r\n\r\nmy_list.add(guitar8323); \/\/add guitar to our list\r\nmy_list.add(guitar8326); \/\/add guitar to our list\r\nmy_list.add(guitar8353); \/\/add guitar to our list\r\nmy_list.add(guitar8366); \/\/add <strong>electric guitar<\/strong> to our list\r\nmy_list.add(guitar8392); \/\/add guitar to our list\r\nmy_list.add(guitar8357); \/\/add guitar to our list\r\nmy_list.add(guitar8391); \/\/add <strong>electric guitar<\/strong> to our list\r\nmy_list.add(guitar8367); \/\/add <strong>electric guitar<\/strong> to our list\r\nmy_list.add(guitar8301); \/\/add guitar to our list<\/code><\/pre>\r\n\r\n\r\n\r\n<p>Now we have all the guitars in a list, just like the picture. And just like the picture, we can sell these guitars, so we\u2019ll want to display our list first, then the user can make a choice, and when they buy it (pay us) we\u2019ll want to remove it from the list since it is no longer available, just as you would remove the guitar and hand it to the buyer. In both cases, the guitar is no longer available after being bought. So we\u2019ll only look at one function, and you can create others in similar fashion through polymorphism.<\/p>\r\n\r\n\r\n\r\n<p>Let\u2019s assume the guitar class has a function called display. So we\u2019ll want to call this function to display each object. So Electric guitar might display a little different or have some symbol on its display that signifies this is an electric guitar. Ok, let\u2019s look at how polymorphism helps us in this case.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>function showGuitars(list&lt;Guitar&gt; displayList)\r\n  \/\/need to traverse the list and display each one\r\n\r\n  foreach (guitar in displayList){\r\n    guitar-&gt;display(); \/\/display each guitar\r\n  }<\/code><\/pre>\r\n\r\n\r\n<p><script async=\"\" src=\"https:\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js?client=ca-pub-6139628998219680\" crossorigin=\"anonymous\"><\/script><br>\r\n<ins class=\"adsbygoogle\" style=\"display:block; text-align:center;\" data-ad-layout=\"in-article\" data-ad-format=\"fluid\" data-ad-client=\"ca-pub-6139628998219680\" data-ad-slot=\"8570050779\"><\/ins><br>\r\n<script>\r\n     (adsbygoogle = window.adsbygoogle || []).push({});\r\n<\/script><\/p>\r\n\r\n\r\n<p>So how does this work, well we know that an Electric Guitar is a type of guitar. So it may have more specific information that a normal guitar may not contain, but based on the fact it is inherited, it has to contain all the functions of the base class Guitar. Hence when we call Guitar-&gt;display .. polymorphism allows the program to choose the correct display function to call. For the guitars like guitar8323, it will call guitar-&gt;display, however for guitar8366, it will call electricguitar-&gt;display. All of this is done automatically through polymorphism. How cool!<\/p>\r\n\r\n\r\n\r\n<p>As a quick aside, this is why functions can take interfaces. Interfaces guarantee that certain functions are implemented. As long whatever object the function is called on supports that function, then it does not really matter what the object is, it only matters that the object can perform the task. For example, let\u2019s say there\u2019s a function fight. We can call human-&gt;fight, bird-&gt;fight, bear-&gt;fight, penguin-&gt;fight and so on. These are all different objects (some mammals and some not) with different hierarchical structures, yet they all support the fight function. So as long as they all implement the interface that requires fight be implemented, then the function can take anything that supports that interface and the right function can be called .. more cool.<\/p>\r\n\r\n\r\n\r\n<p>To finally recap on this ultimate guide, we\u2019ve went in depth on objects and their construction. A little bit on class hierarchy and brushed on the pillars of object oriented programming while discussing classes and objects. We took a nice photograph and in essence programmed the photograph for sale. We also touched on some of the other related subjects like interfaces. Hopefully you have a firm understanding of object oriented programming from this ultimate guide. Good luck!<\/p>\r\n","protected":false},"excerpt":{"rendered":"<p>Classes in object oriented programming are the heart of the programming paradigm. Without them, we could not mimic objects in the real world as we currently do in programming. By the time you are finished with this article, you should have a solid or much improved understanding of what classes are and how they work&hellip; <a class=\"more-link\" href=\"https:\/\/www.jimiatl.com\/blog\/2021\/10\/08\/the-ultimate-guide-to-understanding-classes-and-objects\/\">Continue reading <span class=\"screen-reader-text\">The Ultimate Guide to Understanding Classes and Objects<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":65,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,1],"tags":[2],"class_list":["post-60","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-architect","category-web-development","tag-technology","entry"],"_links":{"self":[{"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/comments?post=60"}],"version-history":[{"count":4,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions"}],"predecessor-version":[{"id":70,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions\/70"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/media\/65"}],"wp:attachment":[{"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/categories?post=60"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jimiatl.com\/blog\/wp-json\/wp\/v2\/tags?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}