{"id":22,"date":"2025-07-22T02:48:27","date_gmt":"2025-07-22T02:48:27","guid":{"rendered":"https:\/\/kienthucmo.com\/?p=22"},"modified":"2025-12-07T11:06:43","modified_gmt":"2025-12-07T04:06:43","slug":"solid-nguyen-ly-thiet-ke-phan-mem-huong-doi-tuong-ben-vung","status":"publish","type":"post","link":"https:\/\/kienthucmo.com\/vi\/solid-nguyen-ly-thiet-ke-phan-mem-huong-doi-tuong-ben-vung\/","title":{"rendered":"SOLID l\u00e0 g\u00ec? Nguy\u00ean l\u00fd ho\u1ea1t \u0111\u1ed9ng v\u00e0 c\u00e1ch \u00e1p d\u1ee5ng v\u00e0o th\u1ef1c ti\u1ec5n"},"content":{"rendered":"\n<p>Trong qu\u00e1 tr\u00ecnh x\u00e2y d\u1ef1ng ph\u1ea7n m\u1ec1m, ai c\u0169ng mong mu\u1ed1n t\u1ea1o ra nh\u1eefng s\u1ea3n ph\u1ea9m kh\u00f4ng ch\u1ec9 v\u1eadn h\u00e0nh m\u01b0\u1ee3t m\u00e0 \u1edf th\u1eddi \u0111i\u1ec3m hi\u1ec7n t\u1ea1i m\u00e0 c\u00f2n \u0111\u1ee7 linh ho\u1ea1t \u0111\u1ec3 th\u00edch \u1ee9ng v\u00e0 ph\u00e1t tri\u1ec3n trong t\u01b0\u01a1ng lai. Th\u1ebf nh\u01b0ng, n\u1ebfu thi\u1ebfu \u0111\u1ecbnh h\u01b0\u1edbng thi\u1ebft k\u1ebf ngay t\u1eeb nh\u1eefng d\u00f2ng code \u0111\u1ea7u ti\u00ean, h\u1ec7 th\u1ed1ng r\u1ea5t d\u1ec5 r\u01a1i v\u00e0o v\u00f2ng xo\u00e1y ph\u1ee9c t\u1ea1p, kh\u00f3 m\u1edf r\u1ed9ng v\u00e0 t\u1ed1n k\u00e9m khi b\u1ea3o tr\u00ec.<\/p>\n\n\n\n<p>\u0110\u00f3 l\u00e0 l\u00fd do c\u00e1c l\u1eadp tr\u00ecnh vi\u00ean t\u00ecm \u0111\u1ebfn nh\u1eefng b\u1ed9 nguy\u00ean t\u1eafc thi\u1ebft k\u1ebf \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1ed9ng \u0111\u1ed3ng ki\u1ec3m ch\u1ee9ng qua th\u1eddi gian. V\u00e0 trong s\u1ed1 nh\u1eefng kim ch\u1ec9 nam \u1ea5y, SOLID n\u1ed5i l\u00ean nh\u01b0 m\u1ed9t n\u1ec1n t\u1ea3ng c\u1ed1t l\u00f5i, gi\u00fap ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m tr\u1edf n\u00ean r\u00f5 r\u00e0ng, d\u1ec5 m\u1edf r\u1ed9ng v\u00e0 lu\u00f4n duy tr\u00ec \u0111\u01b0\u1ee3c s\u1ef1 \u1ed5n \u0111\u1ecbnh b\u1ec1n v\u1eefng.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. SOLID l\u00e0 g\u00ec?<\/h2>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-full\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1280\" height=\"720\" data-id=\"603\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/1699294649673.png\" alt=\"Solid l\u00e0 g\u00ec\" class=\"wp-image-603\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/1699294649673.png 1280w, https:\/\/kienthucmo.com\/wp-content\/uploads\/1699294649673-300x169.png 300w, https:\/\/kienthucmo.com\/wp-content\/uploads\/1699294649673-1024x576.png 1024w, https:\/\/kienthucmo.com\/wp-content\/uploads\/1699294649673-768x432.png 768w\" sizes=\"(max-width: 1280px) 100vw, 1280px\" \/><\/figure>\n<\/figure>\n\n\n\n<p><strong>SOLID<\/strong> l\u00e0 t\u1eeb vi\u1ebft t\u1eaft c\u1ee7a 5 nguy\u00ean l\u00fd thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>S \u2013 Single Responsibility Principle<\/strong> (Nguy\u00ean l\u00fd tr\u00e1ch nhi\u1ec7m \u0111\u01a1n)<\/li>\n\n\n\n<li><strong>O \u2013 Open\/Closed Principle<\/strong> (Nguy\u00ean l\u00fd \u0111\u00f3ng\/m\u1edf)<\/li>\n\n\n\n<li><strong>L \u2013 Liskov Substitution Principle<\/strong> (Nguy\u00ean l\u00fd thay th\u1ebf Liskov)<\/li>\n\n\n\n<li><strong>I \u2013 Interface Segregation Principle<\/strong> (Nguy\u00ean l\u00fd ph\u00e2n t\u00e1ch giao di\u1ec7n)<\/li>\n\n\n\n<li><strong>D \u2013 Dependency Inversion Principle<\/strong> (Nguy\u00ean l\u00fd \u0111\u1ea3o ng\u01b0\u1ee3c ph\u1ee5 thu\u1ed9c)<\/li>\n<\/ul>\n\n\n\n<p>\u0110\u01b0\u1ee3c gi\u1edbi thi\u1ec7u b\u1edfi Robert C. Martin (Uncle Bob) v\u00e0 ph\u1ed5 bi\u1ebfn trong c\u1ed9ng \u0111\u1ed3ng Agile, b\u1ed9 nguy\u00ean t\u1eafc n\u00e0y ra \u0111\u1eddi nh\u1eb1m gi\u00fap ph\u1ea7n m\u1ec1m d\u1ec5 b\u1ea3o tr\u00ec, d\u1ec5 m\u1edf r\u1ed9ng, d\u1ec5 ki\u1ec3m th\u1eed v\u00e0 gi\u1ea3m s\u1ef1 ph\u1ee5 thu\u1ed9c ch\u1eb7t ch\u1ebd gi\u1eefa c\u00e1c th\u00e0nh ph\u1ea7n.<br>D\u00f9 b\u1ea1n l\u1eadp tr\u00ecnh b\u1eb1ng Java, C#, Python hay b\u1ea5t k\u1ef3 ng\u00f4n ng\u1eef OOP n\u00e0o, SOLID v\u1eabn l\u00e0 n\u1ec1n t\u1ea3ng quan tr\u1ecdng \u0111\u1ec3 x\u00e2y d\u1ef1ng h\u1ec7 th\u1ed1ng c\u00f3 c\u1ea5u tr\u00fac r\u00f5 r\u00e0ng v\u00e0 \u201cs\u1ed1ng kh\u1ecfe\u201d l\u00e2u d\u00e0i.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Nguy\u00ean l\u00fd ho\u1ea1t \u0111\u1ed9ng c\u1ee7a SOLID<\/h2>\n\n\n\n<p>Tr\u01b0\u1edbc khi \u0111i s\u00e2u v\u00e0o t\u1eebng nguy\u00ean l\u00fd, h\u00e3y nh\u1edb r\u1eb1ng SOLID kh\u00f4ng ph\u1ea3i l\u00e0 nh\u1eefng quy t\u1eafc t\u00e1ch bi\u1ec7t, m\u00e0 l\u00e0 m\u1ed9t b\u1ed9 nguy\u00ean t\u1eafc b\u1ed5 tr\u1ee3 l\u1eabn nhau.<br>M\u1ed7i nguy\u00ean l\u00fd gi\u1ea3i quy\u1ebft m\u1ed9t kh\u00eda c\u1ea1nh trong thi\u1ebft k\u1ebf ph\u1ea7n m\u1ec1m, nh\u01b0ng khi k\u1ebft h\u1ee3p l\u1ea1i, ch\u00fang t\u1ea1o th\u00e0nh m\u1ed9t n\u1ec1n t\u1ea3ng v\u1eefng ch\u1eafc gi\u00fap code v\u1eeba d\u1ec5 \u0111\u1ecdc, v\u1eeba d\u1ec5 m\u1edf r\u1ed9ng v\u00e0 b\u1ea3o tr\u00ec.<\/p>\n\n\n\n<p>Gi\u1edd ch\u00fang ta s\u1ebd l\u1ea7n l\u01b0\u1ee3t kh\u00e1m ph\u00e1 5 nguy\u00ean l\u00fd n\u00e0y \u2013 b\u1eaft \u0111\u1ea7u t\u1eeb ch\u1eef <strong>S<\/strong> v\u00e0 k\u1ebft th\u00fac \u1edf <strong>D<\/strong> \u2013 \u0111\u1ec3 xem ch\u00fang ho\u1ea1t \u0111\u1ed9ng th\u1ebf n\u00e0o v\u00e0 mang l\u1ea1i l\u1ee3i \u00edch g\u00ec trong th\u1ef1c t\u1ebf.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/i.pinimg.com\/736x\/8f\/bb\/9b\/8fbb9b96dd3db22d3f5a7bf85080fd2b.jpg\" alt=\"5 nguyen tac thiet ke solid\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 Single Responsibility Principle (SRP) \u2013 Nguy\u00ean l\u00fd tr\u00e1ch nhi\u1ec7m \u0111\u01a1n<\/h3>\n\n\n\n<p><strong><em>M\u1ed9t class ch\u1ec9 n\u00ean c\u00f3 m\u1ed9t l\u00fd do \u0111\u1ec3 thay \u0111\u1ed5i.<\/em><\/strong><\/p>\n\n\n\n<p>Hi\u1ec3u \u0111\u01a1n gi\u1ea3n: M\u1ed7i class n\u00ean ch\u1ec9 \u0111\u1ea3m nh\u1eadn m\u1ed9t tr\u00e1ch nhi\u1ec7m duy nh\u1ea5t, v\u00e0 m\u1ecdi thay \u0111\u1ed5i trong class \u0111\u00f3 ch\u1ec9 n\u00ean \u0111\u1ebfn t\u1eeb m\u1ed9t ph\u00eda duy nh\u1ea5t.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 vi ph\u1ea1m SRP:<\/strong><\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class Invoice:\n    def __init__(self, customer: str, amount: float):\n        self.customer = customer\n        self.amount = amount\n\n    # Responsibility: manage invoice data\n    def get_amount(self) -> float:\n        return self.amount\n\n    # Additional responsibility: calculate tax\n    def calculate_tax(self) -> float:\n        return self.amount * 0.1  # 10% VAT\n\n    # Additional responsibility: print invoice details\n    def print_invoice(self) -> None:\n        print(f\"Customer: {self.customer}\")\n        print(f\"Amount: {self.amount}\")\n        print(f\"Tax: {self.calculate_tax()}\")\n\n\n# Example usage\ninvoice = Invoice(\"Alice\", 1000.0)\ninvoice.print_invoice()\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #8FBCBB\">Invoice<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">__init__<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">customer<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">str<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #D8DEE9\">amount<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">float<\/span><span style=\"color: #ECEFF4\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">customer <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> customer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">amount <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> amount<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Responsibility: manage invoice data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">get_amount<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">-&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">float<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">amount<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Additional responsibility: calculate tax<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">calculate_tax<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">-&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">float<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">amount <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0.1<\/span><span style=\"color: #D8DEE9FF\">  <\/span><span style=\"color: #616E88\"># 10% VAT<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #616E88\"># Additional responsibility: print invoice details<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">def<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">print_invoice<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">-&gt;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">None<\/span><span style=\"color: #ECEFF4\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">f<\/span><span style=\"color: #A3BE8C\">&quot;Customer: <\/span><span style=\"color: #EBCB8B\">{<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">customer<\/span><span style=\"color: #EBCB8B\">}<\/span><span style=\"color: #A3BE8C\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">f<\/span><span style=\"color: #A3BE8C\">&quot;Amount: <\/span><span style=\"color: #EBCB8B\">{<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">amount<\/span><span style=\"color: #EBCB8B\">}<\/span><span style=\"color: #A3BE8C\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #81A1C1\">f<\/span><span style=\"color: #A3BE8C\">&quot;Tax: <\/span><span style=\"color: #EBCB8B\">{<\/span><span style=\"color: #81A1C1\">self<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">calculate_tax<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #EBCB8B\">}<\/span><span style=\"color: #A3BE8C\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #616E88\"># Example usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">invoice <\/span><span style=\"color: #81A1C1\">=<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">Invoice<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Alice<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">1000.0<\/span><span style=\"color: #ECEFF4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">invoice<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">print_invoice<\/span><span style=\"color: #ECEFF4\">()<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>V\u1ea5n \u0111\u1ec1:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Class <code>Invoice<\/code> v\u1eeba qu\u1ea3n l\u00fd d\u1eef li\u1ec7u, v\u1eeba t\u00ednh thu\u1ebf, v\u1eeba in h\u00f3a \u0111\u01a1n.<\/li>\n\n\n\n<li>N\u1ebfu thay \u0111\u1ed5i c\u00e1ch t\u00ednh thu\u1ebf ho\u1eb7c c\u00e1ch in, ta ph\u1ea3i s\u1eeda tr\u1ef1c ti\u1ebfp <code>Invoice<\/code>, vi ph\u1ea1m SRP.<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c1p d\u1ee5ng SRP<\/strong><\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Represents invoice data\npublic class Invoice {\n    private String customer;\n    private double amount;\n\n    public Invoice(String customer, double amount) {\n        this.customer = customer;\n        this.amount = amount;\n    }\n\n    public String getCustomer() {\n        return customer;\n    }\n\n    public double getAmount() {\n        return amount;\n    }\n}\n\n\/\/ Handles tax calculation logic\npublic class TaxCalculator {\n    public double calculateTax(Invoice invoice) {\n        return invoice.getAmount() * 0.1; \/\/ 10% VAT\n    }\n}\n\n\/\/ Responsible for printing invoice details\npublic class InvoicePrinter {\n    public void print(Invoice invoice, double tax) {\n        System.out.println(\"Customer: \" + invoice.getCustomer());\n        System.out.println(\"Amount: \" + invoice.getAmount());\n        System.out.println(\"Tax: \" + tax);\n    }\n}\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Represents invoice data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Invoice <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private String customer;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private double amount;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">Invoice<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String customer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> double amount<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">customer = customer;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">amount = amount;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public String <\/span><span style=\"color: #88C0D0\">getCustomer<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> customer;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public double <\/span><span style=\"color: #88C0D0\">getAmount<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> amount;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Handles tax calculation logic<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> TaxCalculator <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public double <\/span><span style=\"color: #88C0D0\">calculateTax<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Invoice invoice<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> invoice<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getAmount<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">0.1<\/span><span style=\"color: #D8DEE9FF\">; <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #81A1C1\">%<\/span><span style=\"color: #D8DEE9FF\"> VAT<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Responsible <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> printing invoice details<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> InvoicePrinter <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">Invoice invoice<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> double tax<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Customer: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> invoice<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getCustomer<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Amount: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> invoice<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getAmount<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Tax: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> tax<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u0110i\u1ec3m t\u1ed1t h\u01a1n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Invoice<\/code> ch\u1ec9 qu\u1ea3n l\u00fd d\u1eef li\u1ec7u.<\/li>\n\n\n\n<li><code>TaxCalculator<\/code> ch\u1ec9 lo t\u00ednh thu\u1ebf.<\/li>\n\n\n\n<li><code>InvoicePrinter<\/code> ch\u1ec9 lo in \u1ea5n.<\/li>\n\n\n\n<li>Thay \u0111\u1ed5i logic \u1edf \u0111\u00e2u ch\u1ec9 c\u1ea7n s\u1eeda \u0111\u00fang n\u01a1i \u0111\u00f3, kh\u00f4ng \u1ea3nh h\u01b0\u1edfng ph\u1ea7n kh\u00e1c.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.2. Open\/Closed Principle (OCP) \u2013 Nguy\u00ean l\u00fd \u0111\u00f3ng\/m\u1edf<\/h3>\n\n\n\n<p><strong><em>Module n\u00ean \u0111\u01b0\u1ee3c m\u1edf \u0111\u1ec3 m\u1edf r\u1ed9ng, nh\u01b0ng \u0111\u00f3ng \u0111\u1ec3 ch\u1ec9nh s\u1eeda.<\/em><\/strong><\/p>\n\n\n\n<p>\u00dd ngh\u0129a l\u00e0: Khi c\u1ea7n thay \u0111\u1ed5i ch\u1ee9c n\u0103ng, b\u1ea1n n\u00ean m\u1edf r\u1ed9ng class th\u00f4ng qua k\u1ebf th\u1eeba ho\u1eb7c composition, kh\u00f4ng n\u00ean ch\u1ec9nh s\u1eeda m\u00e3 ngu\u1ed3n \u0111\u00e3 t\u1ed3n t\u1ea1i, tr\u00e1nh l\u00e0m \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn ph\u1ea7n kh\u00e1c trong h\u1ec7 th\u1ed1ng.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">V\u00ed d\u1ee5 vi ph\u1ea1m OCP:<\/h4>\n\n\n\n<p>Gi\u1ea3 s\u1eed ta c\u00f3 m\u1ed9t h\u1ec7 th\u1ed1ng thanh to\u00e1n, ban \u0111\u1ea7u ch\u1ec9 h\u1ed7 tr\u1ee3 th\u1ebb t\u00edn d\u1ee5ng. Sau \u0111\u00f3 mu\u1ed1n th\u00eam thanh to\u00e1n qua PayPal, ta s\u1eeda tr\u1ef1c ti\u1ebfp code c\u0169 \u2192 vi ph\u1ea1m OCP.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class PaymentService {\n    public void processPayment(String type) {\n        if (type.equals(\"credit\")) {\n            System.out.println(\"Processing credit card payment...\");\n        } else if (type.equals(\"paypal\")) {\n            System.out.println(\"Processing PayPal payment...\");\n        }\n        \/\/ If a new payment method is added, this code must be modified again\n    }\n}<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> PaymentService <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">processPayment<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String <\/span><span style=\"color: #88C0D0\">type<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">type<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">equals<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">credit<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">))<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Processing credit card payment...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">else<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">if<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">type<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">equals<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">paypal<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">))<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">            System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Processing PayPal payment...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> If a new payment method <\/span><span style=\"color: #81A1C1\">is<\/span><span style=\"color: #D8DEE9FF\"> added<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> this code must be modified again<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>V\u1ea5n \u0111\u1ec1:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>M\u1ed7i l\u1ea7n th\u00eam ph\u01b0\u01a1ng th\u1ee9c thanh to\u00e1n m\u1edbi, ph\u1ea3i m\u1edf file c\u0169 v\u00e0 ch\u1ec9nh s\u1eeda logic.<\/li>\n\n\n\n<li>Nguy c\u01a1 ph\u00e1 v\u1ee1 ch\u1ee9c n\u0103ng \u0111ang ho\u1ea1t \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c1p d\u1ee5ng OCP<\/strong><\/p>\n\n\n\n<p>Ch\u00fang ta s\u1ebd t\u00e1ch ph\u01b0\u01a1ng th\u1ee9c thanh to\u00e1n th\u00e0nh interface v\u00e0 c\u00e1c class tri\u1ec3n khai ri\u00eang.<br>Khi th\u00eam ph\u01b0\u01a1ng th\u1ee9c m\u1edbi, ch\u1ec9 c\u1ea7n t\u1ea1o class m\u1edbi, kh\u00f4ng \u0111\u1ee5ng v\u00e0o code c\u0169.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Interface for payment methods\npublic interface PaymentMethod {\n    void pay();\n}\n\n\/\/ Implementation for credit card payment\npublic class CreditCardPayment implements PaymentMethod {\n    @Override\n    public void pay() {\n        System.out.println(\"Processing credit card payment...\");\n    }\n}\n\n\/\/ Implementation for PayPal payment\npublic class PayPalPayment implements PaymentMethod {\n    @Override\n    public void pay() {\n        System.out.println(\"Processing PayPal payment...\");\n    }\n}\n\n\/\/ Service responsible for processing payments\npublic class PaymentService {\n    public void processPayment(PaymentMethod method) {\n        method.pay();\n    }\n}\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Interface <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> payment methods<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public interface PaymentMethod <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">pay<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Implementation <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> credit card payment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> CreditCardPayment implements PaymentMethod <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">pay<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Processing credit card payment...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Implementation <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> PayPal payment<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> PayPalPayment implements PaymentMethod <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">pay<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Processing PayPal payment...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Service responsible <\/span><span style=\"color: #81A1C1\">for<\/span><span style=\"color: #D8DEE9FF\"> processing payments<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> PaymentService <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">processPayment<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">PaymentMethod method<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        method<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">pay<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class Main {\n    public static void main(String[] args) {\n        PaymentService service = new PaymentService();\n\n        service.processPayment(new CreditCardPayment());\n        service.processPayment(new PayPalPayment());\n\n        \/\/ If you want to add a new payment method \u2192 simply create a new class that implements PaymentMethod\n    }\n}\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Main <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public static void <\/span><span style=\"color: #88C0D0\">main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        PaymentService service = new <\/span><span style=\"color: #88C0D0\">PaymentService<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        service<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">processPayment<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">new <\/span><span style=\"color: #88C0D0\">CreditCardPayment<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        service<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">processPayment<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">new <\/span><span style=\"color: #88C0D0\">PayPalPayment<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> If you want to add a new payment method \u2192 simply create a new <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> that implements PaymentMethod<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u0110i\u1ec3m t\u1ed1t h\u01a1n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Code c\u0169 kh\u00f4ng c\u1ea7n s\u1eeda khi th\u00eam t\u00ednh n\u0103ng m\u1edbi \u2192 \u0111\u00f3ng \u0111\u1ec3 ch\u1ec9nh s\u1eeda.<\/li>\n\n\n\n<li>C\u00f3 th\u1ec3 m\u1edf r\u1ed9ng b\u1eb1ng c\u00e1ch th\u00eam class m\u1edbi \u2192 m\u1edf \u0111\u1ec3 m\u1edf r\u1ed9ng.<\/li>\n\n\n\n<li>Gi\u1ea3m r\u1ee7i ro ph\u00e1 v\u1ee1 ch\u1ee9c n\u0103ng \u0111ang ho\u1ea1t \u0111\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.3. Liskov Substitution Principle (LSP) \u2013 Nguy\u00ean l\u00fd thay th\u1ebf Liskov<\/h3>\n\n\n\n<p><strong><em>Class con c\u00f3 th\u1ec3 thay th\u1ebf cho class cha m\u00e0 kh\u00f4ng l\u00e0m sai logic c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh.<\/em><\/strong><\/p>\n\n\n\n<p>N\u00f3i c\u00e1ch kh\u00e1c, b\u1ea5t k\u1ef3 class con n\u00e0o c\u0169ng ph\u1ea3i \u0111\u1ea3m b\u1ea3o \u0111\u1ea7y \u0111\u1ee7 h\u00e0nh vi c\u1ee7a class cha, kh\u00f4ng \u0111\u01b0\u1ee3c thay \u0111\u1ed5i k\u1ef3 v\u1ecdng c\u1ee7a ng\u01b0\u1eddi d\u00f9ng.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 vi ph\u1ea1m LSP:<\/strong><\/p>\n\n\n\n<p>Gi\u1ea3 s\u1eed ta c\u00f3 class <code>Rectangle<\/code> (h\u00ecnh ch\u1eef nh\u1eadt) v\u00e0 mu\u1ed1n t\u1ea1o <code>Square<\/code> (h\u00ecnh vu\u00f4ng) k\u1ebf th\u1eeba t\u1eeb <code>Rectangle<\/code>.<br>Nghe th\u00ec h\u1ee3p l\u00fd, nh\u01b0ng khi tri\u1ec3n khai, vi\u1ec7c g\u00e1n chi\u1ec1u d\u00e0i\/chi\u1ec1u r\u1ed9ng c\u1ee7a <code>Square<\/code> l\u1ea1i <strong>thay \u0111\u1ed5i h\u00e0nh vi<\/strong> so v\u1edbi <code>Rectangle<\/code>, d\u1eabn \u0111\u1ebfn bug.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>class Rectangle {\n    protected int width;\n    protected int height;\n\n    public void setWidth(int width) {\n        this.width = width;\n    }\n\n    public void setHeight(int height) {\n        this.height = height;\n    }\n\n    public int getArea() {\n        return width * height;\n    }\n}\n\nclass Square extends Rectangle {\n    @Override\n    public void setWidth(int width) {\n        this.width = width;\n        this.height = width; \/\/ Force height to match width\n    }\n\n    @Override\n    public void setHeight(int height) {\n        this.height = height;\n        this.width = height; \/\/ Force width to match height\n    }\n}\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Rectangle <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    protected <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> width;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    protected <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> height;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">setWidth<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> width<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">width = width;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">setHeight<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> height<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">height = height;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">getArea<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> width <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> height;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Square extends Rectangle <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">setWidth<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> width<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">width = width;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">height = width; <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Force height to match width<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">setHeight<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> height<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">height = height;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">width = height; <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Force width to match height<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u00c1p d\u1ee5ng \u0111\u00fang LSP<\/strong><\/p>\n\n\n\n<p><strong><em>Gi\u1ea3i ph\u00e1<\/em>p<\/strong>: Kh\u00f4ng \u00e9p k\u1ebf th\u1eeba n\u1ebfu m\u1ed1i quan h\u1ec7<em> \u201cis-a\u201d<\/em> kh\u00f4ng th\u1ef1c s\u1ef1 ph\u00f9 h\u1ee3p.<br>\u1ede \u0111\u00e2y, <em><code>Square<\/code> <\/em>v\u00e0 <em><code>Rectangle<\/code> <\/em>n\u00ean c\u00f9ng tri\u1ec3n khai m\u1ed9t <em>interface <\/em>chung nh\u01b0 <code><em>Shape<\/em><\/code>, thay v\u00ec \u00e9p <em><code>Square<\/code> <\/em>l\u00e0m con c\u1ee7a <code><em>Rectangle<\/em><\/code>.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interface Shape {\n    int getArea();\n}\n\nclass Rectangle implements Shape {\n    private int width;\n    private int height;\n\n    public Rectangle(int width, int height) {\n        this.width = width;\n        this.height = height;\n    }\n\n    @Override\n    public int getArea() {\n        return width * height;\n    }\n}\n\nclass Square implements Shape {\n    private int side;\n\n    public Square(int side) {\n        this.side = side;\n    }\n\n    @Override\n    public int getArea() {\n        return side * side;\n    }\n}<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">interface Shape <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">getArea<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Rectangle implements Shape <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> width;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> height;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">Rectangle<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> width<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> height<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">width = width;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">height = height;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">getArea<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> width <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> height;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Square implements Shape <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> side;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">Square<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> side<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">side = side;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">int<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #88C0D0\">getArea<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">return<\/span><span style=\"color: #D8DEE9FF\"> side <\/span><span style=\"color: #81A1C1\">*<\/span><span style=\"color: #D8DEE9FF\"> side;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class Main {\n    public static void main(String[] args) {\n        Shape rect = new Rectangle(5, 10);\n        Shape square = new Square(5);\n\n        System.out.println(rect.getArea());   \/\/ 50\n        System.out.println(square.getArea()); \/\/ 25\n    }\n}<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Main <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public static void <\/span><span style=\"color: #88C0D0\">main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Shape rect = new <\/span><span style=\"color: #88C0D0\">Rectangle<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">10<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        Shape square = new <\/span><span style=\"color: #88C0D0\">Square<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #B48EAD\">5<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">rect<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getArea<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;   <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">50<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">square<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">getArea<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">; <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #B48EAD\">25<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u0110i\u1ec3m t\u1ed1t h\u01a1n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Square<\/code> v\u00e0 <code>Rectangle<\/code> c\u00f9ng tu\u00e2n th\u1ee7 h\u1ee3p \u0111\u1ed3ng <code>Shape<\/code>.<\/li>\n\n\n\n<li>Kh\u00f4ng thay \u0111\u1ed5i h\u00e0nh vi k\u1ef3 v\u1ecdng c\u1ee7a class cha.<\/li>\n\n\n\n<li>Code d\u1ec5 hi\u1ec3u, kh\u00f4ng c\u00f3 bug \u1ea9n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.4 Interface Segregation Principle (ISP) \u2013 Nguy\u00ean l\u00fd ph\u00e2n t\u00e1ch giao di\u1ec7n<\/h3>\n\n\n\n<p><strong><em>Kh\u00f4ng n\u00ean \u00e9p c\u00e1c class ph\u1ee5 thu\u1ed9c v\u00e0o nh\u1eefng ph\u01b0\u01a1ng th\u1ee9c m\u00e0 ch\u00fang kh\u00f4ng s\u1eed d\u1ee5ng.<\/em><\/strong><\/p>\n\n\n\n<p>Thay v\u00ec t\u1ea1o m\u1ed9t interface l\u1edbn, h\u00e3y chia nh\u1ecf th\u00e0nh nhi\u1ec1u interface nh\u1ecf v\u00e0 chuy\u00ean bi\u1ec7t. \u0110i\u1ec1u n\u00e0y gi\u00fap gi\u1ea3m s\u1ef1 ph\u1ee5 thu\u1ed9c kh\u00f4ng c\u1ea7n thi\u1ebft v\u00e0 t\u0103ng t\u00ednh linh ho\u1ea1t.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 vi ph\u1ea1m ISP:<\/strong><\/p>\n\n\n\n<p>Gi\u1ea3 s\u1eed ta c\u00f3 m\u1ed9t h\u1ec7 th\u1ed1ng qu\u1ea3n l\u00fd m\u00e1y in, v\u00e0 \u0111\u1ecbnh ngh\u0129a m\u1ed9t interface <strong>qu\u00e1 to<\/strong>, b\u1eaft m\u1ecdi m\u00e1y in ph\u1ea3i implement t\u1ea5t c\u1ea3 c\u00e1c ph\u01b0\u01a1ng th\u1ee9c, k\u1ec3 c\u1ea3 nh\u1eefng ph\u01b0\u01a1ng th\u1ee9c kh\u00f4ng c\u1ea7n.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Oversized interface\ninterface Machine {\n    void print();\n    void scan();\n    void fax();\n}\n\n\/\/ Basic printer\nclass BasicPrinter implements Machine {\n    @Override\n    public void print() {\n        System.out.println(\"Printing document...\");\n    }\n\n    @Override\n    public void scan() {\n        \/\/ Scan not supported \u2192 must leave empty or throw an exception\n        throw new UnsupportedOperationException(\"Scan not supported\");\n    }\n\n    @Override\n    public void fax() {\n        \/\/ Fax not supported\n        throw new UnsupportedOperationException(\"Fax not supported\");\n    }\n}<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Oversized interface<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">interface Machine <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">scan<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">fax<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Basic printer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> BasicPrinter implements Machine <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Printing document...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">scan<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Scan <\/span><span style=\"color: #81A1C1\">not<\/span><span style=\"color: #D8DEE9FF\"> supported \u2192 must leave empty <\/span><span style=\"color: #81A1C1\">or<\/span><span style=\"color: #D8DEE9FF\"> throw an exception<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        throw new <\/span><span style=\"color: #88C0D0\">UnsupportedOperationException<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Scan not supported<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">fax<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Fax <\/span><span style=\"color: #81A1C1\">not<\/span><span style=\"color: #D8DEE9FF\"> supported<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        throw new <\/span><span style=\"color: #88C0D0\">UnsupportedOperationException<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Fax not supported<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>V\u1ea5n \u0111\u1ec1:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>BasicPrinter<\/code> ph\u1ea3i implement c\u1ea3 <code>scan()<\/code> v\u00e0 <code>fax()<\/code> d\u00f9 kh\u00f4ng d\u00f9ng.<\/li>\n\n\n\n<li>T\u1ea1o ra s\u1ef1 ph\u1ee5 thu\u1ed9c v\u00e0 code r\u1ed1i, d\u1ec5 g\u00e2y l\u1ed7i khi b\u1ea3o tr\u00ec.<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c1p d\u1ee5ng ISP:<\/strong><\/p>\n\n\n\n<p>Thay v\u00ec m\u1ed9t interface to, chia nh\u1ecf th\u00e0nh nhi\u1ec1u interface chuy\u00ean bi\u1ec7t.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>interface Printer {\n    void print();\n}\n\ninterface Scanner {\n    void scan();\n}\n\ninterface Fax {\n    void fax();\n}\n\n\/\/ Basic printer that only needs printing capability\nclass BasicPrinter implements Printer {\n    @Override\n    public void print() {\n        System.out.println(\"Printing document...\");\n    }\n}\n\n\/\/ Multi-function printer\nclass MultiFunctionPrinter implements Printer, Scanner, Fax {\n    @Override\n    public void print() {\n        System.out.println(\"Printing document...\");\n    }\n\n    @Override\n    public void scan() {\n        System.out.println(\"Scanning document...\");\n    }\n\n    @Override\n    public void fax() {\n        System.out.println(\"Sending fax...\");\n    }\n}<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">interface Printer <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">interface Scanner <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">scan<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">interface Fax <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">fax<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Basic printer that only needs printing capability<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> BasicPrinter implements Printer <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Printing document...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Multi<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\">function printer<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> MultiFunctionPrinter implements Printer<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> Scanner<\/span><span style=\"color: #ECEFF4\">,<\/span><span style=\"color: #D8DEE9FF\"> Fax <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">print<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Printing document...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">scan<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Scanning document...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">fax<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Sending fax...<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u0110i\u1ec3m t\u1ed1t h\u01a1n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Class n\u00e0o c\u1ea7n g\u00ec ch\u1ec9 implement interface \u0111\u00f3.<\/li>\n\n\n\n<li>Gi\u1ea3m s\u1ef1 ph\u1ee5 thu\u1ed9c kh\u00f4ng c\u1ea7n thi\u1ebft.<\/li>\n\n\n\n<li>Code g\u1ecdn, d\u1ec5 m\u1edf r\u1ed9ng.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2.5 Dependency Inversion Principle (DIP) \u2013 Nguy\u00ean l\u00fd \u0111\u1ea3o ng\u01b0\u1ee3c ph\u1ee5 thu\u1ed9c<\/h3>\n\n\n\n<p><strong><em>Module c\u1ea5p cao kh\u00f4ng n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o module c\u1ea5p th\u1ea5p, c\u1ea3 hai n\u00ean ph\u1ee5 thu\u1ed9c v\u00e0o abstraction.<\/em><\/strong><\/p>\n\n\n\n<p>\u00dd ngh\u0129a: \u0110\u1eebng \u0111\u1ec3 c\u00e1c class c\u1ea5p cao ph\u1ea3i &#8220;bi\u1ebft r\u00f5&#8221; class c\u1ea5p th\u1ea5p. H\u00e3y giao ti\u1ebfp qua c\u00e1c interface ho\u1eb7c abstraction, gi\u00fap h\u1ec7 th\u1ed1ng linh ho\u1ea1t h\u01a1n khi thay \u0111\u1ed5i ho\u1eb7c ki\u1ec3m th\u1eed.<\/p>\n\n\n\n<p><strong>V\u00ed d\u1ee5 vi ph\u1ea1m DIP:<\/strong><\/p>\n\n\n\n<p>Gi\u1ea3 s\u1eed ta c\u00f3 m\u1ed9t \u1ee9ng d\u1ee5ng g\u1eedi th\u00f4ng b\u00e1o.<br>Class <code>NotificationService<\/code> (c\u1ea5p cao) g\u1ecdi tr\u1ef1c ti\u1ebfp <code>EmailSender<\/code> (c\u1ea5p th\u1ea5p).<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Low-level module\nclass EmailSender {\n    public void sendEmail(String message) {\n        System.out.println(\"Sending Email: \" + message);\n    }\n}\n\n\/\/ High-level module\nclass NotificationService {\n    private EmailSender emailSender = new EmailSender();\n\n    public void send(String message) {\n        emailSender.sendEmail(message);\n    }\n}\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Low<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\">level module<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> EmailSender <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">sendEmail<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Sending Email: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> High<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\">level module<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> NotificationService <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private EmailSender emailSender = new <\/span><span style=\"color: #88C0D0\">EmailSender<\/span><span style=\"color: #ECEFF4\">()<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">send<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        emailSender<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sendEmail<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>V\u1ea5n \u0111\u1ec1:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>NotificationService<\/code> <strong>ph\u1ee5 thu\u1ed9c tr\u1ef1c ti\u1ebfp<\/strong> v\u00e0o <code>EmailSender<\/code>.<\/li>\n\n\n\n<li>N\u1ebfu mu\u1ed1n g\u1eedi qua SMS ho\u1eb7c Push Notification, ph\u1ea3i s\u1eeda code c\u1ee7a <code>NotificationService<\/code> \u2192 vi ph\u1ea1m nguy\u00ean l\u00fd.<\/li>\n<\/ul>\n\n\n\n<p><strong>\u00c1p d\u1ee5ng DIP<\/strong><\/p>\n\n\n\n<p>Ta t\u1ea1o m\u1ed9t abstraction (interface) \u0111\u1ec3 c\u1ea3 module c\u1ea5p cao v\u00e0 c\u1ea5p th\u1ea5p \u0111\u1ec1u ph\u1ee5 thu\u1ed9c v\u00e0o n\u00f3.<br>Khi mu\u1ed1n thay \u0111\u1ed5i c\u00e1ch g\u1eedi th\u00f4ng b\u00e1o, ch\u1ec9 c\u1ea7n t\u1ea1o class m\u1edbi implement interface n\u00e0y.<\/p>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\/\/ Abstraction\ninterface MessageSender {\n    void sendMessage(String message);\n}\n\n\/\/ Low-level module: Email\nclass EmailSender implements MessageSender {\n    @Override\n    public void sendMessage(String message) {\n        System.out.println(\"Sending Email: \" + message);\n    }\n}\n\n\/\/ Low-level module: SMS\nclass SmsSender implements MessageSender {\n    @Override\n    public void sendMessage(String message) {\n        System.out.println(\"Sending SMS: \" + message);\n    }\n}\n\n\/\/ High-level module\nclass NotificationService {\n    private MessageSender sender;\n\n    \/\/ Inject dependency via constructor\n    public NotificationService(MessageSender sender) {\n        this.sender = sender;\n    }\n\n    public void send(String message) {\n        sender.sendMessage(message);\n    }\n}\n<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Abstraction<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">interface MessageSender <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    void <\/span><span style=\"color: #88C0D0\">sendMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Low<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\">level module<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> Email<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> EmailSender implements MessageSender <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">sendMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Sending Email: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Low<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\">level module<\/span><span style=\"color: #ECEFF4\">:<\/span><span style=\"color: #D8DEE9FF\"> SMS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> SmsSender implements MessageSender <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">@<\/span><span style=\"color: #D8DEE9FF\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">sendMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        System<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">out<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">println<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Sending SMS: <\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #81A1C1\">+<\/span><span style=\"color: #D8DEE9FF\"> message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> High<\/span><span style=\"color: #81A1C1\">-<\/span><span style=\"color: #D8DEE9FF\">level module<\/span><\/span>\n<span class=\"line\"><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> NotificationService <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    private MessageSender sender;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #81A1C1\">\/\/<\/span><span style=\"color: #D8DEE9FF\"> Inject dependency via constructor<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public <\/span><span style=\"color: #88C0D0\">NotificationService<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">MessageSender sender<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        this<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #D8DEE9FF\">sender = sender;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public void <\/span><span style=\"color: #88C0D0\">send<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        sender<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">sendMessage<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">message<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<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:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#d8dee9ff;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>public class Main {\n    public static void main(String[] args) {\n        NotificationService emailService = new NotificationService(new EmailSender());\n        emailService.send(\"Hello via Email!\");\n\n        NotificationService smsService = new NotificationService(new SmsSender());\n        smsService.send(\"Hello via SMS!\");\n    }\n}<\/textarea><\/pre><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=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki nord\" style=\"background-color: #2e3440ff\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D8DEE9FF\">public <\/span><span style=\"color: #81A1C1\">class<\/span><span style=\"color: #D8DEE9FF\"> Main <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    public static void <\/span><span style=\"color: #88C0D0\">main<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">String<\/span><span style=\"color: #ECEFF4\">[]<\/span><span style=\"color: #D8DEE9FF\"> args<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\"> <\/span><span style=\"color: #ECEFF4\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        NotificationService emailService = new <\/span><span style=\"color: #88C0D0\">NotificationService<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">new <\/span><span style=\"color: #88C0D0\">EmailSender<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        emailService<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">send<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Hello via Email!<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        NotificationService smsService = new <\/span><span style=\"color: #88C0D0\">NotificationService<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #D8DEE9FF\">new <\/span><span style=\"color: #88C0D0\">SmsSender<\/span><span style=\"color: #ECEFF4\">())<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">        smsService<\/span><span style=\"color: #ECEFF4\">.<\/span><span style=\"color: #88C0D0\">send<\/span><span style=\"color: #ECEFF4\">(<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #A3BE8C\">Hello via SMS!<\/span><span style=\"color: #ECEFF4\">&quot;<\/span><span style=\"color: #ECEFF4\">)<\/span><span style=\"color: #D8DEE9FF\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D8DEE9FF\">    <\/span><span style=\"color: #ECEFF4\">}<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ECEFF4\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><strong>\u0110i\u1ec3m t\u1ed1t h\u01a1n:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>NotificationService<\/code> kh\u00f4ng quan t\u00e2m g\u1eedi b\u1eb1ng c\u00e1ch n\u00e0o.<\/li>\n\n\n\n<li>Th\u00eam k\u00eanh g\u1eedi m\u1edbi ch\u1ec9 c\u1ea7n t\u1ea1o class m\u1edbi implement <code>MessageSender<\/code>.<\/li>\n\n\n\n<li>D\u1ec5 test (c\u00f3 th\u1ec3 mock <code>MessageSender<\/code> khi unit test).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. T\u1ea1i sao n\u00ean \u00e1p d\u1ee5ng SOLID?<\/h2>\n\n\n\n<p>\u00c1p d\u1ee5ng SOLID kh\u00f4ng ph\u1ea3i v\u00ec\u2026 Uncle Bob b\u1ea3o th\u1ebf, m\u00e0 v\u00ec n\u00f3 gi\u00fap b\u1ea1n s\u1ed1ng kh\u1ecfe h\u01a1n trong th\u1ebf gi\u1edbi code \u0111\u1ea7y bi\u1ebfn \u0111\u1ed9ng:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gi\u1ea3m chi ph\u00ed b\u1ea3o tr\u00ec<\/strong><br>Khi code \u0111\u01b0\u1ee3c t\u1ed5 ch\u1ee9c h\u1ee3p l\u00fd, vi\u1ec7c th\u00eam t\u00ednh n\u0103ng ho\u1eb7c s\u1eeda l\u1ed7i ch\u1ec9 c\u1ea7n \u201c\u0111\u1ed9ng dao\u201d \u1edf \u0111\u00fang ch\u1ed7, kh\u00f4ng l\u00e0m \u201cv\u1ee1 m\u1ea1ch m\u00e1u\u201d \u1edf ph\u1ea7n kh\u00e1c. \u0110i\u1ec1u n\u00e0y \u0111\u1eb7c bi\u1ec7t quan tr\u1ecdng v\u1edbi c\u00e1c d\u1ef1 \u00e1n l\u1edbn, n\u01a1i m\u1ed9t d\u00f2ng code s\u1eeda sai c\u00f3 th\u1ec3 khi\u1ebfn c\u1ea3 team OT.<\/li>\n\n\n\n<li><strong>T\u0103ng kh\u1ea3 n\u0103ng t\u00e1i s\u1eed d\u1ee5ng<\/strong><br>C\u00e1c module nh\u1ecf, r\u00f5 r\u00e0ng, \u0111\u1ed9c l\u1eadp nh\u01b0 \u201cm\u1ea3nh lego\u201d \u2013 c\u00f3 th\u1ec3 mang \u0111i r\u00e1p \u1edf nhi\u1ec1u ch\u1ed7 kh\u00e1c nhau. Kh\u00f4ng ph\u1ea3i vi\u1ebft l\u1ea1i t\u1eeb \u0111\u1ea7u, ti\u1ebft ki\u1ec7m th\u1eddi gian v\u00e0 c\u00f4ng s\u1ee9c.<\/li>\n\n\n\n<li><strong>T\u0103ng kh\u1ea3 n\u0103ng ki\u1ec3m th\u1eed (testability)<\/strong><br>Khi c\u00e1c ph\u1ea7n \u0111\u01b0\u1ee3c t\u00e1ch bi\u1ec7t, vi\u1ebft unit test tr\u1edf n\u00ean d\u1ec5 d\u00e0ng nh\u01b0 \u201cch\u1ee5p \u1ea3nh th\u1ebb\u201d \u2013 nhanh, g\u1ecdn, kh\u00f4ng b\u1ecb d\u00ednh c\u00e1c ph\u1ea7n kh\u00f4ng li\u00ean quan.<\/li>\n\n\n\n<li><strong>Giao ti\u1ebfp nh\u00f3m t\u1ed1t h\u01a1n<\/strong><br>Code r\u00f5 r\u00e0ng, tu\u00e2n nguy\u00ean t\u1eafc, \u0111\u1ecdc ph\u00e1t hi\u1ec3u ngay \u2192 Team kh\u00f4ng ph\u1ea3i \u201cgi\u1ea3i m\u00e3 m\u1eadt th\u01b0\u201d khi \u0111\u1ecdc code c\u1ee7a nhau. \u0110i\u1ec1u n\u00e0y gi\u00fap onboard th\u00e0nh vi\u00ean m\u1edbi nhanh h\u01a1n v\u00e0 gi\u1ea3m hi\u1ec3u nh\u1ea7m khi l\u00e0m vi\u1ec7c chung.<\/li>\n\n\n\n<li><strong>S\u1eb5n s\u00e0ng cho thay \u0111\u1ed5i<\/strong><br>Y\u00eau c\u1ea7u thay \u0111\u1ed5i l\u00e0 \u0111i\u1ec1u ch\u1eafc ch\u1eafn s\u1ebd x\u1ea3y ra (kh\u00e1ch h\u00e0ng s\u00e1ng n\u1eafng chi\u1ec1u m\u01b0a l\u00e0 chuy\u1ec7n th\u01b0\u1eddng). SOLID gi\u00fap h\u1ec7 th\u1ed1ng linh ho\u1ea1t, d\u1ec5 th\u00edch nghi, kh\u00f4ng bi\u1ebfn m\u1ed7i l\u1ea7n thay \u0111\u1ed5i th\u00e0nh m\u1ed9t cu\u1ed9c \u201c\u0111\u1ea1i tu\u201d.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">4. Khi n\u00e0o n\u00ean v\u00e0 ch\u01b0a n\u00ean \u00e1p d\u1ee5ng SOLID?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 Khi n\u00ean \u00e1p d\u1ee5ng SOLID<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u1ef1 \u00e1n v\u1eeba ho\u1eb7c l\u1edbn, \u0111\u1eb7c bi\u1ec7t l\u00e0 khi team \u0111\u00f4ng ng\u01b0\u1eddi<\/strong><br>Khi nhi\u1ec1u l\u1eadp tr\u00ecnh vi\u00ean c\u00f9ng nh\u00fang tay v\u00e0o m\u1ed9t codebase, nguy c\u01a1 code ch\u1ed3ng ch\u00e9o, xung \u0111\u1ed9t, ho\u1eb7c \u201cb\u00f3p n\u00e1t\u201d nhau l\u00e0 r\u1ea5t cao. SOLID \u0111\u00f3ng vai tr\u00f2 nh\u01b0 lu\u1eadt giao th\u00f4ng \u2013 ai \u0111i l\u00e0n n\u00e0o th\u00ec c\u1ee9 \u1edf \u0111\u00fang l\u00e0n \u0111\u00f3, tr\u00e1nh t\u00f4ng nhau gi\u1eefa \u0111\u01b0\u1eddng.<\/li>\n\n\n\n<li><strong>H\u1ec7 th\u1ed1ng c\u00f3 v\u00f2ng \u0111\u1eddi d\u00e0i, y\u00eau c\u1ea7u b\u1ea3o tr\u00ec v\u00e0 m\u1edf r\u1ed9ng th\u01b0\u1eddng xuy\u00ean<\/strong><br>M\u1ed9t h\u1ec7 th\u1ed1ng s\u1ed1ng l\u00e2u s\u1ebd ph\u1ea3i tr\u1ea3i qua nhi\u1ec1u l\u1ea7n n\u00e2ng c\u1ea5p v\u00e0 thay \u0111\u1ed5i. N\u1ebfu kh\u00f4ng \u00e1p d\u1ee5ng SOLID, m\u1ed7i l\u1ea7n thay \u0111\u1ed5i gi\u1ed1ng nh\u01b0 th\u00e1o m\u1ed9t vi\u00ean g\u1ea1ch trong th\u00e1p Jenga \u2013 r\u1ea5t d\u1ec5 s\u1eadp c\u1ea3 h\u1ec7 th\u1ed1ng.<\/li>\n\n\n\n<li><strong>Ki\u1ebfn tr\u00fac microservice ho\u1eb7c module h\u00f3a r\u00f5 r\u00e0ng<\/strong><br>Trong m\u00f4i tr\u01b0\u1eddng m\u00e0 c\u00e1c th\u00e0nh ph\u1ea7n c\u1ea7n giao ti\u1ebfp linh ho\u1ea1t nh\u01b0ng v\u1eabn \u0111\u1ed9c l\u1eadp, SOLID gi\u00fap c\u00e1c module \u201cn\u00f3i chuy\u1ec7n\u201d v\u1edbi nhau th\u00f4ng qua interface, tr\u00e1nh ph\u1ee5 thu\u1ed9c c\u1ee9ng. \u0110\u00e2y l\u00e0 c\u00e1ch gi\u1eef cho microservice kh\u00f4ng bi\u1ebfn th\u00e0nh \u201cmicro-mess\u201d.<\/li>\n\n\n\n<li><strong>D\u1ef1 \u00e1n \u0111ang g\u1eb7p v\u1ea5n \u0111\u1ec1 spaghetti code<\/strong><br>N\u1ebfu code c\u1ee7a b\u1ea1n \u0111ang r\u1ed1i nh\u01b0 m\u1edb m\u00ec \u00dd, th\u00eam t\u00ednh n\u0103ng m\u1edbi l\u00e0 m\u1ed9t c\u01a1n \u00e1c m\u1ed9ng, th\u00ec SOLID ch\u00ednh l\u00e0 \u201cdao k\u00e9o\u201d \u0111\u1ec3 g\u1ee1 r\u1ed1i, chia nh\u1ecf, v\u00e0 l\u00e0m s\u1ea1ch ki\u1ebfn tr\u00fac<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img decoding=\"async\" width=\"654\" height=\"613\" src=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/4.1-Khi-nen-ap-dung-SOLID-visual-selection.png\" alt=\"\" class=\"wp-image-585\" style=\"aspect-ratio:1.0669113711095817;width:671px;height:auto\" srcset=\"https:\/\/kienthucmo.com\/wp-content\/uploads\/4.1-Khi-nen-ap-dung-SOLID-visual-selection.png 654w, https:\/\/kienthucmo.com\/wp-content\/uploads\/4.1-Khi-nen-ap-dung-SOLID-visual-selection-300x281.png 300w\" sizes=\"(max-width: 654px) 100vw, 654px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 Khi ch\u01b0a c\u1ea7n \u00e1p d\u1ee5ng to\u00e0n b\u1ed9 SOLID<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>D\u1ef1 \u00e1n nh\u1ecf ho\u1eb7c MVP (Minimum Viable Product)<\/strong><br>M\u1ee5c ti\u00eau l\u00fac n\u00e0y l\u00e0 ra s\u1ea3n ph\u1ea9m nhanh nh\u1ea5t \u0111\u1ec3 test \u00fd t\u01b0\u1edfng v\u1edbi ng\u01b0\u1eddi d\u00f9ng ho\u1eb7c nh\u00e0 \u0111\u1ea7u t\u01b0. T\u1ed1i \u01b0u h\u00f3a ki\u1ebfn tr\u00fac qu\u00e1 s\u1edbm c\u00f3 th\u1ec3 l\u00e0m ch\u1eadm ti\u1ebfn \u0111\u1ed9 v\u00e0 l\u00e3ng ph\u00ed c\u00f4ng s\u1ee9c n\u1ebfu s\u1ea3n ph\u1ea9m b\u1ecb pivot ho\u1eb7c b\u1ecf.<\/li>\n\n\n\n<li><strong>T\u00e0i nguy\u00ean h\u1ea1n ch\u1ebf<\/strong><br>V\u1edbi team \u00edt ng\u01b0\u1eddi, th\u1eddi gian g\u1ea5p r\u00fat, ng\u00e2n s\u00e1ch eo h\u1eb9p, \u01b0u ti\u00ean h\u00e0ng \u0111\u1ea7u l\u00e0 s\u1ea3n ph\u1ea9m ch\u1ea1y \u0111\u01b0\u1ee3c. Ki\u1ebfn tr\u00fac \u0111\u1eb9p s\u1ebd \u0111\u1ec3 d\u00e0nh cho c\u00e1c giai \u0111o\u1ea1n sau khi d\u1ef1 \u00e1n \u0111\u00e3 ch\u1ee9ng minh \u0111\u01b0\u1ee3c gi\u00e1 tr\u1ecb.<\/li>\n\n\n\n<li><strong>Giai \u0111o\u1ea1n th\u1eed nghi\u1ec7m, ch\u01b0a \u1ed5n \u0111\u1ecbnh ki\u1ebfn tr\u00fac<\/strong><br>N\u1ebfu b\u1ea1n v\u1eabn \u0111ang th\u1eed nhi\u1ec1u h\u01b0\u1edbng ti\u1ebfp c\u1eadn v\u00e0 ki\u1ebfn tr\u00fac c\u00f3 th\u1ec3 thay \u0111\u1ed5i ho\u00e0n to\u00e0n, vi\u1ec7c \u00e1p d\u1ee5ng ch\u1eb7t ch\u1ebd SOLID ngay t\u1eeb \u0111\u1ea7u ch\u1ec9 khi\u1ebfn b\u1ea1n m\u1ea5t th\u1eddi gian vi\u1ebft l\u1ea1i. H\u00e3y gi\u1eef m\u1ecdi th\u1ee9 \u0111\u01a1n gi\u1ea3n v\u00e0 linh ho\u1ea1t nh\u1ea5t c\u00f3 th\u1ec3.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">5. So s\u00e1nh SOLID v\u00e0 c\u00e1c nguy\u00ean t\u1eafc kh\u00e1c<\/h2>\n\n\n\n<p>M\u00ecnh s\u1ebd chia th\u00e0nh 4 nh\u00f3m so s\u00e1nh ch\u00ednh:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SOLID<\/strong> (nguy\u00ean t\u1eafc thi\u1ebft k\u1ebf h\u01b0\u1edbng \u0111\u1ed1i t\u01b0\u1ee3ng)<\/li>\n\n\n\n<li><strong>KISS \/ DRY \/ YAGNI<\/strong> (nguy\u00ean t\u1eafc coding t\u1ed5ng qu\u00e1t)<\/li>\n\n\n\n<li><strong>GRASP<\/strong> (nguy\u00ean t\u1eafc ph\u00e2n b\u1ed5 tr\u00e1ch nhi\u1ec7m)<\/li>\n\n\n\n<li><strong>Design Patterns<\/strong> (m\u1eabu thi\u1ebft k\u1ebf)<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Nh\u00f3m nguy\u00ean t\u1eafc<\/th><th>M\u1ee5c ti\u00eau ch\u00ednh<\/th><th>Khi n\u00e0o d\u00f9ng<\/th><th>\u01afu \u0111i\u1ec3m<\/th><th>Nh\u01b0\u1ee3c \u0111i\u1ec3m \/ R\u1ee7i ro n\u1ebfu l\u1ea1m d\u1ee5ng<\/th><th>C\u00e1ch k\u1ebft h\u1ee3p v\u1edbi SOLID<\/th><\/tr><\/thead><tbody><tr><td><strong>S (Single Responsibility)<\/strong> \u2013 M\u1ed7i class c\u00f3 1 l\u00fd do thay \u0111\u1ed5i<\/td><td>Gi\u1ea3m \u0111\u1ed9 ph\u1ee9c t\u1ea1p, t\u0103ng kh\u1ea3 n\u0103ng b\u1ea3o tr\u00ec<\/td><td>Khi class c\u00f3 nhi\u1ec1u logic kh\u00f4ng li\u00ean quan<\/td><td>Code d\u1ec5 hi\u1ec3u, d\u1ec5 test<\/td><td>T\u00e1ch qu\u00e1 nh\u1ecf g\u00e2y r\u1ed1i<\/td><td>K\u1ebft h\u1ee3p <strong>DRY<\/strong> \u0111\u1ec3 tr\u00e1nh tr\u00f9ng code, <strong>GRASP \u2013 High Cohesion<\/strong> \u0111\u1ec3 gom ch\u1ee9c n\u0103ng li\u00ean quan<\/td><\/tr><tr><td><strong>O (Open\/Closed)<\/strong> \u2013 M\u1edf r\u1ed9ng kh\u00f4ng s\u1eeda \u0111\u1ed5i<\/td><td>Cho ph\u00e9p th\u00eam t\u00ednh n\u0103ng m\u00e0 kh\u00f4ng ph\u00e1 code c\u0169<\/td><td>Khi c\u1ea7n th\u00eam ch\u1ee9c n\u0103ng m\u00e0 kh\u00f4ng mu\u1ed1n \u0111\u1ee5ng code c\u0169<\/td><td>Gi\u1ea3m bug khi m\u1edf r\u1ed9ng<\/td><td>L\u1ea1m d\u1ee5ng g\u00e2y nhi\u1ec1u class\/interface ph\u1ee9c t\u1ea1p<\/td><td>K\u1ebft h\u1ee3p <strong>Design Patterns<\/strong> (Strategy, Decorator) \u0111\u1ec3 th\u1ef1c thi<\/td><\/tr><tr><td><strong>L (Liskov Substitution)<\/strong> \u2013 Thay th\u1ebf \u0111\u01b0\u1ee3c b\u1eb1ng class con<\/td><td>Khi d\u00f9ng k\u1ebf th\u1eeba<\/td><td>\u0110\u1ea3m b\u1ea3o t\u00ednh nh\u1ea5t qu\u00e1n<\/td><td>Gi\u1ea3m bug runtime<\/td><td>L\u1ea1m d\u1ee5ng k\u1ebf th\u1eeba g\u00e2y kh\u00f3 b\u1ea3o tr\u00ec<\/td><td>K\u1ebft h\u1ee3p <strong>YAGNI<\/strong> \u0111\u1ec3 kh\u00f4ng t\u1ea1o k\u1ebf th\u1eeba th\u1eeba<\/td><\/tr><tr><td><strong>I (Interface Segregation)<\/strong> \u2013 Interface nh\u1ecf g\u1ecdn<\/td><td>Khi interface b\u1ecb &#8220;b\u00e9o ph\u00ec&#8221;<\/td><td>Client ch\u1ec9 ph\u1ee5 thu\u1ed9c v\u00e0o c\u00e1i n\u00f3 d\u00f9ng<\/td><td>Gi\u1ea3m r\u00e0ng bu\u1ed9c<\/td><td>Qu\u00e1 nhi\u1ec1u interface g\u00e2y ph\u00e2n m\u1ea3nh<\/td><td>K\u1ebft h\u1ee3p <strong>KISS<\/strong> \u0111\u1ec3 gi\u1eef interface \u0111\u01a1n gi\u1ea3n<\/td><\/tr><tr><td><strong>D (Dependency Inversion)<\/strong> \u2013 Ph\u1ee5 thu\u1ed9c abstraction<\/td><td>Khi module cao ph\u1ee5 thu\u1ed9c module th\u1ea5p<\/td><td>Gi\u1ea3m ph\u1ee5 thu\u1ed9c tr\u1ef1c ti\u1ebfp, d\u1ec5 test mock<\/td><td>Code linh ho\u1ea1t, d\u1ec5 thay th\u1ebf<\/td><td>Nhi\u1ec1u abstraction qu\u00e1 g\u00e2y ph\u1ee9c t\u1ea1p<\/td><td>K\u1ebft h\u1ee3p <strong>GRASP \u2013 Low Coupling<\/strong> \u0111\u1ec3 gi\u1ea3m ph\u1ee5 thu\u1ed9c t\u1ed5ng th\u1ec3<\/td><\/tr><tr><td><strong>KISS<\/strong> \u2013 Keep It Simple, Stupid<\/td><td>Gi\u1eef m\u1ecdi th\u1ee9 \u0111\u01a1n gi\u1ea3n nh\u1ea5t c\u00f3 th\u1ec3<\/td><td>M\u1ecdi giai \u0111o\u1ea1n<\/td><td>Code d\u1ec5 hi\u1ec3u<\/td><td>Qu\u00e1 \u0111\u01a1n gi\u1ea3n c\u00f3 th\u1ec3 thi\u1ebfu t\u00ednh m\u1edf r\u1ed9ng<\/td><td>K\u1ebft h\u1ee3p v\u1edbi <strong>S<\/strong> v\u00e0 <strong>I<\/strong> \u0111\u1ec3 tr\u00e1nh over-engineering<\/td><\/tr><tr><td><strong>DRY<\/strong> \u2013 Don\u2019t Repeat Yourself<\/td><td>Tr\u00e1nh l\u1eb7p l\u1ea1i logic<\/td><td>Khi c\u00f3 code tr\u00f9ng<\/td><td>Gi\u1ea3m l\u1ed7i khi s\u1eeda<\/td><td>Qu\u00e1 DRY c\u00f3 th\u1ec3 \u00e9p code chung kh\u00f4ng h\u1ee3p l\u00fd<\/td><td>K\u1ebft h\u1ee3p <strong>S<\/strong> \u0111\u1ec3 chia class\/module h\u1ee3p l\u00fd<\/td><\/tr><tr><td><strong>YAGNI<\/strong> \u2013 You Aren\u2019t Gonna Need It<\/td><td>Kh\u00f4ng code tr\u01b0\u1edbc t\u00ednh n\u0103ng ch\u01b0a c\u1ea7n<\/td><td>Giai \u0111o\u1ea1n ph\u00e1t tri\u1ec3n t\u00ednh n\u0103ng<\/td><td>Ti\u1ebft ki\u1ec7m th\u1eddi gian<\/td><td>C\u00f3 th\u1ec3 ph\u1ea3i refactor n\u1ebfu c\u1ea7n th\u1eadt<\/td><td>K\u1ebft h\u1ee3p v\u1edbi <strong>O<\/strong> \u0111\u1ec3 m\u1edf r\u1ed9ng sau m\u00e0 kh\u00f4ng s\u1eeda code c\u0169<\/td><\/tr><tr><td><strong>GRASP \u2013 High Cohesion<\/strong><\/td><td>Gom c\u00e1c ch\u1ee9c n\u0103ng li\u00ean quan l\u1ea1i<\/td><td>Khi ph\u00e2n b\u1ed5 tr\u00e1ch nhi\u1ec7m<\/td><td>Code t\u1eadp trung, d\u1ec5 hi\u1ec3u<\/td><td>L\u1ea1m d\u1ee5ng -&gt; class qu\u00e1 l\u1edbn<\/td><td>B\u1ed5 sung cho <strong>S<\/strong><\/td><\/tr><tr><td><strong>GRASP \u2013 Low Coupling<\/strong><\/td><td>Gi\u1ea3m s\u1ef1 ph\u1ee5 thu\u1ed9c gi\u1eefa c\u00e1c module<\/td><td>Khi thi\u1ebft k\u1ebf module<\/td><td>D\u1ec5 b\u1ea3o tr\u00ec, thay th\u1ebf<\/td><td>T\u1ed1n effort thi\u1ebft k\u1ebf<\/td><td>\u0110i \u0111\u00f4i v\u1edbi <strong>D<\/strong> c\u1ee7a SOLID<\/td><\/tr><tr><td><strong>Design Patterns<\/strong><\/td><td>Gi\u1ea3i ph\u00e1p l\u1eb7p l\u1ea1i cho v\u1ea5n \u0111\u1ec1 th\u01b0\u1eddng g\u1eb7p<\/td><td>Khi g\u1eb7p pattern ph\u00f9 h\u1ee3p<\/td><td>Ti\u1ebft ki\u1ec7m th\u1eddi gian, code chu\u1ea9n<\/td><td>L\u1ea1m d\u1ee5ng -&gt; r\u1ed1i<\/td><td>Nhi\u1ec1u pattern sinh ra \u0111\u1ec3 hi\u1ec7n th\u1ef1c <strong>O<\/strong>, <strong>D<\/strong>, <strong>L<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Khi n\u00e0o d\u00f9ng c\u00e1i n\u00e0o?<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B\u1eaft \u0111\u1ea7u d\u1ef1 \u00e1n: KISS, YAGNI, DRY \u2192 gi\u1eef m\u1ecdi th\u1ee9 \u0111\u01a1n gi\u1ea3n, kh\u00f4ng l\u00e0m th\u1eeba.<\/li>\n\n\n\n<li>Thi\u1ebft k\u1ebf h\u1ec7 th\u1ed1ng OOP: \u00c1p d\u1ee5ng SOLID \u0111\u1ec3 c\u1ea5u tr\u00fac class\/module.<\/li>\n\n\n\n<li>Ph\u00e2n b\u1ed5 tr\u00e1ch nhi\u1ec7m: D\u00f9ng GRASP song song v\u1edbi SOLID.<\/li>\n\n\n\n<li>Gi\u1ea3i quy\u1ebft v\u1ea5n \u0111\u1ec1 c\u1ee5 th\u1ec3: Ch\u1ecdn Design Pattern ph\u00f9 h\u1ee3p.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">C\u00e1ch k\u1ebft h\u1ee3p h\u1ee3p l\u00fd<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>B\u1eaft \u0111\u1ea7u nh\u1ecf v\u1edbi KISS + YAGNI \u2192 tr\u00e1nh over-engineering.<\/li>\n\n\n\n<li>Ph\u00e1t tri\u1ec3n d\u1ea7n v\u1edbi SOLID khi h\u1ec7 th\u1ed1ng l\u1edbn h\u01a1n.<\/li>\n\n\n\n<li>D\u00f9ng DRY \u0111\u1ec3 t\u1ed1i \u01b0u code tr\u00f9ng, nh\u01b0ng \u0111\u1ea3m b\u1ea3o <strong>S<\/strong> kh\u00f4ng b\u1ecb ph\u00e1 v\u1ee1.<\/li>\n\n\n\n<li>D\u00f9ng GRASP \u0111\u1ec3 h\u1ed7 tr\u1ee3 quy\u1ebft \u0111\u1ecbnh ai l\u00e0m g\u00ec trong code.<\/li>\n\n\n\n<li>\u00c1p d\u1ee5ng Design Patterns khi c\u1ea7n th\u1ef1c thi nguy\u00ean t\u1eafc <strong>O<\/strong> ho\u1eb7c <strong>D<\/strong>.<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">6. K\u1ebft lu\u1eadn<\/h2>\n\n\n\n<p>SOLID kh\u00f4ng ch\u1ec9 l\u00e0 t\u1eadp h\u1ee3p 5 nguy\u00ean l\u00fd kh\u00f4 khan. \u0110\u00f3 l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u1ec3 b\u1ea1n ph\u00e1t tri\u1ec3n ph\u1ea7n m\u1ec1m c\u00f3 ch\u1ea5t l\u01b0\u1ee3ng cao, d\u1ec5 m\u1edf r\u1ed9ng, \u00edt l\u1ed7i v\u00e0 d\u1ec5 b\u1ea3o tr\u00ec. D\u00f9 b\u1ea1n vi\u1ebft Java, Python, C#, hay b\u1ea5t k\u1ef3 ng\u00f4n ng\u1eef OOP n\u00e0o \u2013 SOLID v\u1eabn l\u00e0 h\u01b0\u1edbng d\u1eabn \u0111\u00fang \u0111\u1eafn \u0111\u1ec3 b\u1ea1n x\u00e2y d\u1ef1ng ph\u1ea7n m\u1ec1m m\u1ed9t c\u00e1ch chuy\u00ean nghi\u1ec7p.<\/p>\n\n\n\n<p>H\u00e3y h\u1ecdc c\u00e1ch \u00e1p d\u1ee5ng SOLID t\u1eebng b\u01b0\u1edbc. Kh\u00f4ng c\u1ea7n ph\u1ea3i ho\u00e0n h\u1ea3o t\u1eeb \u0111\u1ea7u \u2013 nh\u01b0ng c\u1ea7n hi\u1ec3u r\u00f5 b\u1ea3n ch\u1ea5t v\u00e0 v\u1eadn d\u1ee5ng linh ho\u1ea1t. Khi k\u1ef9 n\u0103ng vi\u1ebft m\u00e3 c\u1ee7a b\u1ea1n ph\u00e1t tri\u1ec3n, vi\u1ec7c tu\u00e2n th\u1ee7 SOLID s\u1ebd tr\u1edf th\u00e0nh b\u1ea3n n\u0103ng t\u1ef1 nhi\u00ean.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. T\u00e0i li\u1ec7u tham kh\u1ea3o<\/h2>\n\n\n\n<p>[1] R. C. Martin, <em>Clean Architecture: A Craftsman\u2019s Guide to Software Structure and Design<\/em>. Prentice Hall, 2017.<br>[2] R. C. Martin, <em>Agile Software Development: Principles, Patterns, and Practices<\/em>. Prentice Hall, 2002.<br>[3] dev.to, \u201cSOLID Principles Explained With Examples.\u201d [Online]. Available: <a href=\"https:\/\/dev.to\" target=\"_blank\" rel=\"noopener\">https:\/\/dev.to<\/a><br>[4] freeCodeCamp, \u201cSOLID Principles in JavaScript and Other Languages.\u201d [Online]. Available: <a href=\"https:\/\/freecodecamp.org\" target=\"_blank\" rel=\"noopener\">https:\/\/freecodecamp.org<\/a><br>[5] Microsoft, \u201cOfficial Developer Documentation.\u201d [Online]. Available: <a href=\"https:\/\/learn.microsoft.com\" target=\"_blank\" rel=\"noopener\">https:\/\/learn.microsoft.com<\/a><br>[6] JetBrains, \u201cOfficial Developer Guides and Documentation.\u201d [Online]. Available: <a href=\"https:\/\/www.jetbrains.com\" target=\"_blank\" rel=\"noopener\">https:\/\/www.jetbrains.com<\/a><br>[7] ThoughtWorks, \u201cTechnology Radar.\u201d [Online]. Available: <a href=\"https:\/\/www.thoughtworks.com\" target=\"_blank\" rel=\"noopener\">https:\/\/www.thoughtworks.com<\/a><br>[8] OpenDev, &#8220;Object-Oriented Programming (OOP): The Core Mindset in Modern Software Development&#8221;. Avaliable:<a href=\" https:\/\/kienthucmo.com\/en\/object-oriented-programming-oop-the-core-mindset-in-modern-software-development\/\"> https:\/\/kienthucmo.com\/en\/object-oriented-programming-oop-the-core-mindset-in-modern-software-development\/<\/a><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vi\u1ec7c \u00e1p d\u1ee5ng nguy\u00ean t\u1eafc SOLID trong l\u1eadp tr\u00ecnh gi\u00fap m\u00e3 ngu\u1ed3n tr\u1edf n\u00ean d\u1ec5 b\u1ea3o tr\u00ec, m\u1edf r\u1ed9ng v\u00e0 gi\u1ea3m thi\u1ec3u l\u1ed7i. Kh\u00f4ng ch\u1ec9 \u0111\u1ea3m b\u1ea3o t\u00ednh r\u00f5 r\u00e0ng, SOLID c\u00f2n l\u00e0 n\u1ec1n t\u1ea3ng \u0111\u1ec3 x\u00e2y d\u1ef1ng clean code, h\u1ed7 tr\u1ee3 teamwork hi\u1ec7u qu\u1ea3 v\u00e0 n\u00e2ng cao ch\u1ea5t l\u01b0\u1ee3ng ph\u1ea7n m\u1ec1m.<\/p>\n","protected":false},"author":1,"featured_media":23,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowieHDDA:productID":"","footnotes":""},"categories":[17,16],"tags":[33,34],"class_list":["post-22","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cong-nghe-phan-mem","category-cong-nghe-thong-tin","tag-clean-code","tag-nguyen-ly-thiet-ke-phan-mem"],"_links":{"self":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts\/22","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/comments?post=22"}],"version-history":[{"count":18,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts\/22\/revisions"}],"predecessor-version":[{"id":2515,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/posts\/22\/revisions\/2515"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/media\/23"}],"wp:attachment":[{"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/media?parent=22"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/categories?post=22"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kienthucmo.com\/vi\/wp-json\/wp\/v2\/tags?post=22"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}