<?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>Forem: Artem</title>
    <description>The latest articles on Forem by Artem (@artem).</description>
    <link>https://forem.com/artem</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%2F153411%2Fa5307ada-ca41-4c88-b1b8-a459496775c9.jpg</url>
      <title>Forem: Artem</title>
      <link>https://forem.com/artem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/artem"/>
    <language>en</language>
    <item>
      <title>Finite-state machine example in JavaScript</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Tue, 02 Jul 2024 21:08:16 +0000</pubDate>
      <link>https://forem.com/artem/finite-state-machine-example-in-javascript-2npm</link>
      <guid>https://forem.com/artem/finite-state-machine-example-in-javascript-2npm</guid>
      <description>&lt;h2&gt;
  
  
  What is Finite-state machine?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Context
&lt;/h3&gt;

&lt;p&gt;FSM refers to classes of automata&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fa%2Fa2%2FAutomata_theory.svg%2F450px-Automata_theory.svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fa%2Fa2%2FAutomata_theory.svg%2F450px-Automata_theory.svg.png" alt="Classes of automata: wiki"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The finite state machine (FSM)&lt;/strong&gt; is a software design pattern where a given model transitions to other behavioral states through external input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example using if else
&lt;/h3&gt;

&lt;p&gt;Let's say we have a simple task where we check, for example, a traffic light and perform actions depending on the current state.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Go&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="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Slow down&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="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Stop&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid color&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="c1"&gt;// Function call examples&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Return: Go&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return: Slow down&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// Return: Stop&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Return: Invalid color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example with using Finite-state machine (FSM)
&lt;/h3&gt;

&lt;p&gt;Now let's implement the same functionality using a state machine. A state machine will be an object where each key (state) is associated with a specific action.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trafficLightFSM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;green&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Go&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;yellow&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Slow down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;red&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Stop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;invalid&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid color&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&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;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trafficLightFSM&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;trafficLightFSM&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Function call examples&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Return: Go&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return: Slow down&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// Return: Stop&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Return: Invalid color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, our traffic light will works well.&lt;/p&gt;

&lt;p&gt;Disclaimer:&lt;br&gt;
Several levels of additional tests would not hurt here, and perhaps another programming language ;) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1584649525122-8d6895492a5d%3Fq%3D80%26w%3D2070%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.0.3%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1584649525122-8d6895492a5d%3Fq%3D80%26w%3D2070%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.0.3%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" alt="Traffic light"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>patterns</category>
      <category>example</category>
    </item>
    <item>
      <title>Finite-state machine example in JavaScript</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Tue, 02 Jul 2024 21:08:16 +0000</pubDate>
      <link>https://forem.com/artem/finite-state-machine-example-in-javascript-2m98</link>
      <guid>https://forem.com/artem/finite-state-machine-example-in-javascript-2m98</guid>
      <description>&lt;h2&gt;
  
  
  What is Finite-state machine?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Context
&lt;/h3&gt;

&lt;p&gt;FSM refers to classes of automata&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fa%2Fa2%2FAutomata_theory.svg%2F450px-Automata_theory.svg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fa%2Fa2%2FAutomata_theory.svg%2F450px-Automata_theory.svg.png" alt="Classes of automata: wiki"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The finite state machine (FSM)&lt;/strong&gt; is a software design pattern where a given model transitions to other behavioral states through external input.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example using if else
&lt;/h3&gt;

&lt;p&gt;Let's say we have a simple task where we check, for example, a traffic light and perform actions depending on the current state.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Go&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="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Slow down&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="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Stop&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid color&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="c1"&gt;// Function call examples&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Return: Go&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return: Slow down&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// Return: Stop&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Return: Invalid color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Example with using Finite-state machine (FSM)
&lt;/h3&gt;

&lt;p&gt;Now let's implement the same functionality using a state machine. A state machine will be an object where each key (state) is associated with a specific action.&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;trafficLightFSM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;green&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Go&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;yellow&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Slow down&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;red&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Stop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;invalid&lt;/span&gt;&lt;span class="p"&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invalid color&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&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;action&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;trafficLightFSM&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;trafficLightFSM&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invalid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nf"&gt;action&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Function call examples&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;green&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Return: Go&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yellow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Return: Slow down&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;red&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;// Return: Stop&lt;/span&gt;
&lt;span class="nf"&gt;trafficLightActionFSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// Return: Invalid color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, our traffic light will works well.&lt;/p&gt;

&lt;p&gt;Disclaimer:&lt;br&gt;
Several levels of additional tests would not hurt here, and perhaps another programming language ;) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1584649525122-8d6895492a5d%3Fq%3D80%26w%3D2070%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.0.3%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimages.unsplash.com%2Fphoto-1584649525122-8d6895492a5d%3Fq%3D80%26w%3D2070%26auto%3Dformat%26fit%3Dcrop%26ixlib%3Drb-4.0.3%26ixid%3DM3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%253D%253D" alt="Traffic light"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>patterns</category>
      <category>example</category>
    </item>
    <item>
      <title>var, let, const in JavaScript - summary of differences between them</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Tue, 18 Jun 2024 21:49:26 +0000</pubDate>
      <link>https://forem.com/artem/var-let-const-in-javascript-summary-of-differences-between-them-m88</link>
      <guid>https://forem.com/artem/var-let-const-in-javascript-summary-of-differences-between-them-m88</guid>
      <description>&lt;p&gt;Summary of Differences.&lt;br&gt;
If you, like me, are tired of this interview question.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scope:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;var&lt;/strong&gt;: Function or global scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;let&lt;/strong&gt;: Block scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;const&lt;/strong&gt;: Block scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hoisting:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;var&lt;/strong&gt;: Hoisted and initialized with undefined.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;let&lt;/strong&gt;: Hoisted but not initialized (temporal dead zone).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;const&lt;/strong&gt;: Hoisted but not initialized (temporal dead zone).&lt;/p&gt;

&lt;h3&gt;
  
  
  Re-declaration:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;var&lt;/strong&gt;: Can be re-declared within the same scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;let&lt;/strong&gt;: Cannot be re-declared within the same scope.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;const&lt;/strong&gt;: Cannot be re-declared within the same scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Immutability:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;var&lt;/strong&gt; and &lt;strong&gt;let&lt;/strong&gt;: Mutable references.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;const&lt;/strong&gt;: Immutable reference (the reference cannot change, but the value can if it's an object).&lt;/p&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  var
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;varExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// undefined (due to hoisting)&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &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;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Same variable, function-scoped&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20 (same variable as above)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;varExample&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  let
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;letExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// console.log(y); // ReferenceError (temporal dead zone)&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &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;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Different variable, block-scoped&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 10 (original variable)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;letExample&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  const
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;constExample&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// console.log(z); // ReferenceError (temporal dead zone)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Different variable, block-scoped&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 20&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 10 (original variable)&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;obj&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;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Bob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Allowed (the object itself is mutable)&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&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="c1"&gt;// Bob&lt;/span&gt;

    &lt;span class="c1"&gt;// obj = { name: "Charlie" }; // TypeError (can't reassign const)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;constExample&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javascript</category>
    </item>
    <item>
      <title>Singleton Design Pattern, TypeScript example</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Wed, 12 Jun 2024 21:13:07 +0000</pubDate>
      <link>https://forem.com/artem/singleton-design-pattern-typescript-example-443e</link>
      <guid>https://forem.com/artem/singleton-design-pattern-typescript-example-443e</guid>
      <description>&lt;h2&gt;
  
  
  What is Singleton?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Context:&lt;/strong&gt; Singleton is one of the Creational design patterns&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2FD4D12AQEDnaWuhZwLOw%2Farticle-cover_image-shrink_720_1280%2F0%2F1711916687912%3Fe%3D2147483647%26v%3Dbeta%26t%3DN-wO_PZGF4_cYcTYOe0xB-R9a10WkZRXMDqnlpk1jrY" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia.licdn.com%2Fdms%2Fimage%2FD4D12AQEDnaWuhZwLOw%2Farticle-cover_image-shrink_720_1280%2F0%2F1711916687912%3Fe%3D2147483647%26v%3Dbeta%26t%3DN-wO_PZGF4_cYcTYOe0xB-R9a10WkZRXMDqnlpk1jrY" alt="Creational design patterns"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Singleton Pattern is a design pattern used in programming to ensure that a class has only one instance and provides a global point of access to that instance. This is useful when exactly one object is needed to coordinate actions across a system. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphpenthusiast.com%2Ftheme%2Fassets%2Fimages%2Fblog%2Fthe-singleton-pattern-explained.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fphpenthusiast.com%2Ftheme%2Fassets%2Fimages%2Fblog%2Fthe-singleton-pattern-explained.png" alt="Comparing singleton pattern and conventional implementation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pattern typically involves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private Constructor: Prevents direct instantiation of the class from outside.&lt;/li&gt;
&lt;li&gt;Static Instance: Holds the single instance of the class.&lt;/li&gt;
&lt;li&gt;Static Method: Provides a way to access the instance, creating it if it doesn't already exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures that no matter how many times you request the instance, you always get the same object.&lt;/p&gt;
&lt;h2&gt;
  
  
  Good Use Cases for the Singleton Pattern
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Configuration Settings:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Applications often need a single, centralized place to manage configuration settings. A singleton ensures that all parts of the application access the same configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Logging:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A logging system should be centralized so that all parts of an application write to the same log. Using a singleton ensures that there is only one instance of the logger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Database Connection:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Managing a single database connection instance ensures efficient use of resources and avoids the overhead of opening and closing connections repeatedly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Caching:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A cache should be globally accessible and consistent across the application. Using a singleton ensures there is a single cache instance.&lt;/p&gt;
&lt;h2&gt;
  
  
  Example of Singleton Pattern in TypeScript
&lt;/h2&gt;

&lt;p&gt;Here is the code to implement a simple singleton:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Singleton&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;constructor&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="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;Singleton&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Singleton&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="nx"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;doAction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;action&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is how to use this class:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;singleton1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInstance&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;singleton2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Singleton&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Outputs: true&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;singleton1&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;singleton2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Outputs: 'action'&lt;/span&gt;
&lt;span class="nx"&gt;singleton1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;doAction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Static getInstance Method:&lt;/strong&gt; This static method is the key to controlling the access to the Singleton instance. If the instance doesn't already exist, it creates one. If it does exist, it returns the existing instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Private Constructor:&lt;/strong&gt; The constructor is designed to throw an error if it is called directly after the instance is created. This ensures that the Singleton instance is created only through the getInstance method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instance Variable:&lt;/strong&gt; The static property Singleton.instance is used to store the singleton instance. This variable is checked and modified only within the getInstance method.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt; When Singleton.getInstance() is called, it either creates a new instance or returns the existing one. Attempting to directly instantiate the class using new Singleton() will throw an error, enforcing the Singleton pattern.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Criticism, or what are drawbacks of singleton pattern?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Global State.&lt;/strong&gt; They are generally used as a global instance, why is that so bad? Because you hide the dependencies of your application in your code, instead of exposing them through the interfaces. It's making the system less transparent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. They violate the single responsibility principle:&lt;/strong&gt; by virtue of the fact that they control their own creation and lifecycle. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Can lead to tighter coupling.&lt;/strong&gt; Singletons hide dependencies within the class itself, making the system less transparent. This can lead to tighter coupling between classes and reduce modularity. They inherently cause code to be tightly coupled. This makes faking them out under test rather difficult in many cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Hard testing.&lt;/strong&gt; Singletons can make unit testing more difficult. Since they control their instantiation, it can be hard to substitute them with mock objects or to reset their state between tests, leading to inter-test dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. In multi-threaded applications&lt;/strong&gt;, singletons can cause concurrency issues if not implemented correctly, as multiple threads might access and modify the singleton instance simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Inflexibility:&lt;/strong&gt; Once a singleton is implemented, changing its behavior or replacing it with a different implementation can be difficult. This inflexibility can hinder future development and adaptation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion:
&lt;/h3&gt;

&lt;p&gt;While the Singleton pattern can be useful in specific scenarios where a single instance is truly necessary, it should be used cautiously. Alternatives such as dependency injection can often provide more flexible and testable designs. When considering the Singleton pattern, weigh the pros and cons carefully to determine if it is the best fit for your specific use case.&lt;/p&gt;

&lt;p&gt;And here is a meme that perfectly explains my evolution while gather this article :D&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.redd.it%2Ffpi02bqw44pa1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.redd.it%2Ffpi02bqw44pa1.jpg" alt="Meme: singleton is bad or good"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://refactoring.guru/design-patterns/singleton" rel="noopener noreferrer"&gt;refactoring.guru | singleton&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Singleton_pattern" rel="noopener noreferrer"&gt;Wikipedia: Singleton Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/137975/what-are-drawbacks-or-disadvantages-of-singleton-pattern" rel="noopener noreferrer"&gt;What are drawbacks or disadvantages of singleton pattern?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.stackademic.com/creational-design-patterns-b4090683c577" rel="noopener noreferrer"&gt;Creational Design Patterns in Golang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>designpatterns</category>
      <category>typescript</category>
    </item>
    <item>
      <title>2 UX tips for self-typing text effect</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Thu, 18 Apr 2024 19:33:55 +0000</pubDate>
      <link>https://forem.com/artem/self-typing-text-effect-4i83</link>
      <guid>https://forem.com/artem/self-typing-text-effect-4i83</guid>
      <description>&lt;p&gt;Self-typing text effect in interfaces is mainstream, especially after AI bots are becoming more and more popular... |&lt;/p&gt;

&lt;p&gt;However, developers can ignore at least two problems that can degrade the user experience. &lt;/p&gt;

&lt;p&gt;I give these two tips when implementing this effect:&lt;/p&gt;

&lt;p&gt;✍️ 1) If it's fake real-time, add the ability to skip the effect. In 99% cases, a text which should be displayed is already loaded in users browsers before showing. Waiting while the effect will finish can be time-consuming and nerve-wracking. A text should be able to be available immediately, if possible.&lt;/p&gt;

&lt;p&gt;This can be done by clicking on the text area or on a special button. &lt;/p&gt;

&lt;p&gt;✍️ 2) Not correct auto-translation of such text. Check that a browser translator works correctly, and what code ends up pasted in the HTML? Even ChatGPT can throw an error if you translate the page into a language other than English while printing text.&lt;/p&gt;

&lt;p&gt;To solve this problem, you can replace the DOM node after all the text has been shown. Or better customize your tool and printing technique for each character and text.&lt;/p&gt;

&lt;p&gt;I solved these problems on my site. You can take a look (actual on April 2024). &lt;a href="https://artemshar.space"&gt;https://artemshar.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As for tools, I think there are many ready-made solutions, but I used the &lt;a href="https://www.npmjs.com/package/typewriter-effect"&gt;https://www.npmjs.com/package/typewriter-effect&lt;/a&gt;, which is good and deserves a star. &lt;/p&gt;

</description>
      <category>ux</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Music for focusing and coding - Part #1</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Wed, 25 Jan 2023 11:48:52 +0000</pubDate>
      <link>https://forem.com/artem/music-for-focusing-and-coding-part-1-4g1g</link>
      <guid>https://forem.com/artem/music-for-focusing-and-coding-part-1-4g1g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Generative FM&lt;/strong&gt;, my favorite music created by the algorithm, ambient textures and great minimalistic design. It's free.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://play.generative.fm/browse" rel="noopener noreferrer"&gt;https://play.generative.fm/browse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My ambient playlist&lt;/strong&gt; with 150+ tracks on Spotify&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://open.spotify.com/playlist/2kIoUajgPhfxOZfh3Yc5L4?si=2e61092d023c4cbe" rel="noopener noreferrer"&gt;https://open.spotify.com/playlist/2kIoUajgPhfxOZfh3Yc5L4?si=2e61092d023c4cbe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Too boring? Let's add more expressive and engineering inspiration! 🔩🔥 There are you'll find tons and tons my lovelyyyyy music: drum and bass, techstep, techno, breakbeat and experimental electronic:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOISIA (archive) radio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.noisia.nl/radio" rel="noopener noreferrer"&gt;https://www.noisia.nl/radio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VISION radio (fresh project!)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://www.visionrecordings.nl/radio" rel="noopener noreferrer"&gt;https://www.visionrecordings.nl/radio&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Need more dreams, inspiration in the spirit of travel and long roads, night cities? Please, enjoy with Shoegaze and Indie Rock&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKFM Shoegaze Radio&lt;/strong&gt; 🎸&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://decayfm.com/" rel="noopener noreferrer"&gt;https://decayfm.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, a special playlist that name "Saint-Petersburg atmosphere" ⚓. My personally associations from each track with my hometown, which I will miss for a long time and love from a distance.&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://open.spotify.com/playlist/6GK4ByhiZTykOEr1RtpUGj?si=61e7f2863bd947ae" rel="noopener noreferrer"&gt;https://open.spotify.com/playlist/6GK4ByhiZTykOEr1RtpUGj?si=61e7f2863bd947ae&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>What is the difference between SSR, ISR, SSS 👀</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Tue, 03 Jan 2023 19:54:54 +0000</pubDate>
      <link>https://forem.com/artem/what-is-the-difference-between-ssr-isr-sss-5d05</link>
      <guid>https://forem.com/artem/what-is-the-difference-between-ssr-isr-sss-5d05</guid>
      <description>&lt;p&gt;SSR (Server-Side Rendering), ISR (Incremental Server-Side Rendering), and server-side streaming are all techniques for rendering and serving content to a client in a web application. Here is a brief overview of the differences between these three approaches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSR (Server-Side Rendering):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSR involves rendering the content of a web page on the server and sending the fully rendered HTML to the client.&lt;/li&gt;
&lt;li&gt;This can improve the performance and SEO of a web application, as the client does not have to wait for the JavaScript to execute before the page is displayed.&lt;/li&gt;
&lt;li&gt;However, SSR requires more resources on the server, as the server has to do the rendering work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ISR (Incremental Server-Side Rendering):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ISR is a variant of SSR in which the server sends the initial HTML content to the client, and then the client renders the rest of the content using JavaScript.&lt;/li&gt;
&lt;li&gt;This can improve the performance and SEO of a web application, as the initial content is displayed faster and the server does not have to do as much rendering work.&lt;/li&gt;
&lt;li&gt;However, ISR requires the client to have JavaScript enabled, as the client is responsible for rendering the rest of the content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Server-Side Streaming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side streaming involves sending a stream of data from the server to the client in real-time, without waiting for the entire response to be generated.&lt;/li&gt;
&lt;li&gt;This can be used to implement real-time features such as live updates or chat applications.&lt;/li&gt;
&lt;li&gt;Server-side streaming requires the use of a special HTTP header, Transfer-Encoding: chunked, which tells the client to expect a stream of data rather than a single response.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>discuss</category>
      <category>tutorial</category>
      <category>python</category>
    </item>
    <item>
      <title>How I made SVG-logo for my site (spoiler: like a nerd, lol)</title>
      <dc:creator>Artem</dc:creator>
      <pubDate>Mon, 09 Mar 2020 01:06:32 +0000</pubDate>
      <link>https://forem.com/artem/how-i-made-my-svg-logo-4214</link>
      <guid>https://forem.com/artem/how-i-made-my-svg-logo-4214</guid>
      <description>&lt;h1&gt;
  
  
  Hello
&lt;/h1&gt;

&lt;p&gt;My name is Artem Shar (Sharyukov), I'm Web/Fron-End developer since 2016. In the end of 2019 I decided it was time to make a new personal website with a blog like as usual... The new site is not ready yet. But to make process more interesting and faster, I want to share my experience of logo creating, because this thing was really done. Now it looks like this and I like it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tg3kJFyp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ell5tfciubapzf6kuxzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tg3kJFyp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ell5tfciubapzf6kuxzc.png" alt="Alt Text" width="639" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This logo, made by using SVG and CSS without tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo-wrap"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;svg&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"logo-svg"&lt;/span&gt; &lt;span class="na"&gt;viewBox=&lt;/span&gt;&lt;span class="s"&gt;"0 0 200 200"&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"50px"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"50px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#313131"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/circle&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"75"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#ccc"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/circle&amp;gt;&lt;/span&gt;
     &lt;span class="nt"&gt;&amp;lt;circle&lt;/span&gt; &lt;span class="na"&gt;cx=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;cy=&lt;/span&gt;&lt;span class="s"&gt;"100"&lt;/span&gt; &lt;span class="na"&gt;r=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt; &lt;span class="na"&gt;fill=&lt;/span&gt;&lt;span class="s"&gt;"#fff"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/circle&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/svg&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.logo-wrap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--color-glow-1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#080808&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--color-glow-2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#D9FBFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="err"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.logo-wrap&lt;/span&gt;&lt;span class="nd"&gt;:after&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;...&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt; &lt;span class="m"&gt;30px&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-glow-1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt; &lt;span class="m"&gt;5px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-glow-2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.logo-wrap&lt;/span&gt;&lt;span class="nd"&gt;:before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;...&lt;/span&gt;
  &lt;span class="nl"&gt;box-shadow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt; &lt;span class="m"&gt;7px&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-glow-1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="m"&gt;7px&lt;/span&gt; &lt;span class="m"&gt;7px&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;--color-glow-2&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;That's simple and controlled, if I want to add some interactive behaviour or change colors or play with shadows, etc.&lt;/p&gt;

&lt;p&gt;Rewind the tape a bit back. Before this version, I have something similar, but without shadows. If remove CSS-code, it will looks like this. I lived with this logo for a while, putting them on avatars of some social networks. And I didn't want to delete it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j18PB2K3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/0cim1fh1g1pzyi2gj8m7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j18PB2K3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/0cim1fh1g1pzyi2gj8m7.png" alt="Alt Text" width="336" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's rewind the tape to the beginning, a 4 of months ago (october of 2019).&lt;/p&gt;

&lt;h2&gt;
  
  
  First steps
&lt;/h2&gt;

&lt;p&gt;The first thing I started with was a simple pen and paper. Because I didn't want to be limited to any digital tool. And I just experimented during about one week. The first thing that occurred to me was to play with the letters of my first and last name. Also, I was inspired by the &lt;a href="https://zeit.co/"&gt;Zeit company&lt;/a&gt;  design. Their style is clear, simple and strong. But I didn't want to create something too strong or sharp. Lot of times I tried to use the triangle - in the end I dropped it. I thought about something, that contain my character: nature, forever favorite things, maybe roots. It was sun, sea, because I grew up near &lt;a href="https://en.wikipedia.org/wiki/Gulf_of_Finland"&gt;Gulf of Finland&lt;/a&gt;, sunrises and sunsets and something modest, clear, dark. Also, I wrote to my friend asked for help me with ideas with letters A and S, and she threw something. That's what came out of it. Sorry for the poor quality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mqiMHiz9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9na5u5clpoj100f5go7d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mqiMHiz9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/9na5u5clpoj100f5go7d.jpg" alt="Alt Text" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Inkscape SVG + React App
&lt;/h2&gt;

&lt;p&gt;Next stage I've took &lt;a href="https://inkscape.org/ru/"&gt;Inkscape&lt;/a&gt; - the good free tool for creating vector-graphics. And I started trying to repeat something I'd drawn with a pen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TfvcOoG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/6grmx2wf83gj2izn30rq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TfvcOoG9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/6grmx2wf83gj2izn30rq.png" alt="Alt Text" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And they looked so bad... then I realized that I should try to use the tool's features. After all, the pen is also a somewhat limited tool. It wasn't easy, I started playing around fonts, forms and shadows, In general, it looks dilatant, but I liked some of them, here are some good examples.&lt;/p&gt;

&lt;p&gt;Here you can see the first version of my "sun circles" :)&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dEzHD6ZL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/wy6wum0orsaae9tf7xns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dEzHD6ZL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/wy6wum0orsaae9tf7xns.png" alt="Alt Text" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I made a lot of variants in Inkskape. Make clear filenames - no, it is immpossible :D&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jl0eR1-q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ht4r63igqwpgjs9spjqg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jl0eR1-q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/ht4r63igqwpgjs9spjqg.png" alt="Alt Text" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And I settled on that. I really liked this translucent glass, the color of which I played when I inserted it on the site.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Gpq1RXi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/vini1pfbxv2m4ksdnarh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Gpq1RXi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/vini1pfbxv2m4ksdnarh.png" alt="Alt Text" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After a time, I stopped like it, because I feel instability and uncertainty with it. I've back to circles. I did animated colors on my page, because I couldn't choose just two colors.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qvrBmn7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/3zf0lvoxwtknf9kt968z.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qvrBmn7W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/3zf0lvoxwtknf9kt968z.gif" alt="Alt Text" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next thing that I did, I turned these circles into a theme switch on the site, which is like sunset or sunrise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--byD7JEQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/h90prd5ahjjtkauyhu22.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--byD7JEQK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/h90prd5ahjjtkauyhu22.gif" alt="Alt Text" width="672" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently, I realized again that I was playing too much, that I was stuck in all this and I'm not move to my goal - to make a simple, static site. This project with theme switcher was stopped, because I complicated it. I've took HTML, CSS and I made current SVG logo by hands. And I'm happy with this simple and volume result.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BFGpvLS7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/rmr4t112g6l4oljpesrk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BFGpvLS7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/i/rmr4t112g6l4oljpesrk.png" alt="Alt Text" width="548" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe I'll do something interesting with shadows later, but that's less important.&lt;/p&gt;

&lt;p&gt;I continue do my site, next step is blog part, where I'm goint to put this article and smth else, for start.&lt;/p&gt;

&lt;h2&gt;
  
  
  The conclusion
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don't limited to design tools, but start with paper and pen for generate ideas&lt;/li&gt;
&lt;li&gt;When you are your own customer, design process is can be too long (in my case, about 4 of month in free time with breaks). Rememeber your goal&lt;/li&gt;
&lt;li&gt;Listen to your feelings about the forms, colors and design process. E.g. it seems, circles I likes more than triangles :D&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to fix my English.&lt;br&gt;
Thanks for your attention! Have a nice coding and design!&lt;/p&gt;

</description>
      <category>logo</category>
      <category>design</category>
      <category>svg</category>
      <category>css</category>
    </item>
  </channel>
</rss>
