<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 2WITH.ME</title>
    <description>The latest articles on DEV Community by 2WITH.ME (@2withme).</description>
    <link>https://dev.to/2withme</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F4404%2Ff0178e94-b709-4c9d-9796-df3607f72352.png</url>
      <title>DEV Community: 2WITH.ME</title>
      <link>https://dev.to/2withme</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/2withme"/>
    <language>en</language>
    <item>
      <title>Clean Architecture#101 - Concept โดย ลุง bob </title>
      <dc:creator>Sou[TH]Paw</dc:creator>
      <pubDate>Fri, 09 Jul 2021 15:57:19 +0000</pubDate>
      <link>https://dev.to/2withme/clearn-architecture-introduction-101-bob-agile-3l1d</link>
      <guid>https://dev.to/2withme/clearn-architecture-introduction-101-bob-agile-3l1d</guid>
      <description>&lt;h3&gt;
  
  
  จากการใช้ N-tier Architecture มานาน และทำให้รู้ว่ามีปัญหามากมายในการทำ Unit Test เนื่องจากการที่โครงสร้างที่ถูกยึกติด (Dependency) มากเกินไป
&lt;/h3&gt;

&lt;p&gt;ดังนั้นจุดประสงค์ที่ผมต้องเปลี่ยน Architecture เพื่อที่แยกหรือแบ่งความสัมพันธ์ออกจากกันอย่างชัดเจน &lt;br&gt;
เพื่อให้ระบบเป็นอิสระ (Independent) จากทุกสิ่งเหมือนไข่ในหิน &lt;br&gt;
เพราะ Bussiness มันช่างอ่อนแอ เสียนี้กระไร&lt;/p&gt;

&lt;p&gt;อ่านไปสักพักก็พอเข้าใจโดยสังเขป&lt;br&gt;
แบ่งข้อกำหนดกฎเกณฑ์เป็น 3 ส่วนใหญ่ๆ &lt;br&gt;
(ตามที่ผมเข้าใจนะ อาจจะมีถูกผิดบ้าง แต้ผิดน่าจะเยอะ -_-") &lt;/p&gt;




&lt;h3&gt;
  
  
  1 - เรื่องของการเป็นชั้นการทำงาน (Layer)
&lt;/h3&gt;

&lt;p&gt;ในแนวคิด (Concept) ของลุงได้แบ่งแต่ละชั้น 4 ชั้น&lt;/p&gt;

&lt;p&gt;Entities - ชั้นในสุด แปลตรงๆก็ วัตถุ ถ้าจริงจังหน่อยก็ Data Structure , Object with method&lt;/p&gt;

&lt;p&gt;Use Cases - ชั้นถัดออกมาเป็นส่วนที่จะเขียนส่วนดำเนินการ (Implement) ทั้งหมดในระบบ ง่ายๆก็จัดการ entity ให้ทำตาม Biz Logic ที่เรากำหนด&lt;/p&gt;

&lt;p&gt;Interface Adapter - ถัดออกมาเป็นส่วนนี้แหละที่จะเป็นการเขียนเชื่อมกับ framework, library , db อย่างจริงจัง&lt;/p&gt;

&lt;p&gt;External Agency - ชั้นนอกสุดเป็นก็ framework, library , db , Everything Gengerbell นั้นแหละ&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;        |-----------------------|         
        | |-------------------| |      
        | | |---------------| | |     
        | | | |-----------| | | |
        | | | |  Entitiy  | | | | 
        | | | |     ^     | | | |   
        | | | |-----|-----| | | |  
        | | |       |       | | |
        | | |    Use Case   | | |     
        | | |       ^       | | |  
        | | |*******|*******| | |  
        | |         |         | |          
        | | Interface Adapter | |   
        | |         ^         | |  
        | |---------|---------| |
        |           |           |
        |           |           |
        |    External Agency    |
        |                       |
&amp;gt;&amp;lt;รูปปลากรอบ : The Clean Architecture : Layer&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;โดยลุงบอกประมาณว่าไม่จำเป็นว่าจะ มากกว่า หรือ น้อยกว่าเสมอไป &lt;br&gt;
    แต่จะต้องมีกฏของการยึดติดเสมอ (Dependency Rule) คือ การพิงพาโค้ดจะต้องชี้จากข้างนอกเข้าสู่ข้างในเสมอ&lt;br&gt;
    ก็คือข้างนอกรู้จักข้างใน ข้างในต้องไม่รู้จักข้างนอก ประมาณนี้มั้ง&lt;/p&gt;

&lt;h3&gt;
  
  
  2 - เรื่องของ ข้ามพรมแดน (Crossing boundaries)
&lt;/h3&gt;

&lt;p&gt;การข้ามแดนระหว่าง Interface Adapter กับ Use Case ต้องอยู่ในกฏ Dependency Rule จากที่อ่าน &lt;br&gt;
ซื่งลุงแนะนำให้ใช้ - &lt;a href="https://medium.com/@jaturapat/dependency-inversion-principle-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-7cd2c7e09b57"&gt;Dependency Inversion Pattern&lt;/a&gt;&lt;br&gt;
แล้วมันยังไงละ มันอยู่ในส่วนหนึ่งของ SOLID principles อยู่ที่ตัว D นะ &lt;br&gt;
ง่ายๆก็คือ ถ้าภายในจะคุยกับภายในต้องคุยผ่าน Interface ที่ภายในสร้างเพื่อติดต่อเท่านั้น&lt;/p&gt;

&lt;h3&gt;
  
  
  3 - เรื่องของ ข้อมูลที่ข้ามแดน (Data crosses the boundaries)
&lt;/h3&gt;

&lt;p&gt;ลุงบอกว่ารูปแบบข้อมูลที่ส่งต้องเป็น โครงสร้างง่ายๆ หรือ โครงสร้างที่เกิดจากภายในเท่านั้น&lt;br&gt;
ห้ามอยู่ในรูปแบบข้อมูลจากภายนอกเพราะจะผิดกฏการยึดติด (Dependency Rule)&lt;/p&gt;

&lt;p&gt;จากการอ่านได้อะไรเยอะมากเลย พร้อมจะออกแบบ template เพื่อใช้อย่างจริงจังละ แล้วเจอกันใน part ถัดไป&lt;/p&gt;

&lt;p&gt;Reference: &lt;br&gt;
&lt;a href="https://en.bbo.com.ph/tech/clean-architecture-and-modular-pattern/"&gt;https://en.bbo.com.ph/tech/clean-architecture-and-modular-pattern/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://stackoverflow.com/questions/49307434/clean-architecture-with-c-a-better-design-to-perform-validation-in-value-objec"&gt;https://stackoverflow.com/questions/49307434/clean-architecture-with-c-a-better-design-to-perform-validation-in-value-objec&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/bxcodec/go-clean-arch"&gt;https://github.com/bxcodec/go-clean-arch&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@thamtheera/clean-architecture-concept-423579240738"&gt;https://medium.com/@thamtheera/clean-architecture-concept-423579240738&lt;/a&gt;&lt;br&gt;
&lt;a href="https://kritwis.medium.com/golang-clean-architecture-with-demo-e0938e5be02b"&gt;https://kritwis.medium.com/golang-clean-architecture-with-demo-e0938e5be02b&lt;/a&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Dependency_inversion_principle"&gt;https://en.wikipedia.org/wiki/Dependency_inversion_principle&lt;/a&gt;&lt;br&gt;
&lt;a href="https://medium.com/@jaturapat/dependency-inversion-principle-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-7cd2c7e09b57"&gt;https://medium.com/@jaturapat/dependency-inversion-principle-%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3-7cd2c7e09b57&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
