<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>programming on Tớ là Đép</title><link>https://toladev.netlify.app/categories/programming/</link><description>Recent content in programming on Tớ là Đép</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 11 Dec 2022 02:45:23 +0700</lastBuildDate><atom:link href="https://toladev.netlify.app/categories/programming/index.xml" rel="self" type="application/rss+xml"/><item><title>Imperative Programming và Declarative Programming</title><link>https://toladev.netlify.app/posts/2022/dec/imperative-and-declarate-programming/</link><pubDate>Sun, 11 Dec 2022 02:45:23 +0700</pubDate><guid>https://toladev.netlify.app/posts/2022/dec/imperative-and-declarate-programming/</guid><description>&lt;img src="https://toladev.netlify.app/posts/2022/dec/imperative-and-declarate-programming/intro.png" alt="Featured image of post Imperative Programming và Declarative Programming" />&lt;p>Gần đây khi đọc vài tài liệu và bài viết mình có thấy lại khái niệm &lt;code>Imperative Programming&lt;/code> và &lt;code>Declarative Programming&lt;/code>, bỗng dưng thấy kiến thức này hơi hổng dù đã có nghía qua nó một lần. Nên mình vội vàng làm ngay một post để hâm lại kiến thức.&lt;/p>
&lt;blockquote>
&lt;p>Imperative vs Declarative Programming&lt;/p>
&lt;p>Imperative là cách bạn làm một thứ.&lt;/p>
&lt;p>Declarative là cái mà bạn muốn.&lt;/p>
&lt;/blockquote>
&lt;h2 id="uhm-vậy-nó-là-cái-quái-gì-">Uhm, vậy nó là cái quái gì (!?)&lt;/h2>
&lt;p>Định nghĩa thì rắc rối, vậy nên mình đưa ra ví dụ cho dễ hình dung.&lt;/p>
&lt;p>&lt;em>Bạn có một cuộc hẹn cho buổi pạt ty cuối tuần, và bạn nhắn: &amp;ldquo;Tao tới CircleK rồi, làm sao tới chỗ mày đây?&amp;rdquo;&lt;/em>&lt;/p>
&lt;p>&lt;strong>Imperative&lt;/strong>: Đi thẳng 100m. Tới đường Nguyễn Văn A, rẽ trái. Đi thẳng đến đường Phan Văn B đi thêm 200m nữa thì rẽ vào hẻm 213, tới nhà có số 12.&lt;/p>
&lt;p>&lt;strong>Declarative&lt;/strong>: Nhà t ở 213/12 Phan Văn B, Google Maps đi con giai.&lt;/p>
&lt;p>&lt;em>Cả 2 cách đều chỉ bạn đến nơi cần đến. Khác biệt ở chỗ, một cách sẽ cho bạn chỉ dẫn để có thể đến nơi, cách còn lại thì mong chị Google không dẫn bạn đi quá xa.&lt;/em>&lt;/p>
&lt;p>Với cách tiếp cận &lt;code>Imperative&lt;/code> thì bạn sẽ có được một chỉ dẫn cụ thể, làm cách nào mà bạn đến được địa chỉ đó (how).&lt;/p>
&lt;p>Với &lt;code>Declarative&lt;/code> thì sẽ cho bạn cái bạn muốn (what) - một địa chỉ và mặc định bạn sẽ biết cách kiếm ra được đường đi.&lt;/p>
&lt;p>Ta có thể thấy được các ngôn ngữ đang chia theo cách tiếp cận nào:&lt;/p>
&lt;p>&lt;strong>Imperative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>C&lt;/li>
&lt;li>C++&lt;/li>
&lt;li>Java&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Declarative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>SQL&lt;/li>
&lt;li>HTML&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Both&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Javascript&lt;/li>
&lt;li>C#&lt;/li>
&lt;li>Python&lt;/li>
&lt;/ul>
&lt;h2 id="các-ví-dụ">Các ví dụ&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-SQL" data-lang="SQL">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">SELECT&lt;/span> &lt;span style="color:#f92672">*&lt;/span> &lt;span style="color:#66d9ef">FROM&lt;/span> Users &lt;span style="color:#66d9ef">WHERE&lt;/span> Country&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;Viet Nam&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Lướt qua ví dụ bạn có thể thấy và hiểu ngay bạn đang cần &lt;em>cái gì&lt;/em> mà không cần quan tâm đến SQL lấy &lt;em>bằng cách nào&lt;/em> hay &lt;em>bằng thuật toán nào.&lt;/em>&lt;/p>
&lt;blockquote>
&lt;p>Bạn sẽ lấy được thông tin người dùng từ table &lt;code>Users&lt;/code>, họ có quốc tịch &lt;code>Viet Nam&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">sum&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span>, &lt;span style="color:#a6e22e">b&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#a6e22e">b&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Rõ ràng, đây là cách tiếp cận &lt;code>Imperative&lt;/code>, bạn khai báo một hàm, đặt tên cho nó, trong hàm có 2 tham số &lt;code>a, b&lt;/code> và nó sẽ trả về cho bạn tổng của 2 số đó.&lt;/p>
&lt;p>Giả sử mình có yêu cầu sau&lt;/p>
&lt;p>&lt;em>Viết 1 hàm tên là &lt;code>add&lt;/code>, nhận vào một mảng số nguyên và trả về tổng của các phần tử trong đó.&lt;/em>&lt;/p>
&lt;p>Và vì &lt;code>Javascript&lt;/code> là ngôn ngữ có cả &lt;code>Imperative&lt;/code> và &lt;code>Declarative&lt;/code> nên ta hoàn toàn có 2 cách tiếp cận nó như sau:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Imperative
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">arr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">len&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>.&lt;span style="color:#a6e22e">length&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (&lt;span style="color:#66d9ef">let&lt;/span> &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">0&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span> &lt;span style="color:#f92672">&amp;lt;&lt;/span> &lt;span style="color:#a6e22e">len&lt;/span>; &lt;span style="color:#a6e22e">i&lt;/span>&lt;span style="color:#f92672">++&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">result&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>[&lt;span style="color:#a6e22e">i&lt;/span>];
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">result&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-js" data-lang="js">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// Declarative
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>&lt;span style="color:#66d9ef">function&lt;/span> &lt;span style="color:#a6e22e">add&lt;/span>(&lt;span style="color:#a6e22e">arr&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">arr&lt;/span>.&lt;span style="color:#a6e22e">reduce&lt;/span>((&lt;span style="color:#a6e22e">total&lt;/span>, &lt;span style="color:#a6e22e">current&lt;/span>) =&amp;gt; (&lt;span style="color:#a6e22e">total&lt;/span> &lt;span style="color:#f92672">+=&lt;/span> &lt;span style="color:#a6e22e">current&lt;/span>), &lt;span style="color:#ae81ff">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="tổng-kết">Tổng kết&lt;/h2>
&lt;p>&lt;strong>Imperative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Quen thuộc&lt;/li>
&lt;li>Dễ học&lt;/li>
&lt;li>Có tính logic&lt;/li>
&lt;/ul>
&lt;p>Đây là cách tiếp cận chúng ta được được học từ những ngày đầu, mô tả cách thực hiện. Logic được thể hiện rõ ra bên ngoài.&lt;/p>
&lt;p>&lt;strong>Declarative&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Hạn chế sự thay đổi&lt;/li>
&lt;li>Giảm side-effects&lt;/li>
&lt;li>Code ngắn và dễ đọc hơn&lt;/li>
&lt;/ul>
&lt;p>Do không phải viết lại các bước logic, nên code sẽ rõ ràng hơn và dễ đọc hơn. Nhưng Logic lại bị ẩn đi (abstract).&lt;/p></description></item></channel></rss>