<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Untitled Publication]]></title><description><![CDATA[Untitled Publication]]></description><link>https://lesor.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 14:21:44 GMT</lastBuildDate><atom:link href="https://lesor.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Suy nghĩ về Function Programming]]></title><description><![CDATA[Functional Programming được cho là bắt nguồn từ khái niệm Lambda Calculus trong toán học. Không đi sâu vào lý thuyết toán học, những nguyên tắc của nó mang lại nhiều hiệu ứng tích cực trong việc phát triển phần mềm.
Ưu tiên Pure Function (Hàm thuần k...]]></description><link>https://lesor.hashnode.dev/thinking-about-function-programming</link><guid isPermaLink="true">https://lesor.hashnode.dev/thinking-about-function-programming</guid><category><![CDATA[programing]]></category><dc:creator><![CDATA[Le Trung Luc]]></dc:creator><pubDate>Wed, 24 Jan 2024 06:49:57 GMT</pubDate><content:encoded><![CDATA[<p>Functional Programming được cho là bắt nguồn từ khái niệm <a target="_blank" href="https://en.wikipedia.org/wiki/Lambda_calculus">Lambda Calculus</a> trong toán học. Không đi sâu vào lý thuyết toán học, những nguyên tắc của nó mang lại nhiều hiệu ứng tích cực trong việc phát triển phần mềm.</p>
<h2 id="heading-uu-tien-pure-function-ham-thuan-khiet">Ưu tiên Pure Function (Hàm thuần khiết)</h2>
<p>Một function được gọi là thuần khiết nếu như </p>
<ul>
<li>luôn trả về cùng một đầu ra cho một đầu vào</li>
<li>không có <a target="_blank" href="https://en.wikipedia.org/wiki/Side_effect_(computer_science)">side effect</a></li>
</ul>
<blockquote>
<p><em>In other words, pure functions map inputs to outputs.</em></p>
</blockquote>
<p>Chúng ta chỉ có thể thao tác với <strong><strong>pure function</strong></strong> thông qua các đối số (arguments) và giá trị trả về (return value).</p>
<pre><code class="lang-jsx"><span class="hljs-comment">// ❌ sử dụng side effect thay vì trả về một giá trị</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addTodo</span>(<span class="hljs-params">arr</span>) </span>{
  arr.push(<span class="hljs-string">"Go to school"</span>);
}

<span class="hljs-comment">// ❌ sử dụng biến toàn cục</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addTaco</span>(<span class="hljs-params"></span>) </span>{
  <span class="hljs-keyword">return</span> [...globalArray, <span class="hljs-string">"taco"</span>];
}

<span class="hljs-comment">// ✅ pure</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addTaco</span>(<span class="hljs-params">array</span>) </span>{
  <span class="hljs-keyword">return</span> [...array, <span class="hljs-string">"taco"</span>];
}
</code></pre>
<p><strong><strong>Pure function rất dễ debug và unit test.</strong></strong> Ngoài ra, nó rất <a target="_blank" href="https://en.wikipedia.org/wiki/Referential_transparency">rõ ràng về mặt tham chiếu</a> nên rất dễ để áp dụng các kĩ thuật như <a target="_blank" href="https://en.wikipedia.org/wiki/Memoization">Memoization</a>. </p>
<p>Tuy nhiên, không phải tất cả mọi function đều có thể thuần khiết. Những tác vụ liên quan đến I/O, ngẫu nhiên hoá, kết nối mạng, xử lý database,… . Tuy nhiên, những khái niệm này có thể chuyển sang bên ngoài ở phạm vi lớn hơn, nó được gọi là <strong><strong><em>**</em></strong></strong>“function core, imperative shell”.<strong><strong><em>**</em></strong></strong></p>
<h2 id="heading-uu-tien-immutability-tinh-bat-bien">Ưu tiên <strong><strong>Immutability (tính bất biến)</strong></strong></h2>
<p>Trong JavaScript, tất cả các primitives value (boolean, string, number, …) đều bất biến. Với object và array thì không như vậy, nhưng chúng ta có thể làm việc với chúng theo một cách như vậy.</p>
<blockquote>
<p><em>When immutable, an object or array cannot be modified after it is created.</em></p>
</blockquote>
<p>Nếu muốn cập nhật nó, chúng ta phải clone nó và gán cho một biến mới.</p>
<pre><code class="lang-jsx"><span class="hljs-comment">// ❌ mutable</span>
<span class="hljs-keyword">const</span> todos = [<span class="hljs-string">"Go to school"</span>, <span class="hljs-string">"Sleep"</span>];
todos.push(<span class="hljs-string">"Do homework"</span>);

<span class="hljs-comment">// ✅ immutable</span>
<span class="hljs-keyword">const</span> todos = [<span class="hljs-string">"Go to school"</span>, <span class="hljs-string">"Sleep"</span>];
<span class="hljs-keyword">const</span> newTodos = [...todos, <span class="hljs-string">"Do homework"</span>];
</code></pre>
<p>Immutable data cũng tương tự với <a target="_blank" href="https://en.wikipedia.org/wiki/Thread_safety">thread safety</a> và <a target="_blank" href="https://stackoverflow.com/questions/29842845/what-is-failure-atomicity-used-by-j-bloch-and-how-its-beneficial-in-terms-of-i/29843251#29843251">failure atomic</a>.</p>
<p>Bonus: với immutable object &amp; array, chúng ta chỉ cần kiểm tra reference (tham chiếu) thay vì deep compare để phát hiện “thay đổi”, nó nhanh và đóng vai trò chính trong việc quản lý state của React.</p>
<h2 id="heading-uu-tien-declarative-patterns">Ưu tiên Declarative Patterns</h2>
<ul>
<li>Declarative programming là <strong>WHAT we want to achieve.</strong></li>
<li>Imperative programming là <strong>HOW we want to achieve it.</strong></li>
</ul>
<p>Nói cách khác, imperative programming mô tả các hướng dẫn từng bước rõ ràng trong khi declarative programming bao gồm một chuỗi khai báo:</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">const</span> names = [<span class="hljs-string">"Han"</span>, <span class="hljs-string">"Chewbacca"</span>, <span class="hljs-string">"Luke"</span>, <span class="hljs-string">"Leia"</span>];

<span class="hljs-comment">// ❌ imperative</span>
<span class="hljs-keyword">const</span> shortNames = [];
<span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; names.length; i++) {
  <span class="hljs-keyword">if</span> (names[i].length &lt; <span class="hljs-number">5</span>) {
    shortNames.push(names[i]);
  }
}

<span class="hljs-comment">// ✅ declarative</span>
<span class="hljs-keyword">const</span> shortNames = names.filter(<span class="hljs-function">(<span class="hljs-params">name</span>) =&gt;</span> name.length &lt; <span class="hljs-number">5</span>);
</code></pre>
<p>A declarative pattern đặt trọng tâm vào vấn đề chứ không phải chi tiết triển khai. Code thường ngắn gọn hơn và ít xảy ra lỗi hơn nhiều. Ngoài ra, nó dễ đọc và dễ hiểu hơn nhiều.</p>
]]></content:encoded></item></channel></rss>