<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aline Ebone</title>
    <description>The latest articles on DEV Community by Aline Ebone (@aebone).</description>
    <link>https://dev.to/aebone</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1020925%2F869572d5-8f1c-4119-9761-5738ba450e53.png</url>
      <title>DEV Community: Aline Ebone</title>
      <link>https://dev.to/aebone</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aebone"/>
    <language>en</language>
    <item>
      <title>React Basics</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Tue, 07 Feb 2023 03:51:29 +0000</pubDate>
      <link>https://dev.to/aebone/react-basics-35g</link>
      <guid>https://dev.to/aebone/react-basics-35g</guid>
      <description>&lt;p&gt;React is a Javascript library used to build interfaces.&lt;br&gt;
It was built on Facebook and it’s largely used by companies like Apple, Airbnb, Microsoft, Payal, etc.&lt;/p&gt;
&lt;h2&gt;
  
  
  React Developer Tools
&lt;/h2&gt;

&lt;p&gt;Before starting, it’s recommendable to install the React Developer Tools. It can be found &lt;a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=pt-BR" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;br&gt;
The extension is already enabled for regular web sites, but it’s important to make it available for &lt;code&gt;file&lt;/code&gt; URLs, in case you create an HTML page and simply open it in the browser. To do it, open the url &lt;code&gt;chrome://extensions/&lt;/code&gt; in the browser, find the React Developer Tools extension and click on &lt;em&gt;Details&lt;/em&gt;, and enable the item &lt;em&gt;Allow access to file URLs&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Creating elements
&lt;/h2&gt;

&lt;p&gt;To start using React, we can just create a simple HTML page and add the following scripts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/react@16.7.0/umd/react.development.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://unpkg.com/react-dom@16.7.0/umd/react-dom.development.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, before the end of the &lt;code&gt;body&lt;/code&gt; tag, open a &lt;code&gt;script&lt;/code&gt; and add the React code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ReactDOM.render&lt;/code&gt; will render the following code in the DOM. The first parameter is the &lt;code&gt;.createElement&lt;/code&gt; and the second is where we are going to load the content, in this case in the &lt;code&gt;&amp;lt;div id="root"&amp;gt;&lt;/code&gt;.&lt;br&gt;
The &lt;code&gt;.createElement&lt;/code&gt; function will create the React element, the first parameter is this element is the element we want to create, the second is any attribute we want to pass, like &lt;code&gt;style&lt;/code&gt;. The third one is the children.&lt;/p&gt;

&lt;p&gt;The final result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="na"&gt;DOCTYPE&lt;/span&gt; &lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;React&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/react@16.7.0/umd/react.development.js"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/react-dom@16.7.0/umd/react-dom.development.js"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"root"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
         ReactDOM.render(
          React.createElement("p", null, "Hello World"),
          document.getElementById("root")
        );
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also render multiple elements adding another &lt;code&gt;.createElement&lt;/code&gt; as children:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;li&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
          &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;list item&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach, of course, is not viable in a real-life project. We would have to nest a lot of &lt;code&gt;.createElemet&lt;/code&gt; to make a real page. That's where the &lt;code&gt;JSX&lt;/code&gt; enters.&lt;/p&gt;

&lt;p&gt;But to &lt;code&gt;JSX&lt;/code&gt; code run properly, we need to add another script: the &lt;em&gt;Babel&lt;/em&gt; library. &lt;em&gt;Babel&lt;/em&gt; makes the browser understand &lt;code&gt;JSX&lt;/code&gt;:&lt;br&gt;
&lt;code&gt;&amp;lt;script src="https://unpkg.com/@babel/standalone/babel.min.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; We also need to add &lt;code&gt;type="text/babel"&lt;/code&gt; in the script.&lt;/p&gt;

&lt;p&gt;Now we don’t need the &lt;code&gt;.createElement&lt;/code&gt; anymore. We can just add the &lt;code&gt;JSX&lt;/code&gt;/&lt;code&gt;html&lt;/code&gt; as the first parameter of the &lt;code&gt;.render&lt;/code&gt; method:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text/babel"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      ReactDOM.render(
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hi&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;,
        document.getElementById("root")
      );
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;JSX&lt;/code&gt; is similar, but it's not equal to &lt;code&gt;html&lt;/code&gt;. We can add Javascript code inside &lt;code&gt;JSX&lt;/code&gt; using curly braces (&lt;code&gt;{}&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text/babel"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      var city = "Lisbon"

      ReactDOM.render(
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hi &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;,
        document.getElementById("root")
      );
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To add a &lt;code&gt;css&lt;/code&gt; class in a tag, we add the &lt;code&gt;className&lt;/code&gt; attribute. Because &lt;code&gt;class&lt;/code&gt; is a reserved word in &lt;code&gt;javascript&lt;/code&gt;. Ie: &lt;code&gt;&amp;lt;p className="title"&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  React components
&lt;/h2&gt;

&lt;p&gt;A component is a piece of independent UI that can be reused in an application.&lt;br&gt;
Components can be created using functions or classes. An example function component is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, stranger!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that a &lt;code&gt;div&lt;/code&gt; is wrapping the &lt;code&gt;h1&lt;/code&gt;.&lt;br&gt;
It's required to wrap the content in a father element.&lt;/p&gt;

&lt;p&gt;Another important thing is that we can embrace the function component with &lt;em&gt;parenthesis&lt;/em&gt; &lt;code&gt;()&lt;/code&gt; or &lt;em&gt;curly braces&lt;/em&gt; &lt;code&gt;{}&lt;/code&gt;.&lt;br&gt;
But if we use &lt;em&gt;curly braces&lt;/em&gt;, we need to add the &lt;code&gt;return&lt;/code&gt; key. Ie:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, stranger!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;We add _ _in the code to call this component.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Also, React requires the component starts it name with an uppercase letter.&lt;/p&gt;

&lt;p&gt;To use properties along with components, we use the &lt;code&gt;props&lt;/code&gt; keyword. This allows us to create dynamic content.&lt;br&gt;
To pass a prop, we add in the component call the prop key and the value. Ie. &lt;code&gt;&amp;lt;Greeting name="Stranger"/&amp;gt;&lt;/code&gt;.&lt;br&gt;
To retrieve it, we have to add the &lt;code&gt;props&lt;/code&gt; key as the function parameter and to use it, add &lt;code&gt;props.key&lt;/code&gt; inside the &lt;code&gt;jsx&lt;/code&gt; using curly braces &lt;code&gt;{}&lt;/code&gt;. The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Greeting&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Stranger"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For brevity, we can replace the &lt;code&gt;props&lt;/code&gt; keyword with curly braces &lt;code&gt;{}&lt;/code&gt; and call directly the property key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;     &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To start to make it real, we can define a root component called &lt;code&gt;App&lt;/code&gt;, and play composing components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Greeting&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Stranger"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Greeting&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Aline"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Greeting&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Alien"&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Greeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Welcome, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;,&lt;/span&gt;
          &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A component class will work in the same way, but we don’t need to pass the &lt;code&gt;props&lt;/code&gt; parameter, the &lt;code&gt;props&lt;/code&gt; object is already there, the only thing we need to do is to call &lt;code&gt;this.props.key&lt;/code&gt;.&lt;br&gt;
We also need to extends &lt;code&gt;React.Component&lt;/code&gt;, use the &lt;code&gt;render()&lt;/code&gt; function to render the &lt;code&gt;jsx&lt;/code&gt;, and always use the &lt;code&gt;return&lt;/code&gt; key.&lt;br&gt;
To refactor the &lt;code&gt;Greeting&lt;/code&gt; component to be a class component we do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Greeting&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Welcome, &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;!&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  States
&lt;/h3&gt;

&lt;p&gt;State is an important part of React, it’s where the magic happens.&lt;br&gt;
The &lt;code&gt;state&lt;/code&gt; is an object containing data. Every time we change a &lt;code&gt;state&lt;/code&gt;, the page will reload and the content will update.&lt;/p&gt;

&lt;p&gt;To create it, we use the &lt;code&gt;state&lt;/code&gt; keyword: &lt;code&gt;state = {city: "Lisbon"}&lt;/code&gt;. To change it, we have to di it with the &lt;code&gt;setState&lt;/code&gt; function: &lt;code&gt;this.setState({city: "Lisbon"})&lt;/code&gt;. Finally, to call it, we use &lt;code&gt;this.state.city&lt;/code&gt;.&lt;br&gt;
We can use it this way only in class components.&lt;/p&gt;
&lt;h2&gt;
  
  
  Events and Enhanced Rendering
&lt;/h2&gt;

&lt;p&gt;Events are an important part of React development. One important event is the &lt;code&gt;onClick&lt;/code&gt;. Here's how to use it in a button element: &lt;code&gt;&amp;lt;button onClick={logIn}&amp;gt;Log in&amp;lt;/buton&amp;gt;&lt;/code&gt;, now the &lt;code&gt;logIn&lt;/code&gt; function we are passing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="nx"&gt;logIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;loggedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can also conditionally render components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loggedIn&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;OneComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; : &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;AnotherComponent&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To render an array, we can use the &lt;code&gt;map&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Stranger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Aline&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alien&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;name&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When rendering a map or any other type of list, we need to add a &lt;code&gt;key&lt;/code&gt;. To do it, we can pass the second parameter in the &lt;code&gt;map&lt;/code&gt; function, which is an index: &lt;code&gt;names.map((name, index) =&amp;gt;&amp;lt;p key={index}&amp;gt;name&amp;lt;/p&amp;gt;)&lt;/code&gt;.&lt;br&gt;
We can do it with an array of objects, if a &lt;code&gt;name&lt;/code&gt; object has an &lt;code&gt;id&lt;/code&gt;, we can call it in the &lt;code&gt;map&lt;/code&gt; using &lt;code&gt;name.id&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tooling
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://create-react-app.dev/" rel="noopener noreferrer"&gt;Create React App&lt;/a&gt; is a tool that will generate and set a React project for us. We have to install &lt;code&gt;npm&lt;/code&gt; and &lt;code&gt;node&lt;/code&gt; before using it. Then, we type &lt;code&gt;npx create-react-app name-of-my-app&lt;/code&gt; in the terminal.&lt;/p&gt;

&lt;p&gt;Inside the &lt;code&gt;package.json&lt;/code&gt; we can see all the dependencies that &lt;em&gt;Create React App&lt;/em&gt; installed for us, including &lt;code&gt;react&lt;/code&gt;, &lt;code&gt;react-dom&lt;/code&gt;, and &lt;code&gt;react-scripts&lt;/code&gt; (which includes babel and webpack).&lt;br&gt;
All the components live inside the &lt;code&gt;src&lt;/code&gt; folder.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt; will create a fast build to put on prod if we want to. To check in the browser, install the serve library &lt;code&gt;npm install serve&lt;/code&gt;, then &lt;code&gt;serve -s build&lt;/code&gt;, this will be the optimized production version.&lt;/p&gt;

</description>
      <category>devto</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>announcement</category>
    </item>
    <item>
      <title>Building a React ecosystem from scratch</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Tue, 07 Feb 2023 03:21:06 +0000</pubDate>
      <link>https://dev.to/aebone/building-a-react-ecosystem-from-scratch-1ha0</link>
      <guid>https://dev.to/aebone/building-a-react-ecosystem-from-scratch-1ha0</guid>
      <description>&lt;h2&gt;
  
  
  What do we need?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An entry point&lt;/li&gt;
&lt;li&gt;Support ES6 and JSX&lt;/li&gt;
&lt;li&gt;Building and serving with Webpack&lt;/li&gt;
&lt;li&gt;React-hot-loader&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  An entry point
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a folder to hold the project&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to this folder and run &lt;code&gt;npm init -y&lt;/code&gt; to initialize a new npm package&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;public&lt;/code&gt; folder to hold our static code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;src&lt;/code&gt; folder to hold our React code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an &lt;code&gt;index.html&lt;/code&gt; file inside the &lt;code&gt;public&lt;/code&gt; folder. This is what is sent to the client when a request to our website is made by the user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;div&lt;/code&gt; with &lt;code&gt;id="root"&lt;/code&gt; in the &lt;code&gt;index.html&lt;/code&gt;. This &lt;code&gt;div&lt;/code&gt; will receive the React content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a &lt;code&gt;script&lt;/code&gt; tag to load the React code: &lt;code&gt;&amp;lt;script src="../dist/bundle.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; (it doesn't exist yet)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Support ES6 and JSX
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install Babel compiler &lt;code&gt;npm i --save-dev @babel/core @babel/cli @babel/preset-env @babel/preset-react&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;.babelrc&lt;/code&gt; file in the root of the project to tell Babel which presets and plugins should be used to transpile the code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Insert a json object inside this file with &lt;em&gt;preset-env&lt;/em&gt; (transform ES6 in VanillaJS) and &lt;em&gt;preset-react&lt;/em&gt; (understands JSX): &lt;code&gt;{"presets": ["@babel/preset-env", "@babel/preset-react"]}&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Building and serving with Webpack
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install &lt;code&gt;react&lt;/code&gt; and &lt;code&gt;react-dom&lt;/code&gt; to be able to run a React project: &lt;code&gt;npm i react react-dom&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create the &lt;code&gt;index.js&lt;/code&gt; and &lt;code&gt;App.js&lt;/code&gt; files inside the &lt;code&gt;src&lt;/code&gt; folder to start coding the application&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;index.js:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react-dom&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;App.js&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Install &lt;code&gt;webpack&lt;/code&gt; to build and serve the project &lt;code&gt;npm i --save-dev webpack webpack-cli webpack-dev-server style-loader css-loader babel-loader&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a &lt;code&gt;webpack.config.js&lt;/code&gt; file in the root directory and add:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;path&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;webpack&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./src/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;development&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.(&lt;/span&gt;&lt;span class="sr"&gt;js|jsx&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;node_modules&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;babel-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;presets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@babel/env&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;css$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;use&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;style-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;css-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.jsx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dist/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/dist/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bundle.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;devServer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;contentBase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;__dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;public/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;publicPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:3000/dist/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;hotOnly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;HotModuleReplacementPlugin&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Run the server &lt;code&gt;npx webpack-dev-server --mode development&lt;/code&gt;. It will run in the port 3000.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To make it easier, add the following script in the &lt;code&gt;package.json&lt;/code&gt; file: &lt;code&gt;"dev": "npx webpack-dev-server --mode development"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  React-hot-loader
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Enable auto-reload installing react-hot-loader &lt;code&gt;npm i --save-dev react-hot-loader&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code&gt;import {hot} from "react-hot-loader"&lt;/code&gt; and &lt;code&gt;export default hot(module)(App)&lt;/code&gt; in the &lt;code&gt;App.js&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Project Link: &lt;a href="https://github.com/alinebone/react-ecosystem-from-scratch"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>beginners</category>
      <category>javascript</category>
      <category>webpack</category>
    </item>
    <item>
      <title>Kotlin Basics: Data Types</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Tue, 07 Feb 2023 02:57:06 +0000</pubDate>
      <link>https://dev.to/aebone/kotlin-basics-data-types-149</link>
      <guid>https://dev.to/aebone/kotlin-basics-data-types-149</guid>
      <description>&lt;h2&gt;
  
  
  Mutable and immutable variables
&lt;/h2&gt;

&lt;p&gt;Before proceeding, it’s important to know that Kotlin has two kinds of attributes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;var&lt;/code&gt; - it's mutable (variable)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;val&lt;/code&gt; - it's immutable (constant)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why is &lt;code&gt;val&lt;/code&gt; preferred?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Legible: as the value doesn’t change, the developer doesn’t need to look for that variable in other places. It’s easier to understand, less complex.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Testable: it’s easier to test because it minimizes state changing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thread-safe: it doesn’t allow to be changed in another thread&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, let’s move on :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Types
&lt;/h2&gt;

&lt;p&gt;When declaring variables, it’s not required to pass the type. Kotlin infers it from the value.&lt;br&gt;
All the data types are objects, some of the types like numbers, characters and booleans can be represented as primitive values at runtime. But to the user, they look like ordinary classes.&lt;/p&gt;

&lt;p&gt;More info on data types can be founded &lt;a href="https://kotlinlang.org/docs/reference/basic-types.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And the code for these notes can be founded on my &lt;a href="https://github.com/alinebone/KotlinBasics" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Numbers
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Integers
&lt;/h3&gt;

&lt;p&gt;If we don’t specify the number type Kotlin infers that it’s an &lt;code&gt;Int&lt;/code&gt;, unless the value exceeds the maximum allowed. In this case, it infers that it's a &lt;code&gt;Long&lt;/code&gt;.&lt;br&gt;
To explicitly create a &lt;code&gt;Long&lt;/code&gt; attribute, just add an 'L' at the end (ie.: &lt;code&gt;val longNumber = 1234L&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;It’s possible to use underscores to make numbers more readable: &lt;code&gt;val oneMillion = 1_000_000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here’s a table with the number types and their range:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h3&gt;
  
  
  Floating points
&lt;/h3&gt;

&lt;p&gt;We can use &lt;code&gt;Float&lt;/code&gt; and &lt;code&gt;Double&lt;/code&gt; types for floating types.&lt;br&gt;
In general, we use &lt;code&gt;Double&lt;/code&gt; because it's more precise.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Double&lt;/code&gt; is the default type for floating points, so Kotlin will infer that it is a &lt;code&gt;Double&lt;/code&gt; if we don't specify the type. To specify it, we just have to add an 'F' at the end of the number (IE.: var n: &lt;code&gt;Float&lt;/code&gt; = 77.9F).&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;Float&lt;/code&gt; can hold 6-7 decimal digits while &lt;code&gt;Double&lt;/code&gt; can hold 15-16 digits. So, if a &lt;code&gt;Float&lt;/code&gt; number has more than 7 digits, the number will be rounded. (ie.: 2.7182818284f will be 2.7182817).&lt;/p&gt;
&lt;h3&gt;
  
  
  Conversion
&lt;/h3&gt;

&lt;p&gt;To convert a number we can use the following functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toByte()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toShort()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toInt()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toLong()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toFloat()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toDouble()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toChar()&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Note: Kotlin does not convert numbers in function parameters. Therefore, a function with a Double parameter can be called only on Double values.&lt;/em&gt;  &lt;/p&gt;
&lt;h2&gt;
  
  
  Boolean
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;Boolean&lt;/code&gt; type can be only &lt;code&gt;true&lt;/code&gt; or &lt;code&gt;false&lt;/code&gt;. The operations are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disjunction — OR ( &lt;code&gt;||&lt;/code&gt; )
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Conjunction — AND ( &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; )
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Negation ( &lt;code&gt;!&lt;/code&gt; ) - denies the current result:
&lt;code&gt;true&lt;/code&gt; equals &lt;code&gt;!false&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Characters
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;Char&lt;/code&gt; cannot be treated directly as a number. As it happens in the &lt;code&gt;String&lt;/code&gt; type, special characters can be escaped using a backslash (&lt;code&gt;\&lt;/code&gt;).&lt;br&gt;
To create a &lt;code&gt;Char&lt;/code&gt;, you need to use single quotes (&lt;code&gt;'a'&lt;/code&gt;), if you use double quotes (&lt;code&gt;"a"&lt;/code&gt;) it will be a &lt;code&gt;String&lt;/code&gt;.&lt;br&gt;
The supported types are character, &lt;em&gt;ASCII&lt;/em&gt; (numerical representation of a character - the supported ones are &lt;code&gt;\t&lt;/code&gt;, &lt;code&gt;\b&lt;/code&gt;, &lt;code&gt;\n&lt;/code&gt;, &lt;code&gt;\r&lt;/code&gt;, &lt;code&gt;\'&lt;/code&gt;, &lt;code&gt;\"&lt;/code&gt;, &lt;code&gt;\\&lt;/code&gt; and &lt;code&gt;\$&lt;/code&gt;), and Unicode (provides unique code number for every character):&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h2&gt;
  
  
  Strings
&lt;/h2&gt;

&lt;p&gt;Strings represent words or any other group of characters.&lt;br&gt;
We can use templates (&lt;code&gt;${}&lt;/code&gt; or just &lt;code&gt;$&lt;/code&gt;) to interpolate variables and strings. Ie: &lt;code&gt;val greeting = "Welcome $userName"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The backslash (&lt;code&gt;\&lt;/code&gt;) skips special characters as it is in the &lt;code&gt;Char&lt;/code&gt; type. If you want to display a dollar sign, it's necessary to use it as &lt;code&gt;\$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Some string methods:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.length&lt;/code&gt;: show the size of the string&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.subSequence(1, 3)&lt;/code&gt;: show the characters between specific index positions&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A raw string is delimited by a triple quote (&lt;code&gt;"""&lt;/code&gt;) and can contain new lines and any other special characters, without escaping:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;rawString&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""
        | I can have special characters $&amp;amp;%#
        | New lines


        | And so on...
    """&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kotlin’s strings are immutable. It never changes the memory allocated to a &lt;code&gt;String&lt;/code&gt;, it always creates a new one. To begin it's fine to use &lt;code&gt;String&lt;/code&gt; only. But if you have to make a lot of changes in a string, consider looking into the &lt;code&gt;StringBuilder&lt;/code&gt; class.&lt;/p&gt;

</description>
      <category>devto</category>
      <category>announcement</category>
      <category>offers</category>
    </item>
    <item>
      <title>[Clean Code] Comentários</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Sun, 05 Feb 2023 03:37:39 +0000</pubDate>
      <link>https://dev.to/aebone/clean-code-comentarios-1548</link>
      <guid>https://dev.to/aebone/clean-code-comentarios-1548</guid>
      <description>&lt;h2&gt;
  
  
  [Clean Code] Comentários
&lt;/h2&gt;

&lt;p&gt;Notas de estudo do livro &lt;em&gt;Clean Code&lt;/em&gt; de Robert C. Martin.&lt;br&gt;
&lt;em&gt;Capítulo 4 — Comentários&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Neste capítulo, Uncle Bob fala como usar comentários da forma correta.&lt;/p&gt;

&lt;p&gt;Comentários são um mal necessário, se nossas linguagens de programação fossem expressivas o suficiente ou se tivéssemos o dom de nos expressarmos corretamente com ela, não precisaríamos de comentários.&lt;br&gt;
Quando se encontrar em uma situação que sentir a necessidade de criar um comentário, avalie se não tem como se expressar através do código em si.&lt;br&gt;
Comentários podem gerar uma grande confusão, já que códigos mudam e evoluem. São movidos de um lado para o outro, se bifurcam, se reproduzem, se unem novamente… e os comentários nem sempre acompanham essas mudanças.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comentários compensam um código ruim
&lt;/h2&gt;

&lt;p&gt;Não gaste tempo criando comentários para explicar o código, gaste tempo melhorando o código.&lt;br&gt;
Explique-se no código.&lt;br&gt;
Em muitos casos, explicar-se no código é apenas nomear a função com o que você escreveria no comentário.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;/p&gt;

&lt;p&gt;// verifica se o funcionário tem direito a todos os benefícios if ((employee.flags &amp;amp;&amp;amp; HOURLY_FLAG) &amp;amp;&amp;amp; (employee.age &amp;gt; 65))&lt;/p&gt;

&lt;p&gt;Pode ser substitído por:&lt;/p&gt;

&lt;p&gt;if (employee.isEligleForFullBenefits())&lt;/p&gt;

&lt;h2&gt;
  
  
  Comentários bons
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comentários legais
&lt;/h3&gt;

&lt;p&gt;Por questões legais as vezes precisamos adicionar comentários. Por exemplo, quando adicionamos informações sobre direitos autorais e autoria no início de um arquivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comentários informativos
&lt;/h3&gt;

&lt;p&gt;Um exemplo de comentário informativo é explicar o que um código Regex faz, já que é bem difícil de entendê-lo dependendo da sua complexidade.&lt;br&gt;
Mas ainda assim o ideal seria criar uma classe com o propósito deste código, que pode ser por exemplo, converter formatos de datas e horas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerta sobre consequências
&lt;/h2&gt;

&lt;p&gt;As vezes é útil alertar outros programadores sobre certas consequências como tempo de execução, ou avisar que alguma thread não é segura.&lt;/p&gt;

&lt;h3&gt;
  
  
  Comentários TODO
&lt;/h3&gt;

&lt;p&gt;Comentários TODOS devem ser evitados, mas se for necessário deixar um código incompleto, ou que deve ser melhorado posteriormente por algum motivo muito especial (evite ao máximo deixar para depois!), comentários TODO são cabíveis.&lt;/p&gt;

&lt;h3&gt;
  
  
  Javadocs e APIS públicas
&lt;/h3&gt;

&lt;p&gt;Se estiver escrevendo uma API pública, uma boa documentação deve ser feita, mas apenas se for uma API pública! Não faça isso para qualquer projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comentários ruins
&lt;/h2&gt;

&lt;p&gt;A maioria dos comentários são ruins! Aqui vão alguns exemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Murmúrios, comentários que são esquecidos e deixados para trás.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comentários redundantes, que explicam o que o código já está explicando.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comentários enganadores, que dizem que um método retorna algo, mas esse algo só é retornado se uma condição ser verdadeira. Portando o programador pode chamar esse método esperando um retorno que pode nunca chegar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comentários longos que parecem diários, é muito difícil manter esse comentário atualizado caso o código mude, sem falar que ele toma a atenção que deveria estar no código e pode confundir o programador.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comentários ruidosos que não trazem nenhuma informação nova ou relevante. Evite o comentário se é possível gerar uma função com um nome explicativo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comentários com marcadores de posição como // Header, // Ações, etc. Defina isso em tags id por exemplo, se for HTML, ou em nomes de classes, funções ou arquivos. Crie uma boa estrutura de projeto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comentários ao lado de chaves de fechamento, indicando que é o final de uma função. Se sentir a necessidade de adicionar esse comentário, é provavelmente porque a função está muito grande, tente diminuí-la.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crédito e autoria, a não ser que seja requisitado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Código comentado, isso gera acúmulo de lixo na codebase além de deixar outros programadores inseguros para excluí-lo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Houve um tempo em que era uma boa prática encher o código de comentários, mas hoje isso é vista como bagunça. Invista o seu tempo em criar um código legível.&lt;/p&gt;

</description>
      <category>codigolimpo</category>
      <category>refatoracao</category>
    </item>
    <item>
      <title>[Clean Code] Funções</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Sun, 05 Feb 2023 03:32:14 +0000</pubDate>
      <link>https://dev.to/aebone/clean-code-funcoes-586d</link>
      <guid>https://dev.to/aebone/clean-code-funcoes-586d</guid>
      <description>&lt;h2&gt;
  
  
  [Clean Code] Funções
&lt;/h2&gt;

&lt;p&gt;Notas de estudo do livro &lt;em&gt;Clean Code&lt;/em&gt; de Robert C. Martin.&lt;br&gt;
&lt;em&gt;Capítulo 3 — Funções&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Neste capítulo, Uncle Bob nos ensina como uma boa função deve ser estruturada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pequenas
&lt;/h2&gt;

&lt;p&gt;A primeira regra é que as funções (métodos) devem ser pequenas e fazer apenas uma coisa, nunca ultrapasse as 20 linhas. No cenário ideal, cada função tem 2, 3 ou 4 linhas e possui uma obviedade transparente. Cada uma conta uma história e leva você a próxima em uma ordem atraente. Blocos dentro de instruções if, else, etc. devem conter apenas uma linha, de preferencia uma chamada de função, pois essa função pode receber um nome descritivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Um nível de abstração por função
&lt;/h2&gt;

&lt;p&gt;O código deve ser lido de cima pra baixo como uma narrativa, cada função deve ser seguida por outra, no proximo nível de abstração. Ou seja, queremos ler o programa como se fosse uma serie de parágrafos, descrevendo o nível atual de abstração e fazendo referencia ao proximo nível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instruções switch
&lt;/h2&gt;

&lt;p&gt;Devemos evitar, pois é quase impossível criar uma instrução switch pequena. Se não pudermos evitar, vamos garantir que cada switch esta em uma classe de baixo nível e nunca é repetido, para garantir isso podemos usar polimorfismo.`&lt;/p&gt;

&lt;h2&gt;
  
  
  Use nomes descritivos
&lt;/h2&gt;

&lt;p&gt;Para usar nomes descritivos, é importante seguir a regra de ter métodos pequenos e que só ficam uma coisa, assim fica fácil nomear o método. Não tem problema se o nome for grande, um nome grande e descritivo é melhor que um comentário longo e descritivo. Seja consistente nos nomes, use os mesmos verbis, frases e substantivos nos nomes das funções, isso vai manter um padrão r vai facilitar a leitura e manutenção do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parâmetros de funções
&lt;/h2&gt;

&lt;p&gt;A quantidade ideal de parâmetros de uma função é 0, depois 1 e depois 2. Deve-se evitar um método com 3 parâmetros. Se tiver mais que 3, deve-se ter um motivo muito especial para usa-lo. É melhor instanciar um objeto do que passa-lo por parâmetro. Pois assim fica mais fácil de entender o que esta acontecendo. Os parâmetros são mais difíceis ainda do ponto de vista de testes, deve-se escrever muitos casos de teste para se certificar que todas as combinações dos parâmetros estão cobertas. Parâmetros booleanos devem ser evitados sempre, se a função possui um parâmetros booleano, significa que existem duas possibilitas, ou seja, ela está fazendo mais de uma coisa.&lt;/p&gt;

&lt;p&gt;Passar um objeto para reduzir o numero de paramentos é uma coisa boa. Se passamos muitas variáveis por parâmetros, temos que prestar atenção se não estamos passando parte de um conceito que mereça uma classe.&lt;/p&gt;

&lt;p&gt;A regra para a criação de bons nomes de funções e parâmetros é utilizar um verbo e um substantivo para os parâmetros, por exemplo writeField(name).&lt;/p&gt;

&lt;h2&gt;
  
  
  Evite efeitos colaterais
&lt;/h2&gt;

&lt;p&gt;Ou seja, evite funções que prometem fazer uma coisa mas acabam fazendo muito mais, como modificar variáveis da própria classe. Se uma função se chama checkPassword(), não faça ela iniciar uma sessão ou qualquer outra coisa após saber o resultado, apenas retorne o valor booleano.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separação comando-consulta
&lt;/h2&gt;

&lt;p&gt;As funções devem fazer ou responder algo, ou seja, ou ela altera o estado de um objeto (set) ou retorna a informação dele (get). Fazer os dois viola a regra de responsabilidade única de uma função.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prefira exceções a retorno de códigos de erro
&lt;/h2&gt;

&lt;p&gt;Utilize exceções e não logs para avisar de um erro e separe um bloco try/catch em sua própria função, isso mantem separado o processamento normal do código e o tratamento do erro. Uma função que trata erro, não deve fazer mais nada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evite repetição
&lt;/h2&gt;

&lt;p&gt;A duplicação pode ser a raiz de todo o mal no software. A duplicação amontoa e bagunça o código. Se existem trechos de código fazendo a mesma coisa, é um sinal que a estrutura do programa pode estar com problemas. Avalie como a orientação a objetos pode ser usada para resolver o problema.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Criar um software é como qualquer outro tipo de escrita. Ao escrever um artigo, você primeiro coloca seus pensamentos no papel e depois os organiza de modo que fiquem fáceis de ler. O primeiro rascunho pode ficar desastroso e desorganizado, então você, reestrutura e refina até que ele fique como voce deseja.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>codigolimpo</category>
      <category>refatoracao</category>
    </item>
    <item>
      <title>[Clean Code] Nomes significativos</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Sun, 05 Feb 2023 03:30:08 +0000</pubDate>
      <link>https://dev.to/aebone/clean-code-nomes-significativos-53md</link>
      <guid>https://dev.to/aebone/clean-code-nomes-significativos-53md</guid>
      <description>&lt;h2&gt;
  
  
  [Clean Code] Nomes significativos
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Notas de estudo do livro Clean Code de Robert C. Martin.&lt;br&gt;
Capítulo 2 — Nomes significativos&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Uma das coisas que mais fazemos quando programamos é nomear. Nomeamos classes, funções, variáveis, entre outra coisas. Já que fazemos muito isso, é importante que façamos bem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use nomes que revelem seu propósito
&lt;/h2&gt;

&lt;p&gt;Escolher bons nomes leva tempo, mas economiza mais. Portanto, cuide de seus nomes e troque-os quando encontrar melhores. O nome de uma variável, função ou classe deve lhe dizer porque existe, como faz e como é usado. Se um nome requer comentário, ele não revela seu propósito.&lt;/p&gt;

&lt;p&gt;Exemplos de nomes ruins: &lt;em&gt;a&lt;/em&gt;, &lt;em&gt;list&lt;/em&gt;, &lt;em&gt;n1&lt;/em&gt;, &lt;em&gt;getThem()&lt;/em&gt;.&lt;br&gt;
Exemplos de nomes bons: &lt;em&gt;age&lt;/em&gt;, &lt;em&gt;names&lt;/em&gt;, &lt;em&gt;month&lt;/em&gt;, &lt;em&gt;getAges()&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evite informações erradas
&lt;/h2&gt;

&lt;p&gt;Devemos evitar palavras cujos significados podem se desviar daqueles que desejamos. Por exemplo, nunca utilize a variável &lt;em&gt;accountList&lt;/em&gt; a menos que essa variável seja uma &lt;em&gt;List&lt;/em&gt; (palavra específica de muitas linguagens de programação) de verdade. Se não for o caso, utilize outros nomes como &lt;em&gt;accountGroup&lt;/em&gt; ou apenas &lt;em&gt;accounts&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faça distinções significativas
&lt;/h2&gt;

&lt;p&gt;Suponhamos que temos os métodos &lt;em&gt;getActiveAccount()&lt;/em&gt; e &lt;em&gt;getActiveAccountInfo()&lt;/em&gt;, como saber qual chamar? Também não há como distinguir &lt;em&gt;moneyAccount&lt;/em&gt; de &lt;em&gt;money&lt;/em&gt; ou &lt;em&gt;customerInfo&lt;/em&gt; de &lt;em&gt;customer&lt;/em&gt;. Faça distinções de uma forma que o leitor compreenda as diferenças. Se começamos a nomear as coisas de forma parecida, temos que reavaliar se o design do código está da forma que deveria ser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use nomes pronunciáveis
&lt;/h2&gt;

&lt;p&gt;Uma das coisas que fazemos como desenvolvedores, é discutir com outros o nosso código. Precisamos usar nomes pronunciáveis para fazer isso de uma forma melhor. Isso importa porque a programação dentro do ambiente de mercado, querendo ou não, é uma atividade social.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use nomes passíveis de busca
&lt;/h2&gt;

&lt;p&gt;Nomes que possuem apenas uma letra ou números são difíceis de buscar em um código longo. Uma busca pela variável &lt;em&gt;a&lt;/em&gt; por exemplo, em qualquer IDE, retornaria milhares de resultados dependendo do tamanho do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evite codificações e prefixos de variáveis membro
&lt;/h2&gt;

&lt;p&gt;Nomes codificados raramente são pronunciáveis, além de ser fácil escrevê-los incorretamente. Exemplos de nomes ruins: &lt;em&gt;m_dsc&lt;/em&gt;, &lt;em&gt;IShapeFactory&lt;/em&gt; e &lt;em&gt;phoneString&lt;/em&gt;.&lt;br&gt;
&lt;em&gt;IShapeFactory&lt;/em&gt; é um exemplo muito seguido hoje em dia para interfaces, mas não tem porque enfeitar o nome, o que interessa é que ela é uma &lt;em&gt;ShapeFactory&lt;/em&gt;, não precisa incluir o &lt;em&gt;I&lt;/em&gt;. Para a implementação, posso usar o nome &lt;em&gt;ShapeFactoryImp&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evite o mapeamento mental
&lt;/h2&gt;

&lt;p&gt;Certamente um contador de iterações pode ser chamado de &lt;em&gt;i&lt;/em&gt;, &lt;em&gt;j&lt;/em&gt; ou &lt;em&gt;k&lt;/em&gt;, pois isso já se tornou uma convenção, desde que seu escopo seja pequeno e não houver outros nomes que possam entrar em conflito. Mas no geral, um nome de uma letra só é uma escolha ruim. Dificilmente você vai lembrar que um &lt;em&gt;r&lt;/em&gt; minúsculo é uma versão da url sem o host, muito menos outro programador que está mantendo o seu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nomes de classes
&lt;/h2&gt;

&lt;p&gt;Classes e objetos devem ter nomes com substantivo, como &lt;em&gt;Customer&lt;/em&gt;, &lt;em&gt;Account&lt;/em&gt; e &lt;em&gt;AddressParser&lt;/em&gt;. Não use verbos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nomes de métodos
&lt;/h2&gt;

&lt;p&gt;Os nomes de métodos devem ter verbos como &lt;em&gt;save()&lt;/em&gt; e &lt;em&gt;deletePage()&lt;/em&gt;. Devem-se nomear métodos de acesso, alteração e autenticação segundo seus valores e adicionar os prefixos &lt;em&gt;get&lt;/em&gt;, &lt;em&gt;set&lt;/em&gt; e &lt;em&gt;is&lt;/em&gt; (padrão &lt;em&gt;javabean&lt;/em&gt;). Exemplo: &lt;em&gt;geUser()&lt;/em&gt;, &lt;em&gt;setUser()&lt;/em&gt; e &lt;em&gt;isAdmin()&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não dê uma de espertinho
&lt;/h2&gt;

&lt;p&gt;Se os nomes forem muito “espertinhos”, apenas pessoas com o mesmo senso de humor irão entender.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selecione uma palavra por conceito
&lt;/h2&gt;

&lt;p&gt;Escolha uma palavra por cada conceito abstrato e fique com ela. Por exemplo, é confuso ter &lt;em&gt;get&lt;/em&gt;, &lt;em&gt;fetch&lt;/em&gt; e &lt;em&gt;retrieve&lt;/em&gt; como métodos equivalentes de classes diferentes. Da mesma forma é confuso ter um &lt;em&gt;controller&lt;/em&gt;, um &lt;em&gt;manager&lt;/em&gt; e um &lt;em&gt;driver&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não faça trocadilhos
&lt;/h2&gt;

&lt;p&gt;Evite usar a mesma palavra para dois propósitos. Por exemplo, você pode ter várias classes com o método &lt;em&gt;add()&lt;/em&gt;, contanto que as listas de parâmetros e os valores retornados dos diversos métodos &lt;em&gt;add()&lt;/em&gt; sejam semanticamente equivalentes. Se não for o caso, use &lt;em&gt;append()&lt;/em&gt; ou &lt;em&gt;insert()&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use nomes a partir do domínio da solução
&lt;/h2&gt;

&lt;p&gt;São programadores que lerão o seu código. Portanto, está liberado usar nomes relativos da área. Nâo é prudente colocar um nome a partir do domínio do problema, pois o programador precisaria consultar o cliente todo o tempo para entender o significado de um nome. Por exemplo, o nome &lt;em&gt;AccountVisitor&lt;/em&gt; significa o bastante para um programador familiarizado com o padrão &lt;em&gt;visitor&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Use nomes de domínios do problema somente quando não houver uma solução &lt;em&gt;a la programador&lt;/em&gt;, pois pelo menos ele poderá consultar o cliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adicione um contexto significativo
&lt;/h2&gt;

&lt;p&gt;Há poucos nomes que são significativos por si só. Imagine as variáveis &lt;em&gt;street&lt;/em&gt;, &lt;em&gt;houseNumber&lt;/em&gt;, &lt;em&gt;city&lt;/em&gt; e &lt;em&gt;state&lt;/em&gt;. Vistas juntas, fica claro que se trata de um endereço. Mas com a variável &lt;em&gt;state&lt;/em&gt; sozinha, ficaria mais difícil de entender do que se trata, &lt;em&gt;state&lt;/em&gt; pode ser várias coisas. A solução ideal nesse caso, é ter um objeto &lt;em&gt;Address&lt;/em&gt;, mas se isso não for possível, pode-se abrir uma exceção e usar o prefixo &lt;em&gt;addr&lt;/em&gt;, ficando &lt;em&gt;addrState&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Não adicione contextos desnecessários
&lt;/h2&gt;

&lt;p&gt;Em uma aplicação chamada &lt;em&gt;Gas Station Deluxe&lt;/em&gt; (GSD), seria uma péssima ideia adicionar o prefixo GSD em todas as classes. Isso dificultaria a busca (se eu pesquisar &lt;em&gt;G&lt;/em&gt; por exemplo, apareceria uma lista enorme com todas as classes). Os nomes &lt;em&gt;accountAddress&lt;/em&gt; e &lt;em&gt;customerAddress&lt;/em&gt; são bons para instâncias de classes, mas péssimos para as classes mesmo, a classe deve ser apenas &lt;em&gt;Address&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Não tenha receio de renomear as coisas por temer a opinião de outros desenvolvedores. Desenvolvedores profissionais ficam agradecidos quando o código muda para melhor. De qualquer forma, na maioria das vezes, não memorizamos os nomes de métodos e classes. Use qualquer dica acima e note como o código ficará mais legível.&lt;/p&gt;

</description>
      <category>codigolimpo</category>
      <category>refatoracao</category>
    </item>
    <item>
      <title>Criar agenda de compromissos usando Rails 4 [outdated]</title>
      <dc:creator>Aline Ebone</dc:creator>
      <pubDate>Sun, 05 Feb 2023 03:25:54 +0000</pubDate>
      <link>https://dev.to/aebone/criar-agenda-de-compromissos-usando-rails-4-outdated-5h0p</link>
      <guid>https://dev.to/aebone/criar-agenda-de-compromissos-usando-rails-4-outdated-5h0p</guid>
      <description>&lt;h2&gt;
  
  
  Criar agenda de compromissos usando Rails 4 [outdated]
&lt;/h2&gt;

&lt;p&gt;Uma forma muito legal de agregar uma agenda de compromissos ou eventos no seu projeto é utilizando um calendário. No Ruby on Rails é muito simples fazer isso com a ajuda da gem &lt;em&gt;table_builder&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Crie um novo projeto e gere o modelo de compromisso:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ rails new AgendaDeCompromissos 
$ rails g scaffold Compromisso titulo:string texto:text date:date 
$ rake db:migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Adicione a gem &lt;em&gt;table_builder&lt;/em&gt; no arquivo &lt;em&gt;Gemfile&lt;/em&gt; para preparar a instalação:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem “watu_table_builder”, :require =&amp;gt; “table_builder” 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Depois, no terminal digite:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ bundle install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em &lt;em&gt;view/compromissos/index.html.erb&lt;/em&gt; crie a tela do calendário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= calendar_for(@compromissos) do |t| %&amp;gt;
      &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;DOM&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="no"&gt;SEG&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;TER&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;QUA&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;QUI&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;SEX&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;SAB&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt; 
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= t.day do |day, compromissos| %&amp;gt; 
        &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;day&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt; 
        &amp;lt;% compromissos.each do |compromisso| %&amp;gt;&lt;/span&gt; 
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= h(compromisso.titulo) %&amp;gt; 
        &amp;lt;% end %&amp;gt; 
      &amp;lt;% end %&amp;gt; 
    &amp;lt;% end %&amp;gt;

    &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;Novo&lt;/span&gt; &lt;span class="no"&gt;Compromisso&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_compromisso_path&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo css para definir o estilo do calendário, &lt;em&gt;assets/stylesheets/calendar.css&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;table&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;border-collapse&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;collapse&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;th&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="n"&gt;Lucida&lt;/span&gt; &lt;span class="n"&gt;Grande&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;arial&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;helvetica&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;th&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#DDD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#666&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;14.2857142857143%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;td&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#777&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;top&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nc"&gt;.notmonth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#CCC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nf"&gt;#month&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;padding-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;padding-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nf"&gt;#month&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nf"&gt;#month&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;text-decoration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#999&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nc"&gt;.today&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#D7F2FF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;list-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;#calendar&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;11px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
      &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa altura já temos o calendário com estilo criado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9JlDIhj6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2434/1%2ArKZ2A1zg147NPFDutr7iwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9JlDIhj6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2434/1%2ArKZ2A1zg147NPFDutr7iwg.png" alt="Calendário estilizado mas sem conteúdo" width="800" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora setamos o compromisso em &lt;em&gt;app/controllers/compromissos_controller.rb&lt;/em&gt; para receber a data presente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;index&lt;/span&gt; 
      &lt;span class="vi"&gt;@compromissos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Compromisso&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt; 
      &lt;span class="vi"&gt;@date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:month&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:month&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt; 
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para colocar o mês e o ano na tela e incluir os botões de editar e deletar, fazemos o seguinte em &lt;em&gt;app/views/projects/index.html.erb&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= calendar_for(@compromissos) do |t| %&amp;gt; 
      &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;head&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;DOM&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="no"&gt;SEG&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;TER&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;QUA&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;QUI&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;SEX&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;SAB&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt; 
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= t.day do |day, compromissos| %&amp;gt; 
        &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;day&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt; &amp;lt;% compromissos.each do |compromisso| %&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= link_to h(compromisso.titulo), compromisso %&amp;gt;
          &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;Editar&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edit_compromisso_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compromisso&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= link_to ‘Deletar’, compromisso, method: :delete, data: { confirm: ‘Tem certeza?’ } %&amp;gt; 
        &amp;lt;% end %&amp;gt; 
      &amp;lt;% end %&amp;gt; 
    &amp;lt;% end %&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione as setas para navegar pelos meses no calendário, &lt;em&gt;app/views/projects/index.html.erb&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= link_to 
      “&amp;lt;”, :month =&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beginning_of_month&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%=h @date.strftime(“%B %Y”) 
    %&amp;gt; 
    &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;link_to&lt;/span&gt; 
      &lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:month&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end_of_month&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="no"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="sx"&gt;%&amp;gt;

    &amp;lt;%= calendar_for @compromissos, :year =&amp;gt;&lt;/span&gt; &lt;span class="vi"&gt;@date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:month&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="vi"&gt;@date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;month&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt; 
      &amp;lt;%= t.head(‘DOM’,’SEG’, ‘TER’, ‘QUA’, ‘QUI’, ‘SEX’, ‘SAB’) %&amp;gt;&lt;/span&gt; 
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= t.day do |day, compromissos| %&amp;gt; 
        &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;day&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt; 
        &amp;lt;% compromissos.each do |compromisso| %&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= link_to h(compromisso.titulo), compromisso %&amp;gt;
          &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;Editar&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edit_compromisso_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compromisso&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= link_to ‘Deletar’, compromisso, method: :delete, data: { confirm: ‘Tem certeza?’ } %&amp;gt; 
        &amp;lt;% end %&amp;gt; 
      &amp;lt;% end %&amp;gt; 
    &amp;lt;% end %&amp;gt;

    &amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="err"&gt;‘&lt;/span&gt;&lt;span class="no"&gt;Novo&lt;/span&gt; &lt;span class="no"&gt;Compromisso&lt;/span&gt;&lt;span class="err"&gt;’&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_compromisso_path&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt; 
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado final:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5-1EZ00x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2430/1%2AmIlna-elzEg4a0GvjC5flg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5-1EZ00x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2430/1%2AmIlna-elzEg4a0GvjC5flg.png" alt="Tela para adicionar compromissos" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zcNimEGe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2428/1%2A5VMdEVmS_sPDM5gOvsKdog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zcNimEGe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/2428/1%2A5VMdEVmS_sPDM5gOvsKdog.png" alt="Calendário estilizado e com o compromisso adicionado" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Código fonte: &lt;a href="https://github.com/alinebone/AgendaDeCompromissos"&gt;Github&lt;/a&gt;&lt;br&gt;
Demo: &lt;a href="http://tutorialagenda.herokuapp.com/compromissos"&gt;Heroku&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigada!&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>rails4</category>
    </item>
  </channel>
</rss>
