<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Kinh nghiệm Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/danh-muc/kinh-nghiem/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/danh-muc/kinh-nghiem/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Fri, 06 Feb 2026 08:34:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Kinh nghiệm Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/danh-muc/kinh-nghiem/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>SQL Partitioning: &#8220;Chia Để Trị&#8221; Dữ Liệu Khổng Lồ</title>
		<link>https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/</link>
					<comments>https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/#comments</comments>
		
		<dc:creator><![CDATA[Hoang Nam]]></dc:creator>
		<pubDate>Fri, 06 Feb 2026 08:34:06 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Sql]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[partition]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[postgres]]></category>
		<category><![CDATA[db]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=4215</guid>

					<description><![CDATA[<p>Database Của Bạn Đang &#8220;Kêu Cứu&#8221; Vì Chậm? Đã Đến Lúc &#8220;Chia Để Trị&#8221;! Bạn có đang &#8220;đau&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/">SQL Partitioning: &#8220;Chia Để Trị&#8221; Dữ Liệu Khổng Lồ</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="database-cua-ban-dang-keu-cuu-vi-cham-da-den-luc-chia-de-tri" class="wp-block-heading">Database Của Bạn Đang &#8220;Kêu Cứu&#8221; Vì Chậm? Đã Đến Lúc &#8220;Chia Để Trị&#8221;!</h2>



<p class="wp-block-paragraph">Bạn có đang &#8220;đau đầu&#8221; vì một câu query SQL, dù rất đơn giản, lại chạy mãi không xong trên một bảng dữ liệu ngày càng &#8220;béo phì&#8221;? Bạn là dev đang săn lùng từng mili giây hiệu suất, là tester đang vật lộn với những bài test performance, hay đơn giản là người mới tò mò về thế giới dữ liệu?</p>



<p class="wp-block-paragraph">Nếu câu trả lời là &#8220;có&#8221;, thì đây chính là &#8220;liều thuốc&#8221; bạn cần.</p>



<p class="wp-block-paragraph">Hãy quên đi những định nghĩa khô khan. Hôm nay, chúng ta sẽ khám phá <strong>SQL Partitioning</strong> – một kỹ thuật &#8220;chia để trị&#8221; đầy quyền năng – qua những ví dụ đời thường và những bí kíp thực chiến mà bạn sẽ không tìm thấy trong sách vở.</p>



<h2 id="1-sql-partitioning-la-gi" class="wp-block-heading">1. SQL Partitioning Là Gì? </h2>



<p class="wp-block-paragraph">Trước hết, Hãy tưởng tượng database của bạn là một cái nhà kho khổng lồ, chứa hàng triệu món đồ (dữ liệu). Khi cần tìm một món đồ, bạn phải chạy khắp cái nhà kho đó. Rất mất thời gian!</p>



<p class="wp-block-paragraph">Tuy nhiên, nếu bạn chia nhà kho thành các <strong>gian nhỏ có nhãn rõ ràng</strong>, mọi thứ sẽ khác.</p>



<p class="wp-block-paragraph"><strong>SQL Partitioning</strong> chính là việc bạn thông minh sắp xếp nhà kho đó thành các <strong>gian hàng nhỏ hơn, được dán nhãn rõ ràng</strong> (gọi là các <em>partition</em> &#8211; phân vùng):</p>



<ul class="wp-block-list">
<li>Gian hàng &#8220;Hóa đơn năm 2023&#8221;</li>



<li>Gian hàng &#8220;Hóa đơn năm 2024&#8221;</li>



<li>Gian hàng &#8220;Hóa đơn năm 2025&#8221;</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2f363c;color:#d3d7dd">Code mẫu:</span><span role="button" tabindex="0" data-code="CREATE TABLE invoice (
    invoice_id INT,
    invoice_date DATE,
    amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(invoice_date)) (
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025),
    PARTITION p_future VALUES LESS THAN MAXVALUE
);" style="color:#e1e4e8;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki github-dark" style="background-color: #24292e" tabindex="0"><code><span class="line"><span style="color: #F97583">CREATE</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">TABLE</span><span style="color: #E1E4E8"> </span><span style="color: #B392F0">invoice</span><span style="color: #E1E4E8"> (</span></span>
<span class="line"><span style="color: #E1E4E8">    invoice_id </span><span style="color: #F97583">INT</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    invoice_date </span><span style="color: #F97583">DATE</span><span style="color: #E1E4E8">,</span></span>
<span class="line"><span style="color: #E1E4E8">    amount </span><span style="color: #F97583">DECIMAL</span><span style="color: #E1E4E8">(</span><span style="color: #79B8FF">10</span><span style="color: #E1E4E8">,</span><span style="color: #79B8FF">2</span><span style="color: #E1E4E8">)</span></span>
<span class="line"><span style="color: #E1E4E8">)</span></span>
<span class="line"><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">BY</span><span style="color: #E1E4E8"> </span><span style="color: #F97583">RANGE</span><span style="color: #E1E4E8"> (</span><span style="color: #79B8FF">YEAR</span><span style="color: #E1E4E8">(invoice_date)) (</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p2022 </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN (</span><span style="color: #79B8FF">2023</span><span style="color: #E1E4E8">),</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p2023 </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN (</span><span style="color: #79B8FF">2024</span><span style="color: #E1E4E8">),</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p2024 </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN (</span><span style="color: #79B8FF">2025</span><span style="color: #E1E4E8">),</span></span>
<span class="line"><span style="color: #E1E4E8">    </span><span style="color: #F97583">PARTITION</span><span style="color: #E1E4E8"> p_future </span><span style="color: #F97583">VALUES</span><span style="color: #E1E4E8"> LESS THAN MAXVALUE</span></span>
<span class="line"><span style="color: #E1E4E8">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Khi sếp yêu cầu bạn tìm hóa đơn tháng 12/2024, bạn chỉ việc đi thẳng đến gian hàng &#8220;Hóa đơn năm 2024&#8221; để tìm. Nhanh hơn gấp bội!</p>



<p class="wp-block-paragraph">Quan trọng hơn, dù dữ liệu được chia nhỏ ra bên dưới, đối với ứng dụng của bạn nó vẫn là <strong>một bảng duy nhất</strong>. Đó chính là sự “thần kỳ” của partition.</p>



<h3 id="loi-ich-vang-cua-partitioning" class="wp-block-heading">Lợi ích VÀNG của Partitioning:</h3>



<ul class="wp-block-list">
<li><strong>Tăng tốc độ truy vấn &#8220;tên lửa&#8221;:</strong> Khi bạn lọc dữ liệu theo &#8220;nhãn&#8221; của gian hàng (ví dụ: <code>WHERE OrderDate BETWEEN '2024-01-01' AND '2024-12-31'</code>), hệ thống sẽ chỉ quét gian hàng &#8220;2024&#8221;, bỏ qua toàn bộ các gian hàng khác. Đây gọi là kỹ thuật <em>Partition Pruning</em> (cắt tỉa phân vùng).</li>



<li><strong>Quản lý dữ liệu dễ như trở bàn tay:</strong> Muốn xóa toàn bộ dữ liệu năm 2020? Thay vì chạy lệnh <code>DELETE</code> hàng triệu dòng và chờ &#8220;dài cổ&#8221;, bạn chỉ cần &#8220;dỡ&#8221; cả gian hàng 2020 đi. Xong!</li>



<li><strong>Bảo trì nhẹ nhàng hơn:</strong> Việc bảo trì (như rebuild index) trên một gian hàng nhỏ sẽ nhanh và ít ảnh hưởng đến hệ thống hơn là làm trên cả cái nhà kho.</li>
</ul>



<h2 id="2-cac-loai-vu-khi-phan-vung-pho-bien-chon-dung-thang-to" class="wp-block-heading">2. Các &#8220;Loại Vũ Khí&#8221; Phân Vùng Phổ Biến: Chọn Đúng, Thắng To</h2>



<p class="wp-block-paragraph">Có 3 loại partitioning chính. Việc chọn đúng loại sẽ quyết định sự thành bại của bạn.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="683" src="https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-1024x683.png" alt="" class="wp-image-4232" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-1024x683.png 1024w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-300x200.png 300w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-768x512.png 768w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-380x253.png 380w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-800x533.png 800w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition-1160x773.png 1160w, https://blog.tomosia.com.vn/wp-content/uploads/2026/02/type-partition.png 1536w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 id="range-partitioning-phan-vung-theo-khoang" class="wp-block-heading">RANGE Partitioning (Phân vùng theo Khoảng)</h3>



<ul class="wp-block-list">
<li><strong>Ý tưởng:</strong> Chia dữ liệu theo một khoảng giá trị liên tục.</li>



<li><strong>Ví dụ Kinh điển:</strong> Phân vùng bảng <code>Sales</code> theo cột <code>OrderDate</code>. Mỗi phân vùng chứa dữ liệu của một tháng hoặc một quý.</li>



<li><strong>Khi nào dùng:</strong> Cực kỳ hoàn hảo cho dữ liệu chuỗi thời gian (time-series) như logs, giao dịch, dữ liệu cảm biến IoT.</li>
</ul>



<h3 id="list-partitioning-phan-vung-theo-danh-sach" class="wp-block-heading">LIST Partitioning (Phân vùng theo Danh sách)</h3>



<ul class="wp-block-list">
<li><strong>Ý tưởng:</strong> Chia dữ liệu theo một danh sách các giá trị cụ thể.</li>



<li><strong>Ví dụ Kinh điển:</strong> Phân vùng bảng <code>Customers</code> theo cột <code>Region</code> (Vùng miền). Một phân vùng cho &#8216;Miền Bắc&#8217;, một cho &#8216;Miền Trung&#8217;, một cho &#8216;Miền Nam&#8217;.</li>



<li><strong>Khi nào dùng:</strong> Phù hợp khi cột phân vùng có một tập hợp các giá trị hữu hạn và rõ ràng (như Tỉnh/Thành, Trạng thái, Loại sản phẩm).</li>
</ul>



<h3 id="hash-partitioning-phan-vung-theo-ham-bam" class="wp-block-heading">HASH Partitioning (Phân vùng theo Hàm băm)</h3>



<ul class="wp-block-list">
<li><strong>Ý tưởng:</strong> Tự động phân bổ đều dữ liệu vào một số lượng phân vùng đã định trước.</li>



<li><strong>Ví dụ Kinh điển:</strong> Phân vùng bảng <code>Users</code> theo <code>user_id</code>. Hệ thống sẽ dùng một thuật toán để đảm bảo dữ liệu người dùng được chia đều vào các phân vùng.</li>



<li><strong>Khi nào dùng:</strong> Dùng khi bạn không có cột nào phù hợp cho RANGE hay LIST, và mục tiêu chính là phân tán đều dữ liệu để tránh &#8220;điểm nóng&#8221;.</li>
</ul>



<h2 id="3-bi-kip-thuc-chien-nhung-cu-lua-can-tranh" class="wp-block-heading">3. Bí Kíp Thực Chiến &amp; Những &#8220;Cú Lừa&#8221; Cần Tránh</h2>



<p class="wp-block-paragraph">Lý thuyết màu hồng, nhưng thực tế thì&#8230; không phải lúc nào cũng vậy. Đây là những kinh nghiệm xương máu giúp bạn tránh đi vào &#8220;vết xe đổ&#8221;.</p>



<h3 id="hoi-dap-nhanh-cac-loi-sai-kinh-dien-khi-dung-partitioning" class="wp-block-heading">Hỏi &amp; Đáp Nhanh: Các Lỗi Sai Kinh Điển Khi Dùng Partitioning</h3>



<p class="wp-block-paragraph"><strong>Câu hỏi:</strong> <em>Tôi đã phân vùng rồi mà query vẫn chậm như rùa. Tôi đã làm sai ở đâu?</em></p>



<p class="wp-block-paragraph"><strong>Trả lời:</strong> Rất có thể bạn đã mắc phải một trong những lỗi sau:</p>



<ul class="wp-block-list">
<li><strong>Chọn sai &#8220;Chìa Khóa&#8221; (Partition Key):</strong> Đây là sai lầm chết người nhất. Nếu các query của bạn không lọc theo cột mà bạn dùng để phân vùng (<code>partition key</code>), thì việc phân vùng hoàn toàn vô dụng. Hệ thống vẫn phải quét tất cả các &#8220;gian hàng&#8221;.</li>



<li><strong>&#8220;Tham Lam&#8221; Chia Quá Nhiều Phân Vùng:</strong> Chia nhỏ quá không tốt! Quá nhiều phân vùng sẽ làm tăng gánh nặng quản lý cho database, khiến việc lên kế hoạch truy vấn chậm đi. Vài chục đến vài trăm phân vùng thường là con số hợp lý.</li>



<li><strong>Dữ Liệu Phân Bổ Không Đều:</strong> Nếu 90% dữ liệu của bạn bị dồn vào chỉ một phân vùng, thì lợi ích gần như bằng không. Hãy phân tích dữ liệu trước khi chọn cột phân vùng.</li>



<li><strong>&#8220;Bỏ quên&#8221; Index:</strong> Partitioning và Indexing là &#8220;cặp bài trùng&#8221; chứ không phải kẻ thù. Phân vùng giúp giới hạn số lượng dữ liệu cần quét, còn index giúp tìm kiếm nhanh chóng bên trong phân vùng đó.</li>



<li><strong>Đừng chia quá nhỏ (Over-partitioning)</strong><br>Đừng chia mỗi ngày 1 partition nếu bạn có dữ liệu 10 năm (sẽ ra 3650 partitions). Khi partitions quá nhiều:
<ul class="wp-block-list">
<li>Hệ điều hành quá tải vì mở quá nhiều file.</li>



<li>Database tốn tài nguyên để quản lý metadata.</li>



<li>Query có thể chậm hơn cả không partition.</li>



<li><strong>Lời khuyên:</strong> Giữ số lượng partition ở mức hợp lý (dưới 100 thường là con số an toàn cho MySQL, Oracle thì có thể nhiều hơn).</li>
</ul>
</li>



<li><strong>Cẩn thận với Primary Key</strong>: Hầu hết các DB engine (như MySQL) yêu cầu cột dùng để Partition phải nằm trong Primary Key. Điều này có nghĩa là PK của bạn sẽ phải đổi từ <code>(id)</code> sang <code>(id, order_date)</code>. Dev team cần lưu ý chỗ này kẻo code logic bị sai.</li>
</ul>



<h2 id="ket-luan-partitioning-la-mot-tu-duy-khong-chi-la-cong-cu" class="wp-block-heading">Kết Luận: Partitioning Là Một Tư Duy, Không Chỉ Là Công Cụ</h2>



<p class="wp-block-paragraph">SQL Partitioning không phải là viên đạn bạc cho mọi vấn đề. Nó là một công cụ quản lý dữ liệu cực kỳ mạnh mẽ ở quy mô lớn, với &#8220;tác dụng phụ&#8221; tuyệt vời là cải thiện hiệu suất.</p>



<p class="wp-block-paragraph"><strong>Lời khuyên cuối cùng:</strong> Đừng vội vàng phân vùng mọi bảng bạn có. Hãy luôn bắt đầu bằng việc tối ưu query và index. Chỉ khi bảng dữ liệu đã thực sự phình to (hàng trăm triệu dòng) và các phương pháp khác đã &#8220;bó tay&#8221;, đó mới là lúc bạn rút &#8220;thanh bảo kiếm&#8221; Partitioning ra.</p>



<p class="wp-block-paragraph">Chúc bạn thành công trên con đường chinh phục dữ liệu!</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/">SQL Partitioning: &#8220;Chia Để Trị&#8221; Dữ Liệu Khổng Lồ</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/sql-partitioning-chia-de-tri-du-lieu-khong-lo/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		
		<series:name><![CDATA[Web vulnerability]]></series:name>
	</item>
		<item>
		<title>Đưa Localhost lên Internet miễn phí với Cloudflare Tunnel: Giải pháp thay thế Ngrok để Test Webhook &#038; Demo App</title>
		<link>https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/</link>
					<comments>https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/#comments</comments>
		
		<dc:creator><![CDATA[Hoang Nam]]></dc:creator>
		<pubDate>Tue, 09 Dec 2025 01:41:48 +0000</pubDate>
				<category><![CDATA[Web Server]]></category>
		<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[Solution]]></category>
		<category><![CDATA[Hosting]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3752</guid>

					<description><![CDATA[<p>Bạn cần test webhook ZaloPay, Stripe hay demo app cho khách hàng ngay trên localhost? Hướng dẫn sử&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/">Đưa Localhost lên Internet miễn phí với Cloudflare Tunnel: Giải pháp thay thế Ngrok để Test Webhook &amp; Demo App</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><em>Bạn cần test webhook ZaloPay, Stripe hay demo app cho khách hàng ngay trên localhost? Hướng dẫn sử dụng Cloudflare Tunnel để expose local server ra internet với HTTPS miễn phí, bảo mật, không cần mở port.</em></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 id="mo-dau-noi-dau-cua-developer" class="wp-block-heading">Mở đầu: Nỗi đau của Developer</h2>



<p class="wp-block-paragraph">Bạn đang phát triển một ứng dụng local, mọi thứ chạy mượt mà ở&nbsp;localhost:3000. Nhưng vấn đề nảy sinh khi:</p>



<ul class="wp-block-list">
<li>Bạn cần <strong>test Webhook</strong> từ các dịch vụ bên ngoài như ZaloPay, Stripe, Telegram (các bên này bắt buộc phải có HTTPS).</li>



<li>Khách hàng muốn <strong>xem demo ngay lập tức</strong>, nhưng bạn chưa kịp deploy lên server.</li>



<li>Bạn chán ngấy cảnh dùng <strong>Ngrok bản free</strong> vì tên miền bị đổi liên tục sau mỗi lần restart.</li>
</ul>



<p class="wp-block-paragraph">Giải pháp tối ưu nhất hiện nay chính là&nbsp;<strong>Cloudflare Tunnel</strong>.</p>



<h2 id="1-cloudflare-tunnel-la-gi" class="wp-block-heading">1. Cloudflare Tunnel là gì?</h2>



<p class="wp-block-paragraph"><strong>Cloudflare Tunnel</strong>&nbsp;(trước đây là Argo Tunnel) là công cụ giúp bạn kết nối máy chủ local (hoặc máy ảo) ra internet mà&nbsp;<strong>không cần mở port (port forwarding)</strong>&nbsp;trên router.</p>



<p class="wp-block-paragraph">Thay vì cho phép người lạ truy cập trực tiếp vào IP của bạn (rất rủi ro), Tunnel tạo một đường hầm bảo mật (outbound connection) từ máy bạn đến mạng lưới Cloudflare Edge. Từ đó, Cloudflare sẽ &#8220;public&#8221; ứng dụng của bạn ra ngoài bằng một tên miền HTTPS xịn xò.</p>



<h3 id="tai-sao-nen-dung-cloudflare-tunnel-thay-vi-ngrok" class="wp-block-heading">Tại sao nên dùng Cloudflare Tunnel thay vì Ngrok?</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Tiêu chí</td><td>Ngrok (Free)</td><td>Cloudflare Tunnel</td></tr><tr><td><strong>Domain</strong></td><td>Random, đổi liên tục</td><td><strong>Cố định</strong>&nbsp;(theo domain của bạn)</td></tr><tr><td><strong>Chi phí</strong></td><td>Giới hạn tính năng</td><td><strong>Miễn phí</strong>&nbsp;hoàn toàn</td></tr><tr><td><strong>Bảo mật</strong></td><td>Thấp</td><td>Rất cao (Cloudflare Shield)</td></tr><tr><td><strong>Cài đặt</strong></td><td>Nhanh</td><td>Cần domain riêng (nhưng đáng giá)</td></tr></tbody></table></figure>



<h2 id="2-mo-hinh-hoat-dong" class="wp-block-heading">2. Mô hình hoạt động</h2>



<p class="wp-block-paragraph">Hãy tưởng tượng luồng dữ liệu sẽ đi như sau:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>User Browser</strong> -> <strong>Cloudflare Edge (HTTPS)</strong> -> <strong>Cloudflared (trên máy bạn)</strong> -> <strong>Localhost (3000, 8080&#8230;)</strong></p>
</blockquote>



<p class="wp-block-paragraph">Bạn có thể chạy nhiều dịch vụ cùng lúc qua một đường hầm duy nhất:</p>



<ul class="wp-block-list">
<li>api.domain.com -> trỏ về localhost:3000</li>



<li>admin.domain.com -> trỏ về localhost:8080</li>
</ul>



<h2 id="3-chuan-bi-do-nghe" class="wp-block-heading">3. Chuẩn bị &#8220;đồ nghề&#8221;</h2>



<p class="wp-block-paragraph">Trước khi bắt đầu, bạn cần:</p>



<ol class="wp-block-list">
<li><strong>Tài khoản Cloudflare</strong> (đăng ký miễn phí).</li>



<li><strong>Một tên miền (Domain)</strong> đã thêm vào Cloudflare.
<ul class="wp-block-list">
<li><em>Lưu ý:</em> Freenom hiện tại không ổn định. Bạn nên mua các domain giá rẻ như .xyz, .dev, .click (chỉ khoảng 1-2$/năm) tại Namecheap hoặc Hostinger để dùng lâu dài.</li>
</ul>
</li>



<li><strong>Máy tính</strong> (Linux/Mac/Windows) để chạy tool.</li>
</ol>



<h2 id="4-huong-dan-trien-khai-chi-tiet-step-by-step" class="wp-block-heading">4. Hướng dẫn triển khai chi tiết (Step-by-step)</h2>



<h3 id="buoc-1-cai-dat-cloudflared" class="wp-block-heading">Bước 1: Cài đặt&nbsp;cloudflared</h3>



<p class="wp-block-paragraph">Công cụ&nbsp;cloudflared&nbsp;là cầu nối giữa máy bạn và Cloudflare.</p>



<p class="wp-block-paragraph"><strong>Trên Linux (Ubuntu/Debian):</strong>codeBash</p>



<pre class="wp-block-code"><code>curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -o cloudflared.deb
sudo dpkg -i cloudflared.deb</code></pre>



<p class="wp-block-paragraph"><strong>Trên Windows:</strong><br>Tải file&nbsp;.msi&nbsp;mới nhất từ GitHub chính chủ:&nbsp;<a target="_blank" href="https://www.google.com/url?sa=E&amp;q=https%3A%2F%2Fgithub.com%2Fcloudflare%2Fcloudflared%2Freleases" rel="noreferrer noopener">Cloudflare Downloads</a><br><em>(Mở PowerShell dưới quyền Administrator để chạy các lệnh sau này).</em></p>



<h3 id="buoc-2-dang-nhap-cloudflare" class="wp-block-heading">Bước 2: Đăng nhập Cloudflare</h3>



<p class="wp-block-paragraph">Chạy lệnh sau để xác thực:codeBash</p>



<pre class="wp-block-code"><code>cloudflared tunnel login</code></pre>



<p class="wp-block-paragraph">Trình duyệt sẽ bật lên, bạn hãy chọn tên miền muốn sử dụng và bấm&nbsp;<strong>Authorize</strong>.</p>



<h3 id="buoc-3-tao-tunnel" class="wp-block-heading">Bước 3: Tạo Tunnel</h3>



<p class="wp-block-paragraph">Đặt tên cho tunnel của bạn (ví dụ:&nbsp;my-local-server):codeBash</p>



<pre class="wp-block-code"><code>cloudflared tunnel create my-local-server</code></pre>



<p class="wp-block-paragraph">Sau khi tạo xong, Cloudflare sẽ sinh ra một&nbsp;<strong>Tunnel ID</strong>&nbsp;và file credentials (thường nằm ở&nbsp;~/.cloudflared/).</p>



<h3 id="buoc-4-cau-hinh-dinh-tuyen-routing" class="wp-block-heading">Bước 4: Cấu hình định tuyến (Routing)</h3>



<p class="wp-block-paragraph">Đây là bước quan trọng nhất để map domain về localhost.<br>Tạo file&nbsp;config.yml&nbsp;trong thư mục&nbsp;~/.cloudflared/&nbsp;(hoặc cùng thư mục chạy tool) với nội dung:codeYaml</p>



<pre class="wp-block-code"><code>tunnel: &lt;TUNNEL-NAME-HOẶC-ID&gt;
credentials-file: /duong/dan/den/file/json/credentials.json

ingress:
  # Service 1: API Backend
  - hostname: api.namdevlabs.com
    service: http://localhost:3000

  # Service 2: Webhook test (ZaloPay, Stripe)
  - hostname: hook.namdevlabs.com
    service: http://localhost:5678

  # Service 3: Dashboard Admin
  - hostname: admin.namdevlabs.com
    service: http://localhost:8080

  # Rule cuối cùng bắt buộc: Trả về 404 nếu không khớp domain nào
  - service: http_status:404</code></pre>



<h3 id="buoc-5-gan-dns-cho-subdomain" class="wp-block-heading">Bước 5: Gắn DNS cho Subdomain</h3>



<p class="wp-block-paragraph">Bạn cần báo cho Cloudflare biết subdomain nào sẽ đi vào tunnel này.codeBash</p>



<pre class="wp-block-code"><code># Cú pháp: cloudflared tunnel route dns &lt;TUNNEL_NAME&gt; &lt;SUBDOMAIN&gt;
cloudflared tunnel route dns my-local-server api.namdevlabs.com
cloudflared tunnel route dns my-local-server hook.namdevlabs.com</code></pre>



<p class="wp-block-paragraph">Lệnh này sẽ tự động tạo bản ghi CNAME trên Cloudflare Dashboard.</p>



<h3 id="buoc-6-kich-hoat-tunnel" class="wp-block-heading">Bước 6: Kích hoạt Tunnel</h3>



<p class="wp-block-paragraph">Chạy tunnel với file config vừa tạo:codeBash</p>



<pre class="wp-block-code"><code>cloudflared tunnel run my-local-server</code></pre>



<p class="wp-block-paragraph"><em>Mẹo:</em>&nbsp;Nếu file config không nằm ở vị trí mặc định, dùng flag&nbsp;&#8211;config:<br>cloudflared tunnel &#8211;config /path/to/config.yml run</p>



<p class="wp-block-paragraph"> <strong>Xong!</strong> Bây giờ bạn có thể truy cập https://api.namdevlabs.com và thấy nó trỏ thẳng về localhost:3000 của bạn với HTTPS xanh mượt.</p>



<h2 id="5-meo-nang-cao-cho-pro-developer" class="wp-block-heading">5. Mẹo nâng cao cho Pro Developer</h2>



<ul class="wp-block-list">
<li><strong>Chạy ngầm (Service Mode):</strong> Để tunnel tự chạy khi khởi động máy (dành cho server home lab):codeBash<code>sudo cloudflared service install sudo systemctl start cloudflared</code></li>



<li><strong>Bảo mật Zero Trust:</strong> Bạn sợ người lạ vào link demo? Vào Cloudflare Dashboard -> Zero Trust, bật tính năng yêu cầu đăng nhập bằng Email/Google trước khi truy cập vào domain.</li>



<li><strong>Debug lỗi:</strong> Nếu không truy cập được, hãy thêm flag &#8211;loglevel debug khi chạy để xem log chi tiết.</li>
</ul>



<h2 id="6-tong-ket" class="wp-block-heading">6. Tổng kết</h2>



<p class="wp-block-paragraph">Cloudflare Tunnel thực sự là một vũ khí lợi hại trong bộ công cụ của developer. Nó giúp bạn:</p>



<ol class="wp-block-list">
<li><strong>Tiết kiệm tiền:</strong> Không tốn phí server staging.</li>



<li><strong>Tiết kiệm thời gian:</strong> Không cần deploy để demo.</li>



<li><strong>An toàn:</strong> Không mở port, hạn chế tấn công DDoS.</li>
</ol>



<p class="wp-block-paragraph">Hy vọng bài viết giúp bạn giải quyết được bài toán đau đầu về Webhook và Demo. Chúc bạn code vui!</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>
<p>The post <a href="https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/">Đưa Localhost lên Internet miễn phí với Cloudflare Tunnel: Giải pháp thay thế Ngrok để Test Webhook &amp; Demo App</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/dua-localhost-len-internet-mien-phi-voi-cloudflare-tunnel-giai-phap-thay-the-ngrok-de-test-webhook-demo-app/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Cách viết 1 daily report tốt</title>
		<link>https://blog.tomosia.com.vn/cach-viet-1-daily-report-tot/</link>
					<comments>https://blog.tomosia.com.vn/cach-viet-1-daily-report-tot/#comments</comments>
		
		<dc:creator><![CDATA[Rock Khuya]]></dc:creator>
		<pubDate>Wed, 24 Jan 2024 09:37:36 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=3051</guid>

					<description><![CDATA[<p>Daily report là gì ? Daily report là bản báo cáo nội dung, kết quả công việc hàng&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-viet-1-daily-report-tot/">Cách viết 1 daily report tốt</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h2 id="daily-report-la-gi" class="wp-block-heading">Daily report là gì ?</h2>



<p class="wp-block-paragraph">Daily report là bản báo cáo <strong>nội dung, kết quả công việc</strong> hàng ngày của mỗi người.&nbsp;</p>



<p class="wp-block-paragraph">Từ bản báo cáo này, PM, khách hàng có thể nắm được tiến độ, khó khăn, kết quả, kế hoạch từng ngày của mỗi người.&nbsp;</p>



<h2 id="tam-quan-trong-cua-daily-report" class="wp-block-heading"><strong>Tầm quan trọng của daily report ?</strong></h2>



<ul class="wp-block-list">
<li>Với PM, khách hàng : nắm được tiến độ, kết quả công việc từng ngày, từ đó điều chỉnh kế hoạch và có những thay đổi cho phù hợp.&nbsp;</li>



<li>Ngoài ra, PM cũng nắm được khó khăn của mỗi người, từ đó có sự hỗ trợ kịp thời.&nbsp;</li>



<li>Với cả team, việc chia sẻ và đọc daily report của nhau giúp mọi người nắm được tiến độ tổng thể, học từ kinh nghiệm từ người khác, hoặc giúp đỡ nhau khi gặp khó khăn.&nbsp;</li>



<li>Với từng cá nhân, daily report giúp mỗi người nắm được tiến độ, kết quả công việc của mình, từ đó gia tăng sự thỏa mãn, hài lòng khi nhìn lại những giá trị mình tạo ra. Nó cũng giúp ta chấn chỉnh lại tiến độ, sự tập trung khi kết quả chưa đạt như mong muốn.&nbsp;</li>
</ul>



<h2 id="the-nao-la-1-daily-report-tot" class="wp-block-heading"><strong>Thế nào là 1 daily report tốt ? </strong></h2>



<ol class="wp-block-list">
<li>Đầy đủ nhưng ngắn gọn. Đầy đủ những công việc mình đã làm, nhưng viết ngắn gọn thôi. Tốt nhất là viết thành mỗi công việc thành 1 gạch đầu dòng.&nbsp;</li>



<li>Mỗi công việc (gạch đầu dòng) phải có quá trình và kết quả.&nbsp;</li>



<li>Mỗi công việc cần phải có thời gian thực hiện đi kèm.&nbsp;</li>



<li>Phải có evidence đi kèm với mỗi công việc.&nbsp;</li>



<li>Phải có kế hoạch cho ngày tiếp theo ( dựa theo kết quả của ngày hôm nay ).&nbsp;</li>
</ol>



<h2 id="cach-viet-daily-report" class="wp-block-heading"><strong>Cách viết daily report </strong></h2>



<ol class="wp-block-list">
<li>Nên vừa làm, vừa có 1 bản note đi ghi chép lại, nếu không mình sẽ bị quên.&nbsp;</li>



<li>Note theo format của daily report là tốt nhất, đỡ mất công sửa lại.&nbsp;</li>



<li>Nên có plan đến từng giờ trong ngày và cố gắng thực hiện theo.&nbsp;</li>



<li>Mọi người phải có ý thức review daily report của nhau như là review code.&nbsp;</li>



<li>Sau khi viết về công việc trong ngày, cần đánh giá lại và lên kế hoạch cho ngày hôm sau.&nbsp;</li>
</ol>
<p>The post <a href="https://blog.tomosia.com.vn/cach-viet-1-daily-report-tot/">Cách viết 1 daily report tốt</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/cach-viet-1-daily-report-tot/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title>Review Code: Một số tips để đạt được hiệu quả.</title>
		<link>https://blog.tomosia.com.vn/review-code-mot-so-tips-de-dat-duoc-hieu-qua/</link>
					<comments>https://blog.tomosia.com.vn/review-code-mot-so-tips-de-dat-duoc-hieu-qua/#comments</comments>
		
		<dc:creator><![CDATA[Nguyen Anh]]></dc:creator>
		<pubDate>Wed, 20 Dec 2023 03:07:26 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[review code]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2737</guid>

					<description><![CDATA[<p>Khi comment vào PR của người khác, việc thể hiện sự tôn trọng và hỗ trợ là chìa khóa để xây dựng một môi trường hợp tác và phát triển tích cực trong nhóm. Trong mọi hoàn cảnh hãy thử đặt mình vào vị trí người khác bạn sẽ có cách giải quyết đúng đắn và hợp lý.</p>
<p>The post <a href="https://blog.tomosia.com.vn/review-code-mot-so-tips-de-dat-duoc-hieu-qua/">Review Code: Một số tips để đạt được hiệu quả.</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Khi comment vào Pull Request (PR) của người khác, việc thể hiện sự tôn trọng và hỗ trợ là chìa khóa để xây dựng một môi trường hợp tác và phát triển tích cực trong nhóm. Review code cũng là một cách để chúng ta truyền đạt những kinh nghiệm của bản thân tới cho người khác, vì thể hãy đưa nó về đúng với bản chất, target mà chúng ta mong muốn.</p>



<p class="wp-block-paragraph">Trong mọi hoàn cảnh hãy thử đặt mình vào vị trí người khác chúng sẽ dễ có cách giải quyết đúng đắn và thuyết phục, dưới đây là một vài lời khuyên &#8220;không cụ thể&#8221;.</p>



<h3 id="1-dua-ra-gop-y-xay-dung" class="wp-block-heading">1. Đưa ra góp ý xây dựng:</h3>



<ul class="wp-block-list">
<li><strong>Tập trung vào vấn đề:</strong> Chú ý vào các phần của code hoặc logic cần cải thiện hoặc có vấn đề.</li>



<li><strong>Đề xuất cải thiện:</strong> Đưa ra ý kiến xây dựng, gợi ý cách để cải thiện mã nguồn, thay vì chỉ nhấn mạnh vấn đề.</li>



<li><strong>Đánh nhãn nếu có thể:</strong> Hãy tập trung vào những điểm <strong>High</strong> cần phải thay đổi, <strong>Middle</strong> nên thay đổi, <strong>Low</strong> thay đổi càng tốt</li>
</ul>



<h3 id="2-su-dung-ngon-ngu-tich-cuc-va-ton-trong" class="wp-block-heading">2. Sử dụng ngôn ngữ tích cực và tôn trọng:</h3>



<ul class="wp-block-list">
<li><strong>Lời khuyên thay vì chỉ trích:</strong> Sử dụng ngôn ngữ tích cực để gợi ý cách sửa đổi hoặc cải thiện.</li>



<li><strong>Tôn trọng ý kiến:</strong> Đề xuất ý kiến của bạn một cách lịch sự và tôn trọng, tránh ngôn từ hoặc cách diễn đạt có thể bị hiểu là chỉ trích.</li>
</ul>



<h3 id="3-giai-thich-ro-rang-va-minh-bach" class="wp-block-heading">3. Giải thích rõ ràng và minh bạch:</h3>



<ul class="wp-block-list">
<li><strong>Minh bạch:</strong> Giải thích tại sao bạn đề xuất thay đổi hoặc cần sửa đổi để người khác hiểu rõ lý do.</li>



<li><strong>Ví dụ cụ thể (nếu có thể):</strong> Nếu có thể, cung cấp ví dụ cụ thể để minh họa vấn đề hoặc cải thiện đề xuất của bạn.</li>
</ul>



<h3 id="4-tranh-mau-thuan-va-xung-dot" class="wp-block-heading">4. Tránh mâu thuẫn và xung đột:</h3>



<ul class="wp-block-list">
<li><strong>Hỏi trước khi giả định:</strong> Nếu có điều gì không rõ ràng, hãy hỏi trước khi đưa ra giả định hoặc nhận xét.</li>



<li><strong>Tránh tranh cãi:</strong> Tránh tranh cãi không cần thiết và tập trung vào giải quyết vấn đề.</li>
</ul>



<h3 id="5-de-xuat-giai-phap" class="wp-block-heading">5. Đề xuất giải pháp:</h3>



<ul class="wp-block-list">
<li><strong>Đề xuất sửa đổi cụ thể:</strong> Nếu có thể, đề xuất cách thức cụ thể để sửa đổi vấn đề đã được xác định.</li>



<li><strong>Hỗ trợ người gửi PR:</strong> Nếu bạn có kiến thức hoặc kinh nghiệm để giúp người gửi PR hoàn thiện mã nguồn, hãy chia sẻ.</li>
</ul>



<h3 id="6-theo-doi-va-phan-hoi" class="wp-block-heading">6. Theo dõi và phản hồi:</h3>



<ul class="wp-block-list">
<li><strong>Theo dõi và phản hồi:</strong> Theo dõi sự phản hồi từ người gửi PR và trả lời các câu hỏi hoặc bất kỳ yêu cầu giải thích nào.</li>



<li><strong>Hiểu và thấu hiểu:</strong> Đôi khi, người gửi PR có lý do riêng cho cách họ viết mã nguồn. Hiểu và cân nhắc trước khi yêu cầu thay đổi, có câu<em> hiểu người khác là khôn ngoan, hiểu được chính mình là giác ngộ!!!</em></li>
</ul>



<p class="wp-block-paragraph">Cám ơn mọi người đã vào và đọc được dòng chữ này!!!!</p>
<p>The post <a href="https://blog.tomosia.com.vn/review-code-mot-so-tips-de-dat-duoc-hieu-qua/">Review Code: Một số tips để đạt được hiệu quả.</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/review-code-mot-so-tips-de-dat-duoc-hieu-qua/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Ước tính RAM / CPU cần sử dụng cho một website</title>
		<link>https://blog.tomosia.com.vn/uoc-tinh-ram-cpu-can-su-dung-cho-mot-website/</link>
					<comments>https://blog.tomosia.com.vn/uoc-tinh-ram-cpu-can-su-dung-cho-mot-website/#comments</comments>
		
		<dc:creator><![CDATA[Anh Le]]></dc:creator>
		<pubDate>Fri, 08 Dec 2023 10:08:27 +0000</pubDate>
				<category><![CDATA[Chưa phân loại]]></category>
		<category><![CDATA[Kinh nghiệm]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2333</guid>

					<description><![CDATA[<p>Ước lượng tài nguyên (RAM và CPU) cần thiết cho một website là một quá trình phức tạp&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/uoc-tinh-ram-cpu-can-su-dung-cho-mot-website/">Ước tính RAM / CPU cần sử dụng cho một website</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ước lượng tài nguyên (RAM và CPU) cần thiết cho một website là một quá trình phức tạp và phụ thuộc vào nhiều yếu tố khác nhau. Dưới đây là một số bước và yếu tố mà bạn có thể xem xét khi ước lượng tài nguyên:</p>



<ul class="wp-block-list">
<li><strong>Lượng Truy Cập (Traffic)</strong>: Ước lượng số lượt truy cập trang web hàng ngày, hàng giờ, hoặc trong khoảng thời gian nào đó.</li>



<li><strong>Loại Website</strong>: Loại website của bạn ảnh hưởng đến lượng tài nguyên cần thiết. Ví dụ, một trang web dạng blog có thể yêu cầu ít tài nguyên hơn so với một trang web thương mại điện tử phức tạp.</li>



<li><strong>Nội Dung Động</strong>: Nếu trang web của bạn chứa nhiều nội dung động, ví dụ như video, hình ảnh động, hay tính năng tương tác cao, sẽ đòi hỏi nhiều tài nguyên hơn so với trang web tĩnh.</li>



<li><strong>Cơ Sở Dữ Liệu</strong>: Kích thước cơ sở dữ liệu và số lượng truy vấn đối với cơ sở dữ liệu cũng quan trọng. Một trang web sử dụng cơ sở dữ liệu lớn và phức tạp sẽ đòi hỏi nhiều tài nguyên hơn.</li>



<li><strong>Cache và Tối Ưu Hóa</strong>: Sử dụng kỹ thuật tối ưu hóa và cache có thể giảm áp lực lên tài nguyên server.</li>



<li><strong>Dịch Vụ Bên Ngoài</strong>: Nếu bạn sử dụng các dịch vụ bên ngoài như CDN (Content Delivery Network) hoặc các dịch vụ quản lý nội dung, có thể giảm áp lực lên server của bạn.</li>



<li><strong>Đánh Giá Hiệu Năng Hệ Thống</strong>: Đánh giá hiệu năng của server hiện tại để xem xét việc nâng cấp.</li>



<li><strong>Dự Đoán Mở Rộng</strong>:Nếu bạn dự định mở rộng website trong tương lai, hãy xem xét các yếu tố mở rộng và dự đoán nhu cầu tài nguyên tương lai.</li>



<li><strong>Thử Nghiệm và Đo Lường</strong>: Thử nghiệm tải và đo lường hiệu suất có thể cung cấp thông tin quan trọng về cách website của bạn phản ứng dưới áp lực.</li>



<li><strong>Chính Sách và Yêu Cầu Kỹ Thuật</strong>: Xác định các chính sách và yêu cầu kỹ thuật cụ thể của bạn, chẳng hạn như thời gian phản hồi tối đa.</li>



<li>&#8230;</li>
</ul>



<h5 id="vay-cau-hinh-phan-cung-bao-nhieu-la-phu-hop" class="wp-block-heading">Vậy cấu hình phần cứng bao nhiêu là phù hợp?</h5>



<p class="wp-block-paragraph">Trước tiên cần xác định số lượng người truy cập trong một ngày cũng như số lượng người online đồng thời trung bình. Bạn có thể sử dụng Google Analytics để thống kê và phân tích dữ liệu người dùng khi truy cập website của bạn.<br>Đối với các loại website load nhẹ chỉ có bài viết, tin tức, hình ảnh vừa phải và có traffic dưới 2000 visit mỗi ngày hoặc website load nặng nhiều bài viết, hình ảnh và có traffic dưới 1000 visit mỗi ngày thì bạn có thể cấu hình tầm 512MB RAM và 1core CPU.<br>Dưới đây là bảng cấu hình tham khảo dành cho bạn dựa theo lượt truy cập.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td>Visits/Day</td><td>RAM</td><td>CPU</td></tr><tr><td>1000 &#8211; 3000</td><td>1 GB</td><td>1 core</td></tr><tr><td>3000-6000</td><td>1-2 GB</td><td>1-2 core</td></tr><tr><td>6000-8000</td><td>2-4 GB</td><td>1-2 core</td></tr><tr><td>&gt;8000</td><td>&gt; 4 GB</td><td>&gt;= 1 core<br></td></tr></tbody></table></figure>
</div>
</div>
</div>
</div>



<p class="wp-block-paragraph">Nên chọn CPU có nhiều nhân (core) cho máy chủ. Số lượng nhân CPU càng nhiều thì nó sẽ càng có lợi cho người sử dụng. CPU nhanh hơn thì máy chủ nhanh hơn, nó giúp cho quá trình sử lý dữ liệu diễn ra nhanh gấp nhiều lần. Hãy luôn ưu tiên CPU nhiều nhân, một CPU có ít nhân nhưng có xung nhịp cao sẽ không tốt bằng một CPU có nhiều nhân với xung nhịp thấp hơn.<br>Đầu tư tối đa RAM cho cấu hình máy chủ. Cấu hình server với bộ nhớ RAM cao giúp sử lý được nhiều dữ liệu cùng một lúc, tránh tình trạng máy tính bị đơ hay treo máy.</p>



<p class="wp-block-paragraph">Đối với những website phát triển nhanh, số lượng dữ liệu lưu trữ ngày càng nhiều dẫn đến database ngày càng tăng. Bạn cần thường xuyên theo dõi mức độ sử dụng tài nguyên RAM, và có kế hoạch nâng cấp khi lượng RAM gần hết vì database càng lớn thì nhu cầu sử dụng RAM càng nhiều.</p>



<h5 id="tong-ket" class="wp-block-heading">Tổng kết</h5>



<p class="wp-block-paragraph">Một máy chủ có thể có cấu hình tối ưu với khoảng 4-8 GB RAM và 2-4 CPU core cho một website với lượng truy cập trung bình. Tuy nhiên, điều này chỉ là một ước lượng tổng quát và bạn nên thử nghiệm trên môi trường thực tế, và dự theo sự thay đổi của các yếu tố mình đã chia sẽ ở trên mà cập nhật lại để đảm bảo website đáp ứng đúng với yêu cầu cụ thể của bạn.</p>



<p class="wp-block-paragraph">Cảm ơn các bạn đã đọc bài viết của mình, chúc mọi người có thêm nhiều kiến thức hay để phục vụ cho dự án!</p>
<p>The post <a href="https://blog.tomosia.com.vn/uoc-tinh-ram-cpu-can-su-dung-cho-mot-website/">Ước tính RAM / CPU cần sử dụng cho một website</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/uoc-tinh-ram-cpu-can-su-dung-cho-mot-website/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>LOL &#8211; LAUGH OUT LOUD</title>
		<link>https://blog.tomosia.com.vn/lol-laugh-out-loud/</link>
					<comments>https://blog.tomosia.com.vn/lol-laugh-out-loud/#comments</comments>
		
		<dc:creator><![CDATA[trang chu]]></dc:creator>
		<pubDate>Thu, 07 Dec 2023 04:14:24 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[smile]]></category>
		<category><![CDATA[always]]></category>
		<category><![CDATA[LOL]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2404</guid>

					<description><![CDATA[<p>&#8220;Một nụ cười bằng mười thang thuốc bổ” là câu nói dân gian được nhiều người nhắc đến&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/lol-laugh-out-loud/">LOL &#8211; LAUGH OUT LOUD</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph" id="viewer-7ip03">&#8220;Một nụ cười bằng mười thang thuốc bổ” là câu nói dân gian được nhiều người nhắc đến từ xa xưa. Cười không chỉ làm mình vui mà còn mang lại niềm vui và năng lượng tích cực cho những người xung quanh.</p>



<p class="wp-block-paragraph" id="viewer-7ip03">Ngày nay khi mà cuộc sống nhộn nhịp hơn thì sẽ đi kèm với nhiều sự căng thẳng, nỗi lo và nhiều áp lực hơn đến từ nhiều khía cạnh khác nhau trong cuộc sống, sự quay cuồng đó đôi khi khiến cho chúng ta bị thiếu vắng đi tiếng cười. </p>



<p class="wp-block-paragraph" id="viewer-7ip03">Nhưng bạn biết không, như 1 loại thuốc giảm đau, nụ cười mang đến cho chúng ta rất nhiều lời ích về sức khỏe và tinh thần. Rất nhiều thông tin bài viết đề cập đến vấn đề này và đây là 4 lợi ích được tổng hợp lại trong blog của NPV mà mình muốn chia sẻ đến mọi người.</p>



<p class="wp-block-paragraph" id="viewer-7ip03">Cười mang lại nhiều lợi ích đáng ngạc nhiên, vì vậy</p>



<h1 id="cu-cuoi-that-to-rat-co-loi" class="wp-block-heading">CỨ CƯỜI THẬT TO – RẤT CÓ LỢI</h1>



<figure class="wp-block-image"><img decoding="async" src="https://qph.cf2.quoracdn.net/main-qimg-8aa49078595d8de4bb557f045f70ab3b-lq" alt="Do people actually laugh a lot after typing LOL? - Quora"/></figure>



<p class="wp-block-paragraph" id="viewer-7ip03">1. Improved short-term memory – Tăng trí nhớ ngắn hạn: nghiên cứu cho thấy cười làm giảm hormone gây stress trong cơ thể, và vì vậy giúp tăng trí nhớ ngắn hạn. Ai hay quên thì cười nhiều vào nhé.</p>



<p class="wp-block-paragraph" id="viewer-d6e4c">2. Enhanced group performance – Giúp tăng cường hiệu quả làm việc nhóm: một nghiên cứu tâm lý cho thấy tính hài hước và những câu chuyện gây cười kích thích sự giao tiếp tích cực trong đội nhóm, làm mọi người bớt căng thẳng với qui trình, qui định, và kích thích những giải pháp mới, sáng tạo. Cười do đó là cách tiếp cận rất hiệu quả giúp môi trường làm việc sáng tạo hơn. Cười kết nối đội ngũ lại với nhau, giúp họ giao tiếp và hỗ trợ nhau tốt hơn.</p>



<p class="wp-block-paragraph" id="viewer-6dqng">3. New friendship – Mở ra những quan hệ bạn bè mới: khi cười, chúng ta trở nên ít phòng thủ hơn, chia sẻ những phút giây cá nhân hơn với người đối diện. Nghiên cứu cho thấy khi chúng ta chia sẻ những thông tin cá nhân, riêng tư, chúng ta đang xây dựng nền tảng quan hệ cá nhân với người đối diện.</p>



<p class="wp-block-paragraph" id="viewer-8fotn">4. Increased pain resistance – Tăng khả năng chịu đựng: theo nghiên cứu, khi cười, ngưỡng chịu đựng đau đớn, khó khăn của con người tăng lên thêm 10% so với bình thường. Đó là lý do vì sao người hay cười thì lạc quan và dễ dàng vượt qua mọi khó khăn thử thách trong đời.</p>



<p class="wp-block-paragraph" id="viewer-aquql">LOL! Chúc các bạn luôn luôn có những giây phút cười thật to trong ngày, luôn có tinh thần thật vui vẻ và tận hưởng cuộc sống hết mình. Cuộc đời sẽ dễ dàng hơn rất nhiều nếu chúng ta cứ là mình, và cứ cười vang.</p>
<p>The post <a href="https://blog.tomosia.com.vn/lol-laugh-out-loud/">LOL &#8211; LAUGH OUT LOUD</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/lol-laugh-out-loud/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Cách sử dụng nhiều tài khoản GitHub trên một thiết bị bằng SSH Key</title>
		<link>https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/</link>
					<comments>https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Thu, 07 Dec 2023 01:35:34 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2379</guid>

					<description><![CDATA[<p>Nhu cầu quản lý nhiều tài khoản GitHub trên cùng một thiết bị là điều mà bất kì&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/">Cách sử dụng nhiều tài khoản GitHub trên một thiết bị bằng SSH Key</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nhu cầu quản lý nhiều tài khoản GitHub trên cùng một thiết bị là điều mà bất kì developer nào cũng sẽ cần. Ai cũng có những account Github khác nhau, phục vụ cho những mục đích khác nhau. Ví dụ như một account mail công ty và một account cho mail cá nhân. Dưới đây là kinh nghiệm mà mình đã sử dụng để chuyển đổi giữa 2 account Github của mình. Các bước cấu hình sẽ lần lượt là:</p>



<h2 id="tao-ssh-key" class="wp-block-heading">Tạo SSH key</h2>



<pre class="wp-block-code"><code>ls -al ~/.ssh</code></pre>



<p class="wp-block-paragraph">Đầu tiên, chúng ta có thể kiểm tra xem liệu chúng ta có bất kỳ SSH key nào hiện có hay không.</p>



<p class="wp-block-paragraph">Nếu đã có, ta có thể dùng các key đó, còn nếu chưa có key nào cả thì có thể tạo bằng lệnh dưới. </p>



<pre class="wp-block-code"><code>ssh-keygen -t rsa -C "email_cua_ban@work-mail.com" -f "ssh_file_name"</code></pre>



<p class="wp-block-paragraph">Ví dụ:</p>



<pre class="wp-block-code"><code>ssh-keygen -t rsa -C "bao.van@tomosia.com" -f "id_rsa_work"</code></pre>



<p class="wp-block-paragraph">Đoạn mã trên sẽ tạo các SSH key và lưu public key có tag <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">bao.van@tomosia.com</mark></code> vào <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">~/.ssh/id_rsa_work.pub</mark></code>.</p>



<p class="wp-block-paragraph">Khi được yêu cầu vị trí lưu SSH key, hãy chấp nhận vị trí mặc định bằng cách nhấn enter. Key private và key public <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code><em>~/.ssh/id_rsa_work.pub</em> </code></mark>sẽ được tạo tại vị trí ssh mặc định<mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code> ~/.ssh/</code></mark>. Chúng ta đã tạo được ssh key cho account phục vụ công việc, tương tự cho email phục vụ mục đích cá nhân. Tôi đặt tên cho ssh key cá nhân là <strong>id_rsa_personal</strong>. Sau khi tạo xong chúng ta sẽ có 2 key dưới:</p>



<pre class="wp-block-code"><code>~/.ssh/id_rsa_personal
~/.ssh/id_rsa_work</code></pre>



<h2 id="them-ssh-key-moi-vao-tai-khoan-github-tuong-ung" class="wp-block-heading">Thêm SSH key mới vào tài khoản GitHub tương ứng</h2>



<p class="wp-block-paragraph">Chúng ta đã có SSH public key và chúng ta sẽ thêm chúng tài khoản GitHub của mình.</p>



<p class="wp-block-paragraph">Sao chép public key <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">pbcopy &lt; ~/.ssh/id_rsa_personal.pub</mark></code> rồi đăng nhập vào tài khoản GitHub cá nhân của bạn:</p>



<ul class="wp-block-list">
<li>Đi tới <em><strong>Setting</strong></em></li>



<li>Chọn <em><strong>SSH Key and GPG</strong></em> từ menu bên trái.</li>



<li>Nhấp vào <em><strong>New SSH Key</strong></em>, cung cấp tiêu đề phù hợp và dán nội dung của SSH key vào editor bên dưới</li>



<li>Nhấp vào <em><strong>Add Key</strong></em> &#8211; <strong>Done</strong>!</li>
</ul>



<p class="wp-block-paragraph">Đối với tài khoản công việc, hãy sử dụng public key tương ứng (<mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>pbcopy &lt; ~/.ssh/id_rsa_work.pub</code></mark>) và lặp lại các bước trên trong tài khoản công việc GitHub của bạn.</p>



<h2 id="dang-ky-ssh-key-voi-ssh-agent" class="wp-block-heading">Đăng ký SSH Key với SSH Agent</h2>



<p class="wp-block-paragraph">Để sử dụng các key, phải đăng ký chúng với ssh agent trên máy của mình. Đảm bảo ssh-agent đang chạy bằng lệnh<code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color"> eval "$(ssh-agent -s)"</mark></code>.</p>



<p class="wp-block-paragraph">Thêm private key vào <em><strong>ssh-agent</strong></em> như sau:</p>



<pre class="wp-block-code"><code>ssh-add ~/.ssh/id_rsa_personal
ssh-add ~/.ssh/id_rsa_work</code></pre>



<p class="wp-block-paragraph">Sau đó, làm cho <strong>ssh-agent </strong>sử dụng các SSH Keys tương ứng cho các SSH Hosts khác nhau bằng cách sử dụng file config cấu hình cho SSH.</p>



<h2 id="tao-tep-cau-hinh-ssh" class="wp-block-heading">Tạo tệp cấu hình SSH</h2>



<p class="wp-block-paragraph">Tệp cấu hình SSH sẽ có tại <em><code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">~/.ssh/config</mark></code></em>. Chỉnh sửa nó nếu nó tồn tại, nếu không chúng ta có thể tạo nó.</p>



<pre class="wp-block-code"><code>cd ~/.ssh/
touch config           // Creates the file if not exists
nano config            // edit file</code></pre>



<p class="wp-block-paragraph">Tạo các mục cấu hình cho các tài khoản GitHub có liên quan tương tự như mục bên dưới trong tệp <em><code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">~/.ssh/config</mark></code></em> của bạn:</p>



<pre class="wp-block-code"><code># Personal account
Host github.com
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_personal
   
# Work account
Host github.com-work
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_work</code></pre>



<p class="wp-block-paragraph"><mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>work</code></mark> là id người dùng GitHub cho tài khoản công việc.</p>



<p class="wp-block-paragraph"><code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">github.com-work</mark></code> là ký hiệu được sử dụng để phân biệt nhiều tài khoản Git. Đảm bảo bạn nhất quán với ký hiệu tên máy chủ mà bạn sử dụng. Điều này có liên quan khi ta clone một repository hoặc set the remote origin cho repository ở local</p>



<p class="wp-block-paragraph">Cấu hình trên yêu cầu ssh-agent:</p>



<p class="wp-block-paragraph">Sử dụng key <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">id_rsa_personal</mark></code> cho bất kỳ URL Git nào sử dụng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>@github.com</code></mark></p>



<p class="wp-block-paragraph">Sử dụng key <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>id_rsa_work</code></mark> cho bất kỳ URL Git nào sử dụng <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">@github.com-work</mark></code></p>



<p class="wp-block-paragraph">Như vậy là ta đã hoàn thành xong việc config để sử dụng 2 tài khoản Github. Thử clone một repository hoặc làm việc với một repo ở local nhé.</p>



<h2 id="clone-repository" class="wp-block-heading">Clone Repository</h2>



<p class="wp-block-paragraph">Khi các cấu hình đã ổn, chúng ta có thể tiếp tục và clone các repository tương ứng. Khi clone, ta chỉ cần sử dụng các Host là github.com cho account personal và github.com-work cho account work. Ví dụ như dưới.</p>



<p class="wp-block-paragraph">Với account cho công việc: </p>



<pre class="wp-block-code"><code>git clone git@github.com-work:TOMOSIA-VIETNAM/tomogpt.git</code></pre>



<p class="wp-block-paragraph">Và account cá nhân:</p>



<pre class="wp-block-code"><code>git clone git@github.com:BaoVanPhu/django-learning.git</code></pre>



<p class="wp-block-paragraph">Thay đổi này được thực hiện tùy thuộc vào <strong>Host</strong> được xác định trong tệp config SSH. Giữa @ và : phải khớp với những gì ta đã cung cấp trong tệp config SSH.</p>



<h2 id="local-repository" class="wp-block-heading">Local Repository</h2>



<h3 id="voi-repository-da-duoc-cloned-truoc-do" class="wp-block-heading">Với repository đã được cloned trước đó:</h3>



<p class="wp-block-paragraph">Ta chỉ cần update lại remote-url như lệnh dưới</p>



<p class="wp-block-paragraph">Với account công việc: </p>



<pre class="wp-block-code"><code>git remote set-url origin git@github.com-work:yamatabitabi/ytb-ec-site.git</code></pre>



<p class="wp-block-paragraph">Tương tự cho account cá nhân 😀</p>



<h3 id="neu-tao-mot-repository-moi-o-local" class="wp-block-heading">Nếu tạo một repository mới ở local:</h3>



<p class="wp-block-paragraph">Khởi tạo Git trong thư mục dự án <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>git init</code></mark>.</p>



<p class="wp-block-paragraph">Tạo một repo mới trong tài khoản GitHub rồi  add Git remote vào repo ở local</p>



<pre class="wp-block-code"><code>git remote add origin git@github.com-work:TOMOSIA-VIETNAM/new_repo.git </code></pre>



<p class="wp-block-paragraph">Sau đó add file và commit rồi push code lên thôi.</p>



<p class="wp-block-paragraph">Account cá nhân thì như bình thường rồi, không có gì phải bàn =))</p>



<p class="wp-block-paragraph">Done!</p>



<h2 id="conclusion" class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Đây là những kinh nghiệm mình đã được đọc và config ở laptop của mình. Hi vọng sẽ có ích cho mọi người.</p>



<p class="wp-block-paragraph">Cảm ơn mọi người đã dành thời gian để đọc. 😀</p>



<p class="wp-block-paragraph"><em>Nguồn: <a href="https://www.freecodecamp.org/news/manage-multiple-github-accounts-the-ssh-way-2dadc30ccaca/" target="_blank" rel="noreferrer noopener">Freecodecamp</a></em></p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/">Cách sử dụng nhiều tài khoản GitHub trên một thiết bị bằng SSH Key</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>Thay đổi thói quen</title>
		<link>https://blog.tomosia.com.vn/thay-doi-thoi-quen/</link>
					<comments>https://blog.tomosia.com.vn/thay-doi-thoi-quen/#comments</comments>
		
		<dc:creator><![CDATA[Minh Ngo]]></dc:creator>
		<pubDate>Tue, 05 Dec 2023 03:23:25 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2261</guid>

					<description><![CDATA[<p>Chắc hẳn khá nhiều bạn đã từng nghe về cuốn sách “Nine Things Successful People Do Differently” rồi&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/thay-doi-thoi-quen/">Thay đổi thói quen</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Chắc hẳn khá nhiều bạn đã từng nghe về cuốn sách “Nine Things Successful People Do Differently” rồi nhỉ? Đây là tác phẩm nổi tiếng của tiến sĩ tâm lý Heidi Grant Halvorson. Nội dung cuốn sách chia sẻ về 9 điều người thành công thường làm – những chiến lược giúp họ có thể xây dựng mục tiêu và đạt được thành công.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="298" height="199" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-5.png" alt="" class="wp-image-2262" style="width:490px;height:auto"/></figure>
</div>


<p class="wp-block-paragraph">Cá nhân mình nghĩ với những ai lười đọc thể loại sách kĩ năng thì chắc chắn đây sẽ là cuốn sách đỡ “ngán” nhất, bởi vì nó được viết ngắn gọn và rất dễ đọc. Trong quyển sách này mỗi chương sách viết về một chiến lược, và cả 9 chiến lược đều dựa trên các nghiên cứu khoa học liên quan. Hiện tại sách vẫn chưa có bản dịch tiếng Việt, nếu mọi người có hứng thú thì có thể tìm đọc ở link dưới:<br>&nbsp;<a href="https://hbr.org/2011/02/nine-things-successful-people">https://hbr.org/2011/02/nine-things-successful-people</a></p>



<p class="wp-block-paragraph">Quay trở lại chủ đề chính, hôm nay mình muốn chia sẻ về 2 trong số 9 chiến lược được đề cập trong sách “Nine Things Successful People Do Differently” mà mình đã từng áp dụng để thay đổi một vài thói quen xấu.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img decoding="async" width="317" height="206" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-6.png" alt="" class="wp-image-2263" style="width:499px;height:auto" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-6.png 317w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-6-300x195.png 300w" sizes="(max-width: 317px) 100vw, 317px" /></figure>
</div>


<ol class="wp-block-list">
<li class="has-medium-font-size"><strong>Phương pháp “Nếu-Thì”  </strong>&#8211; <strong>If-Then (Seize The Moment To Act On Your Goals)</strong></li>
</ol>



<p class="wp-block-paragraph">Phương pháp này hẳn không còn xa lạ với mọi người. Cấu trúc thông thường sẽ là: <em>“NẾU X diễn ra THÌ tôi sẽ làm việc Y” (If X happens, then I will do Y).</em></p>



<p class="wp-block-paragraph"><em>T</em>ip khi sử dùng phương pháp này là hãy xác định rõ thời điểm và địa điểm cần thực hiện hành động, viết cụ thể ra một tờ giấy hoặc sổ tay. Bạn cũng hoàn toàn có thể chèn thêm một hoặc hai hành động khác để tạo thành chuỗi thói quen.</p>



<p class="wp-block-paragraph">Ví dụ:</p>



<p class="wp-block-paragraph"><em>Nếu tôi dậy sớm lúc 6 giờ, thì tôi sẽ trải thảm yoga trong phòng để tập 30p.</em></p>



<p class="wp-block-paragraph"><em>Nếu tôi hoàn thành xong việc tập yoga sau khi dậy, thì tôi sẽ dọn dẹp phòng rồi xuống nhà ăn sáng</em>.</p>



<p class="has-medium-font-size wp-block-paragraph"><strong>2. Tập trung vào điều cần làm, thay vì nghĩ về điều không làm được (Focus On What You Will Do, Not What You Won’t Do)</strong></p>



<p class="wp-block-paragraph">Nghiên cứu chỉ ra rằng chúng ta luôn có xu hướng làm những điều bị cấm đoán. Vì thế, thay vì phớt lờ suy nghĩ muốn làm A, hoặc thúc đẩy bản thân đừng làm A, hãy nghĩ theo hướng <em>“Nên làm B để thay thế A” </em>(What will I do instead?)</p>



<p class="wp-block-paragraph"><br>Hãy cố gắng hạn chế suy nghĩ “KHÔNG ĐƯỢC…” – “không được ăn đồ ngọt”, “không được đi ngủ muộn”, và tìm cho mình những hành động thay thế phù hợp –<em>“nên ăn trái cây nhiều”, “nên đi ngủ ngay sau khi skin care mỗi tối”.</em></p>



<p class="wp-block-paragraph">Tóm lại, kết hợp 2 chiến lược trên thì các bước đơn giản có thể giúp thay đổi thói quen chính là:</p>



<ul class="wp-block-list">
<li>Bước 1: Thay vì đặt ra mục tiêu “dừng làm điều gì đó”, thì hãy tập trung nghĩ về điều thay thế <strong>“mình sẽ làm điều gì khác</strong>”.</li>
</ul>



<ul class="wp-block-list">
<li>Bước 2: Sử dụng mệnh đề Nếu-Thì (If-then) ghi ra cụ thể lúc nào mình cần làm gì và làm ở đâu.</li>
</ul>



<p class="wp-block-paragraph">     Ví dụ:<br>▪　Khi muốn ăn uống healthy ^^<br>Thay vì “Không được phép ăn đồ ngọt”, “Không được ăn vặt” thì sẽ nghĩ là:<br> “Nếu như mình cảm thấy thèm đồ ngọt thì mình sẽ mở tủ lạnh lấy trái cây ra ăn”.</p>



<p class="wp-block-paragraph">“Nếu như cảm thấy “buồn miệng” thì mình sẽ ăn sữa chua cùng các loại hạt Granola”</p>



<p class="wp-block-paragraph">▪ Khi muốn tập ngủ sớm dậy sớm “lành mạnh”　</p>



<p class="wp-block-paragraph">&nbsp;Thay thế “Không được xem youtube trước khi ngủ” bằng:</p>



<p class="wp-block-paragraph">“Nếu như muốn xem hoặc nghe gì đó trước khi ngủ thì mình sẽ bật podcast và úp mặt điện thoại xuống dưới”</p>



<p class="wp-block-paragraph">“Nếu như đã 11h rồi mà vẫn còn chưa muốn ngủ thì mình sẽ bật nhạc nhẹ và đọc một vài trang sách (gây buồn ngủ)” :)))</p>



<p class="wp-block-paragraph">Mọi người thường nói rằng Tôi đã quen làm &#8220;abc&#8221; thì rất khó để thay đổi thành &#8220;xyz&#8221;.&nbsp;</p>



<p class="wp-block-paragraph">Đúng là &#8220;nói thì dễ hơn làm&#8221;, tuy nhiên việc thay đổi <strong>không nhất thiết phải mất thời gian dài, nếu bạn đang có “bad habits” muốn sửa đổi mà chưa thực hiện được, có thể thử 2 bước trên xem sao. </strong>Mình nghĩ là dù có thành công với mục tiêu đã đặt ra hay không thì hình ảnh bản thân mỗi ngày đều nỗ lực để trở thành phiên bản tốt hơn đã rất đẹp rồi.</p>



<p class="wp-block-paragraph">Fighting!</p>
<p>The post <a href="https://blog.tomosia.com.vn/thay-doi-thoi-quen/">Thay đổi thói quen</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/thay-doi-thoi-quen/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>Sức mạnh của sự từ chối</title>
		<link>https://blog.tomosia.com.vn/suc-manh-cua-su-tu-choi/</link>
					<comments>https://blog.tomosia.com.vn/suc-manh-cua-su-tu-choi/#comments</comments>
		
		<dc:creator><![CDATA[Minh Ngo]]></dc:creator>
		<pubDate>Tue, 05 Dec 2023 03:07:25 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[expirence]]></category>
		<category><![CDATA[power]]></category>
		<category><![CDATA[reject]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2267</guid>

					<description><![CDATA[<p>Bỗng dưng một buổi sáng đẹp trời có ai mời bạn tham gia một dự án. Bạn do&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/suc-manh-cua-su-tu-choi/">Sức mạnh của sự từ chối</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bỗng dưng một buổi sáng đẹp trời có ai mời bạn tham gia một dự án. Bạn do dự một xíu bởi vì biết quỹ thời gian của mình đang không dư nhiều. Nhưng nếu từ chối thì sợ họ phật lòng và lỡ mất cơ hội hợp tác. Vì thế cũng nhận lời và nhưng thời gian thì có hạn và bạn nhận ra mình không đủ năng lực để đảm bảo trách nhiệm đã nhận.</p>



<p class="wp-block-paragraph">Hoặc có người bạn thân thất tình rủ đi cà phê chiều cuối tuần. Cùng lúc hội nhóm nào khác có buổi tiệc tối họp mặt cần tham gia. Bỏ cái nào cũng ngại, bỏ bên nhóm thì sợ người ta sau này không rủ mình nữa, nên bạn nhận lời hết. Kết quả ngồi cà phê với bạn thân cứ loay hoay nhắn tin với hội nhóm về bữa tiệc. Bạn thân vẫn còn buồn sầu muốn đi ăn để tâm sự tiếp thì mình lại phải về để đi tiếp “kèo” sau.</p>



<p class="wp-block-paragraph">Chúng ta có xu hướng đồng ý làm nhiều việc, cố gắng làm hài lòng tất cả mọi người. Cuối cùng lại áy náy vì đã không thể làm tốt nhất có thể để đối phương hài lòng. Đó là lý do mà Từ Chối là một kỹ năng cần thiết và tôi nghĩ sẽ cần rất nhiều dũng khí để thực hiện.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="213" height="341" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-7.png" alt="" class="wp-image-2269" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-7.png 213w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/image-7-187x300.png 187w" sizes="auto, (max-width: 213px) 100vw, 213px" /></figure>
</div>


<p class="wp-block-paragraph">Đôi khi chúng ta ngại từ chối vì sợ sẽ làm mất một mối quan hệ xã hội, hoặc sợ đánh mất cơ hội. Nhưng thật ra điều đó chưa chắc đúng. Nhìn kỹ lại hai ví dụ trên, trong công việc càng ôm đồm nhiều việc thì càng khó thực hiện tốt được hết tất cả, dẫn đến có thể làm giảm chất lượng output. Trong khi chỉ cần mình giữ vững giá trị và uy tín thì kể cả có bỏ qua cơ hội này, cơ hội khác vẫn sẽ đến.</p>



<p class="wp-block-paragraph">Còn trong cuộc sống, có thể mình lựa chọn bạn thân (hoặc hội nhóm) trước tùy vào mức độ quan trọng của sự kiện. Có thể bên còn lại sẽ thất vọng xíu, nhưng mình trình bày lý do và có thể sắp xếp lại vào một buổi khác, thì thiết nghĩ cũng không ai trách thêm. Và chúng ta sẽ được tập trung hơn, khoảng thời gian dành ra cho sự lựa chọn đó cũng được trọn vẹn.</p>



<p class="wp-block-paragraph">Lời nói “Không” của chúng ta sẽ phải đối mặt với rất nhiều thách thức. Quan trọng nhất là bạn biết <strong>điều gì là quan trọng ở hiện tại</strong> để có thể từ chối những điều ít có ý nghĩa với bản thân, hoặc những điều mình không có tự tin sẽ làm tốt.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="768" height="513" src="http://blog.tomosia.com.vn/wp-content/uploads/2023/12/32-tinh-huong-tu-choi-va-cach-xu-ly-nhanh-gon-le-bookingres.vn-0907721228.jpeg" alt="" class="wp-image-2302" srcset="https://blog.tomosia.com.vn/wp-content/uploads/2023/12/32-tinh-huong-tu-choi-va-cach-xu-ly-nhanh-gon-le-bookingres.vn-0907721228.jpeg 768w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/32-tinh-huong-tu-choi-va-cach-xu-ly-nhanh-gon-le-bookingres.vn-0907721228-300x200.jpeg 300w, https://blog.tomosia.com.vn/wp-content/uploads/2023/12/32-tinh-huong-tu-choi-va-cach-xu-ly-nhanh-gon-le-bookingres.vn-0907721228-380x254.jpeg 380w" sizes="auto, (max-width: 768px) 100vw, 768px" /></figure>
</div>


<p class="wp-block-paragraph">Còn nếu bạn là người bị từ chối. <strong>Đừng quạo</strong>, hít thở sâu và <strong>lắng nghe</strong> lý do của đối phương. Biết đâu đấy, bạn sẽ bị họ thuyết phục:))) Đùa thôi, có thể họ say NO là vì cảm thấy hiện tại nếu nhận lời thì sẽ không thể nào toàn tâm toàn ý tham gia được, và họ muốn đảm bảo sự tập trung và chất lượng cho những sự lựa chọn của mình. Hãy hiểu và chờ đợi thời điểm thích hợp hơn.</p>



<p class="wp-block-paragraph">Bài viết không đưa ra phương pháp hay tips để từ chối, vì tôi nghĩ mỗi người đều có cách riêng phù hợp với phong cách giao tiếp cá nhân và dẫu sao chính bạn mới là người biết đâu là cách tốt nhất trong tình huống của bạn. Anw, dù là người từ chối hay người bị từ chối, thì cũng đều rất cần bản lĩnh để thuyết phục đối phương/tiếp nhận từ chối.</p>



<p class="wp-block-paragraph">Mạnh mẽ lên, Fighting!</p>
<p>The post <a href="https://blog.tomosia.com.vn/suc-manh-cua-su-tu-choi/">Sức mạnh của sự từ chối</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/suc-manh-cua-su-tu-choi/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title>SOLID Principles</title>
		<link>https://blog.tomosia.com.vn/solid-principles/</link>
					<comments>https://blog.tomosia.com.vn/solid-principles/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Mon, 04 Dec 2023 02:05:40 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[SOLID]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2208</guid>

					<description><![CDATA[<p>Các nguyên tắc SOLID của lập trình hướng đối tượng giúp làm cho các thiết kế hướng đối&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/solid-principles/">SOLID Principles</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Các nguyên tắc <strong>SOLID</strong> của lập trình hướng đối tượng giúp làm cho các thiết kế hướng đối tượng trở nên dễ hiểu, linh hoạt và dễ bảo trì hơn.</p>



<p class="wp-block-paragraph">Chúng cũng giúp dễ dàng tạo mã có thể đọc và kiểm tra được mà chúng ta có thể cùng nhau làm việc ở mọi nơi và mọi lúc cũng như giúp bạn biết cách viết mã tốt nhất</p>



<p class="wp-block-paragraph"><strong>SOLID</strong> là từ viết tắt đại diện cho năm nguyên tắc thiết kế của thiết kế lớp Hướng đối tượng. Những nguyên tắc này là:</p>



<ul class="wp-block-list">
<li><strong>S</strong>&nbsp;&#8211; Single-responsibility Principle</li>



<li><strong>O</strong>&nbsp;&#8211; Open-closed Principle</li>



<li><strong>L</strong>&nbsp;&#8211; Liskov Substitution Principle</li>



<li><strong>I</strong>&nbsp;&#8211; Interface Segregation Principle</li>



<li><strong>D</strong>&nbsp;&#8211; Dependency Inversion Principle</li>
</ul>



<p class="wp-block-paragraph">Mỗi nguyên tắc đóng vai trò là kim chỉ nam để thúc đẩy các phương pháp thiết kế tốt và giúp đảm bảo rằng mã có thể mở rộng, bảo trì và dễ hiểu. Trong bài viết này, chúng ta sẽ khám phá sâu từng nguyên tắc <strong>SOLID</strong> và cách chúng có thể được áp dụng cho <strong>Laravel</strong>.</p>



<h2 id="single-responsibility-principle" class="wp-block-heading"><strong>Single-responsibility Principle</strong></h2>



<p class="wp-block-paragraph">Nguyên tắc trách nhiệm duy nhất, hay <strong>SRP</strong>, tuyên bố rằng một lớp chỉ có một lý do để thay đổi. Nói cách khác, một lớp chỉ nên có một trách nhiệm và tập trung làm tốt một việc. Nguyên tắc này giúp giảm độ phức tạp của mã và giúp bảo trì dễ dàng hơn.</p>



<p class="wp-block-paragraph">Trong <strong>Laravel</strong>, <strong>SRP</strong> có thể được áp dụng bằng cách tạo các lớp nhỏ hơn, tập trung hơn để xử lý các tác vụ cụ thể. Ví dụ, thay vì có một lớp duy nhất xử lý đăng ký và đăng nhập của người dùng, sẽ tốt hơn nếu có các lớp riêng biệt để làm từng việc này.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class User
{
	public function register($data) {
    // Register user logic
  }

  public function login($data) {
    // Login logic
  }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">User</span></span>
<span class="line"><span style="color: #F6F6F4">{</span></span>
<span class="line"><span style="color: #F6F6F4">	</span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">register</span><span style="color: #F6F6F4">($data) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Register user logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">login</span><span style="color: #F6F6F4">($data) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Login logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Thay vào đó, mỗi lớp sẽ có một nhiệm vụ riêng biệt.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class UserRegistration {
  public function register($data) {
    // Register user logic
  }
}

class UserLogin {
  public function login($data) {
    // Login logic
  }
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserRegistration</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">register</span><span style="color: #F6F6F4">($data) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Register user logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserLogin</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">login</span><span style="color: #F6F6F4">($data) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Login logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<h2 id="open-closed-principle-ocp" class="wp-block-heading"><strong>Open/Closed Principle (OCP)</strong></h2>



<p class="wp-block-paragraph">Nguyên tắc đóng mở có thể gây nhầm lẫn vì nó là nguyên tắc hai chiều. Theo định nghĩa của <strong><a href="https://www.freecodecamp.org/news/solid-principles-for-programming-and-software-design/#:~:text=principle.%20According%20to-,Bertrand%20Meyer%27s,-definition%20on%20Wikipedia">Bertrand Meyer</a></strong> trên <a href="https://www.freecodecamp.org/news/solid-principles-for-programming-and-software-design/#:~:text=Meyer%27s%20definition%20on-,Wikipedia,-%2C%20the%20open%2Dclosed">Wikipedia</a>, nguyên tắc đóng mở (<strong>OCP</strong>) nói rằng các thực thể phần mềm (lớp, mô-đun, chức năng, v.v.) phải mở để mở rộng nhưng đóng để sửa đổi.</p>



<p class="wp-block-paragraph">Định nghĩa này có thể gây nhầm lẫn, nhưng một ví dụ và sự làm rõ thêm sẽ giúp bạn hiểu rõ hơn.</p>



<p class="wp-block-paragraph">Có hai thuộc tính chính trong <strong>OCP</strong>:</p>



<ul class="wp-block-list">
<li>Nó có thể <strong>open</strong> &#8211; Điều này có nghĩa là bạn có thể mở rộng những gì mô-đun có thể thực hiện.</li>
</ul>



<ul class="wp-block-list">
<li>Nó <strong>closed</strong> để sửa đổi — Điều này có nghĩa là bạn không thể thay đổi mã nguồn, mặc dù bạn có thể mở rộng hoạt động của một mô-đun hoặc thực thể.</li>
</ul>



<p class="wp-block-paragraph"><strong>OCP</strong> có nghĩa là một lớp, mô-đun, hàm và các thực thể khác có thể mở rộng hành vi của chúng mà không cần sửa đổi mã nguồn. Nói cách khác, một thực thể có thể được mở rộng mà không cần sửa đổi chính thực thể đó. </p>



<p class="wp-block-paragraph">Trong <strong>Laravel</strong>, nguyên tắc này có thể được áp dụng bằng cách sử dụng các interface và các abstract class. Bằng cách xác định interface cho một tác vụ cụ thể, có thể tạo ra nhiều triển khai thực hiện tác vụ đó, mỗi tác vụ có chức năng riêng.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class PaymentMethod {
  public function processPayment($amount) {
    // Payment processing logic
  }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">PaymentMethod</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">processPayment</span><span style="color: #F6F6F4">($amount) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Payment processing logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Thay vào đó:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="interface PaymentMethodInterface {
  public function processPayment($amount);
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">PaymentMethodInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">processPayment</span><span style="color: #F6F6F4">($amount);</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Chúng ta có thể implement để sử dụng và không ảnh hưởng gì đến mã nguồn:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class CreditCardPayment implements PaymentMethodInterface {
  public function processPayment($amount) {
    // Credit card payment processing logic
  }
}

class BankTransferPayment implements PaymentMethodInterface {
  public function processPayment($amount) {
    // Bank transfer payment processing logic
  }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">CreditCardPayment</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">PaymentMethodInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">processPayment</span><span style="color: #F6F6F4">($amount) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Credit card payment processing logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">BankTransferPayment</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">PaymentMethodInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">processPayment</span><span style="color: #F6F6F4">($amount) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #7B7F8B">// Bank transfer payment processing logic</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<h2 id="liskov-substitution-principle-lsp" class="wp-block-heading"><strong>Liskov Substitution Principle (LSP)</strong></h2>



<p class="wp-block-paragraph"><strong>LSP</strong> tuyên bố rằng các đối tượng của siêu lớp có thể được thay thế bằng các đối tượng của lớp con mà không ảnh hưởng đến tính chính xác của chương trình. Nói cách khác, một lớp con phải thay thế cho lớp cha của nó.</p>



<p class="wp-block-paragraph">Trong <strong>Laravel</strong>, nguyên tắc này có thể được áp dụng bằng cách sử dụng tính kế thừa và đa hình. Bằng cách tạo một lớp cơ sở xác định chức năng chung cho một tập hợp các lớp, có thể tạo các lớp con kế thừa từ lớp cơ sở và thêm chức năng độc đáo của riêng chúng.</p>



<p class="wp-block-paragraph">Một ví dụ rất phổ biến là kịch bản hình chữ nhật, hình vuông. Rõ ràng là tất cả các hình vuông đều là hình chữ nhật vì chúng là tứ giác có bốn góc đều là góc vuông. Nhưng không phải hình chữ nhật nào cũng là hình vuông. Để là hình vuông thì các cạnh của nó phải có cùng độ dài.</p>



<p class="wp-block-paragraph">Hãy ghi nhớ điều này, giả sử bạn có một lớp hình chữ nhật để tính diện tích hình chữ nhật và thực hiện các thao tác khác như set màu sắc cho nó</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class Rectangle {
    public function setWidth($width)
		{
        $this-&gt;width = $width;
    }

    public function setHeight($height) 
		{
				$this-&gt;height = $height;
    }

    public function setColor($color)
		{
				// set color processing logic
    }

    public function getArea() 
		{
        return $this-&gt;width * $this-&gt;height;
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Rectangle</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setWidth</span><span style="color: #F6F6F4">($width)</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">width </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $width;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setHeight</span><span style="color: #F6F6F4">($height) </span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">				</span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">height </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $height;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setColor</span><span style="color: #F6F6F4">($color)</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">				</span><span style="color: #7B7F8B">// set color processing logic</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">getArea</span><span style="color: #F6F6F4">() </span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">width </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">height;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Biết rõ rằng tất cả các hình vuông đều là hình chữ nhật, bạn có thể kế thừa các đặc tính của hình chữ nhật. Vì chiều rộng và chiều cao phải giống nhau nên bạn có thể điều chỉnh nó:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class Square extends Rectangle {
    public function setWidth($width)
		{
        $this-&gt;width = $width;
        $this-&gt;height = $width;
    }
		public function setHeight($height)
		{
        $this-&gt;width = $height;
        $this-&gt;height = $height;
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Square</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">extends</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Rectangle</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setWidth</span><span style="color: #F6F6F4">($width)</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">width </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $width;</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">height </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $width;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">		</span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setHeight</span><span style="color: #F6F6F4">($height)</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">width </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $height;</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">height </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $height;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Nhìn vào ví dụ, nó sẽ hoạt động bình thường:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="$rectangle = new Rectangle();
$rectangle-&gt;setWidth(10);
$rectangle-&gt;setHeight(5);
$area = $rectangle-&gt;getArea());
echo $area; // 50" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">$rectangle </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Rectangle</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">$rectangle</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setWidth</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$rectangle</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setHeight</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">5</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$area </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $rectangle</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getArea</span><span style="color: #F6F6F4">());</span></span>
<span class="line"><span style="color: #97E1F1">echo</span><span style="color: #F6F6F4"> $area; </span><span style="color: #7B7F8B">// 50</span></span></code></pre></div>



<p class="wp-block-paragraph">Ở phần trên, bạn sẽ nhận thấy rằng một hình chữ nhật được tạo và chiều rộng và chiều cao được đặt. Sau đó, bạn có thể tính toán diện tích chính xác.</p>



<p class="wp-block-paragraph">Nhưng theo <strong>LSP</strong>, bạn muốn các đối tượng của lớp con của bạn hoạt động giống như các đối tượng của lớp cha của bạn. Có nghĩa là nếu bạn thay thế Hình chữ nhật bằng Hình vuông, mọi thứ vẫn hoạt động tốt:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="$square = new Square();
$square-&gt;setWidth(10);
$square-&gt;setHeight(5);" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">$square </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Square</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">$square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setWidth</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setHeight</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">5</span><span style="color: #F6F6F4">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Bạn sẽ nhận được 100, vì setWidth(10) được cho là đặt cả chiều rộng và chiều cao thành 10. Nhưng vì setHeight(5), giá trị này sẽ trả về 25.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="$square = new Square();
$square-&gt;setWidth(10);
$square-&gt;setHeight(5);
$area = $square-&gt;getArea());
echo $area; // 25" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F6F6F4">$square </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Square</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">$square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setWidth</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">10</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setHeight</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">5</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$area </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getArea</span><span style="color: #F6F6F4">());</span></span>
<span class="line"><span style="color: #97E1F1">echo</span><span style="color: #F6F6F4"> $area; </span><span style="color: #7B7F8B">// 25</span></span></code></pre></div>



<p class="wp-block-paragraph">Điều này phá vỡ <strong>LSP</strong>. Đối tượng hình vuông lớp con không thể thay thế đối tượng hình chữ nhật siêu lớp để tính diện tích. Để khắc phục điều này, cần có một lớp chung cho tất cả các hình dạng sẽ chứa tất cả các phương thức chung mà bạn muốn các đối tượng của lớp con của mình có quyền truy cập. Sau đó, đối với các phương thức riêng lẻ, bạn tạo một lớp riêng cho hình chữ nhật và hình vuông</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class Shape {
    public function setColor($color)
		{
        $this-&gt;color = $color;
    }
    public function getColor()
		{
        return $this-&gt;color;
    }
}

class Rectangle extends Shape {
    public function setWidth($width)
		{
        $this-&gt;width = $width;
    }
    public function setHeight($height) {
        $this-&gt;height = $height;
    }
    public function getArea() {
        return $this-&gt;width * $this-&gt;height;
    }
}

class Square extends Shape {
    public function setSide($side) {
        $this-&gt;side = $side;
    }
    public function getArea() {
        return $this-&gt;side * $this-&gt;side;
    }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Shape</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setColor</span><span style="color: #F6F6F4">($color)</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">color </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $color;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">getColor</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">color;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Rectangle</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">extends</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Shape</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setWidth</span><span style="color: #F6F6F4">($width)</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">width </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $width;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setHeight</span><span style="color: #F6F6F4">($height) {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">height </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $height;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">getArea</span><span style="color: #F6F6F4">() {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">width </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">height;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Square</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">extends</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Shape</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">setSide</span><span style="color: #F6F6F4">($side) {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">side </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $side;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">getArea</span><span style="color: #F6F6F4">() {</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">side </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">side;</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Bằng cách này, bạn có thể đặt màu và lấy màu bằng cách sử dụng siêu lớp hoặc lớp con:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="// superclass
$shape = new Shape();
$shape-&gt;setColor('red');
$color = $shape-&gt;getColor());
echo $color; // red

// subclass
$rectangle = new Rectangle();
$rectangle-&gt;setColor('green');
$rectangleColor = $rectangle-&gt;getColor());
echo $rectangleColor; // green

// subclass
$square = new Square();
$square-&gt;setColor('blue');
$squareColor = $square-&gt;getColor());
echo $squareColor; // blue" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">// superclass</span></span>
<span class="line"><span style="color: #F6F6F4">$shape </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Shape</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">$shape</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setColor</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">red</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$color </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $shape</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getColor</span><span style="color: #F6F6F4">());</span></span>
<span class="line"><span style="color: #97E1F1">echo</span><span style="color: #F6F6F4"> $color; </span><span style="color: #7B7F8B">// red</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// subclass</span></span>
<span class="line"><span style="color: #F6F6F4">$rectangle </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Rectangle</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">$rectangle</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setColor</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">green</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$rectangleColor </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $rectangle</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getColor</span><span style="color: #F6F6F4">());</span></span>
<span class="line"><span style="color: #97E1F1">echo</span><span style="color: #F6F6F4"> $rectangleColor; </span><span style="color: #7B7F8B">// green</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">// subclass</span></span>
<span class="line"><span style="color: #F6F6F4">$square </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">Square</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">$square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">setColor</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">blue</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">);</span></span>
<span class="line"><span style="color: #F6F6F4">$squareColor </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $square</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getColor</span><span style="color: #F6F6F4">());</span></span>
<span class="line"><span style="color: #97E1F1">echo</span><span style="color: #F6F6F4"> $squareColor; </span><span style="color: #7B7F8B">// blue</span></span></code></pre></div>



<h2 id="interface-segregation-principle-isp" class="wp-block-heading"><strong>Interface Segregation Principle (ISP)</strong></h2>



<p class="wp-block-paragraph"><strong>ISP</strong> tuyên bố rằng các lớp không nên bị buộc phải triển khai các giao diện mà chúng không sử dụng. Nguyên tắc này giúp giảm độ phức tạp của mã và giúp bảo trì dễ dàng hơn.</p>



<p class="wp-block-paragraph">Trong <strong>Laravel</strong>, nguyên tắc này có thể được áp dụng bằng cách tạo các giao diện nhỏ hơn, tập trung hơn để xác định các nhiệm vụ cụ thể.</p>



<p class="wp-block-paragraph">Ví dụ: giả sử bạn có một giao diện xác định các phương thức để vẽ các hình dạng cụ thể.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="interface ShapeInterface {
    public function calculateArea();
    public function calculateVolume();
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateVolume</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Khi bất kỳ lớp nào triển khai giao diện này, tất cả các phương thức phải được xác định ngay cả khi bạn không sử dụng chúng hoặc nếu chúng không áp dụng cho lớp đó.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class Square implements ShapeInterface {
    public function calculateArea()
		{
        //...
    }
    public function calculateVolume()
		{
        //...
    }  
}

class Cuboid implements ShapeInterface {
    public function calculateArea()
		{
        //...
    }
    public function calculateVolume()
		{
        //...
    }    
}

class Rectangle implements ShapeInterface {
    public function calculateArea()
		{
        //...
    }
    public function calculateVolume()
		{
        //...
    }   
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Square</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateVolume</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }  </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Cuboid</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateVolume</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }    </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Rectangle</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateVolume</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }   </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Nhận thấy rằng chúng ta không thể tính thể tích của hình vuông hoặc hình chữ nhật. Vì lớp này triển khai giao diện nên bạn cần xác định tất cả các phương thức, ngay cả những phương thức bạn không sử dụng hoặc không cần.</p>



<p class="wp-block-paragraph">Thay vào đó, ta nên tách nhỏ interface ra:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="interface ShapeInterface {
    public function calculateArea();
}

interface ThreeDimensionalShapeInterface {
    public function calculateArea();
    public function calculateVolume();
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">interface</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ThreeDimensionalShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateVolume</span><span style="color: #F6F6F4">();</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Bây giờ bạn có thể triển khai giao diện cụ thể hoạt động với từng lớp.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class Square implements ShapeInterface {
    public function calculateArea()
		{
        //...
    } 
}

class Cuboid implements ThreeDimensionalShapeInterface {
    public function calculateArea()
		{
        //...
    }
    public function calculateVolume()
		{
        //...
    }    
}

class Rectangle implements ShapeInterface {
    public function calculateArea()
		{
        //...
    }  
}
" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Square</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    } </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Cuboid</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ThreeDimensionalShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateVolume</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }    </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">Rectangle</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">implements</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">ShapeInterface</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">calculateArea</span><span style="color: #F6F6F4">()</span></span>
<span class="line"><span style="color: #F6F6F4">		{</span></span>
<span class="line"><span style="color: #F6F6F4">        </span><span style="color: #7B7F8B">//...</span></span>
<span class="line"><span style="color: #F6F6F4">    }  </span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span>
<span class="line"></span></code></pre></div>



<h2 id="dependency-inversion-principle-dip" class="wp-block-heading"><strong>Dependency Inversion Principle (DIP)</strong></h2>



<p class="wp-block-paragraph"><strong>DIP</strong> nêu rõ rằng các mô-đun cấp cao không nên phụ thuộc vào các mô-đun cấp thấp, mà cả hai đều phải phụ thuộc vào sự trừu tượng hóa. Nguyên tắc này giúp giảm sự ghép nối giữa các mô-đun và giúp việc duy trì và mở rộng mã dễ dàng hơn.</p>



<p class="wp-block-paragraph">Theo <a href="https://en.wikipedia.org/wiki/Dependency_inversion_principle">Wikipedia</a>, nguyên tắc này nêu rõ rằng:</p>



<ul class="wp-block-list">
<li>Các mô-đun cấp cao không được nhập bất cứ thứ gì từ các mô-đun cấp thấp. Cả hai nên phụ thuộc vào sự trừu tượng (ví dụ: giao diện).</li>



<li>Sự trừu tượng phải độc lập với các chi tiết. Chi tiết (triển khai cụ thể) sẽ phụ thuộc vào sự trừu tượng.</li>
</ul>



<p class="wp-block-paragraph">Trong <strong>Laravel</strong>, nguyên tắc này có thể được áp dụng bằng cách sử dụng <strong>dependency injection</strong>. Bằng cách xác định các phần phụ thuộc dưới dạng trừu tượng thay vì triển khai cụ thể, có thể thay đổi cách triển khai phần phụ thuộc mà không ảnh hưởng đến mã phụ thuộc vào nó.</p>



<p class="wp-block-paragraph">Thay vì ta triển khai cụ thể:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:8.4296875px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class UserController {
  public function showProfile(int|string $id) {
    $userRepository = new UserRepository;
    $user = $userRepository-&gt;getUser($id);

    return view('user.profile', ['user' =&gt; $user]);
  }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserController</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">showProfile</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">int</span><span style="color: #F6F6F4">|</span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> $id) {</span></span>
<span class="line"><span style="color: #F6F6F4">    $userRepository </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">new</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1; font-style: italic">UserRepository</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #F6F6F4">    $user </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $userRepository</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getUser</span><span style="color: #F6F6F4">($id);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">view</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">user.profile</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span><span style="color: #62E884"> </span><span style="color: #F6F6F4">[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">user</span><span style="color: #DEE492">&#39;</span><span style="color: #62E884"> </span><span style="color: #F286C4">=&gt;</span><span style="color: #62E884"> </span><span style="color: #F6F6F4">$user]);</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Thì ta có thể xác định phần phụ thuộc dưới dạng trừu tượng:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:16.859375px;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#333545;color:#ebebe6">PHP</span><span role="button" tabindex="0" data-code="class UserController {
  protected $userRepository;

  public function __construct(UserRepositoryInterface $userRepository) {
    $this-&gt;userRepository = $userRepository;
  }

  public function showProfile(int|string $id) {
    $user = $this-&gt;userRepository-&gt;getUser($id);

    return view('user.profile', ['user' =&gt; $user]);
  }
}" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">class</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">UserController</span><span style="color: #F6F6F4"> {</span></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">protected</span><span style="color: #F6F6F4"> $userRepository;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #97E1F1">__construct</span><span style="color: #F6F6F4">(</span><span style="color: #97E1F1; font-style: italic">UserRepositoryInterface</span><span style="color: #F6F6F4"> $userRepository) {</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">userRepository </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> $userRepository;</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">  </span><span style="color: #F286C4">public</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">function</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">showProfile</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">int</span><span style="color: #F6F6F4">|</span><span style="color: #F286C4">string</span><span style="color: #F6F6F4"> $id) {</span></span>
<span class="line"><span style="color: #F6F6F4">    $user </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE; font-style: italic">$this</span><span style="color: #F286C4">-&gt;</span><span style="color: #F6F6F4">userRepository</span><span style="color: #F286C4">-&gt;</span><span style="color: #62E884">getUser</span><span style="color: #F6F6F4">($id);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">return</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">view</span><span style="color: #F6F6F4">(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">user.profile</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">,</span><span style="color: #62E884"> </span><span style="color: #F6F6F4">[</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">user</span><span style="color: #DEE492">&#39;</span><span style="color: #62E884"> </span><span style="color: #F286C4">=&gt;</span><span style="color: #62E884"> </span><span style="color: #F6F6F4">$user]);</span></span>
<span class="line"><span style="color: #F6F6F4">  }</span></span>
<span class="line"><span style="color: #F6F6F4">}</span></span></code></pre></div>



<h2 id="advantages-of-solid" class="wp-block-heading">Advantages of SOLID</h2>



<p class="wp-block-paragraph">Sử dụng các nguyên tắc <strong>SOLID</strong> trong phát triển phần mềm có một số lợi ích:</p>



<ul class="wp-block-list">
<li><strong>Tăng khả năng bảo trì:</strong> Các nguyên tắc <strong>SOLID</strong> giúp tạo mã dễ bảo trì và sửa đổi hơn theo thời gian. Khi mỗi lớp hoặc mô-đun có một trách nhiệm duy nhất và tuân theo Nguyên tắc Mở/Đóng, các thay đổi có thể được thực hiện mà không ảnh hưởng đến các phần khác của mã.</li>



<li><strong>Tăng khả năng kiểm tra:</strong> Nguyên tắc <strong>SOLID</strong> cũng giúp kiểm tra mã dễ dàng hơn. Mã tuân theo Nguyên tắc trách nhiệm duy nhất thường dễ kiểm tra hơn vì có ít sự phụ thuộc hơn và ít tác dụng phụ có thể xảy ra hơn.</li>



<li><strong>Tăng tính linh hoạt:</strong> Bằng cách tuân thủ Nguyên tắc Mở/Đóng, bạn có thể tạo mã linh hoạt và có khả năng mở rộng hơn. Khi cần thêm chức năng mới, bạn có thể làm như vậy bằng cách thêm các lớp hoặc giao diện mới thay vì sửa đổi mã hiện có.</li>



<li><strong>Tổ chức mã tốt hơn:</strong> Bằng cách tuân theo các nguyên tắc <strong>SOLID</strong>, bạn có thể tổ chức mã của mình tốt hơn và làm cho các nhà phát triển khác dễ hiểu hơn. Mã được tổ chức tốt và tuân theo các mẫu thiết kế rõ ràng sẽ dễ bảo trì và mở rộng hơn.</li>
</ul>



<h2 id="conclusion" class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph"><strong>SOLID</strong> là một tập hợp các nguyên tắc thiết kế giúp thúc đẩy các phương pháp thiết kế tốt và đảm bảo rằng mã có thể mở rộng, bảo trì và dễ hiểu. Bằng cách áp dụng những nguyên tắc này trong Laravel, các nhà phát triển có thể tạo mã mạnh mẽ, có thể bảo trì và dễ mở rộng quy mô.</p>



<p class="wp-block-paragraph">Cảm ơn mọi người đã dành thời gian để đọc 🙏</p>
<p>The post <a href="https://blog.tomosia.com.vn/solid-principles/">SOLID Principles</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/solid-principles/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
	</channel>
</rss>
