<?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: Tình Hoàng Xuân</title>
    <description>The latest articles on DEV Community by Tình Hoàng Xuân (@luis_tinh_1999).</description>
    <link>https://dev.to/luis_tinh_1999</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%2Fuser%2Fprofile_image%2F1079291%2F846b5fa8-47ba-4c2e-b87e-9ee17fbac44c.png</url>
      <title>DEV Community: Tình Hoàng Xuân</title>
      <link>https://dev.to/luis_tinh_1999</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luis_tinh_1999"/>
    <language>en</language>
    <item>
      <title>#2 Command Pattern</title>
      <dc:creator>Tình Hoàng Xuân</dc:creator>
      <pubDate>Wed, 24 May 2023 06:46:13 +0000</pubDate>
      <link>https://dev.to/luis_tinh_1999/2-command-pattern-4h9k</link>
      <guid>https://dev.to/luis_tinh_1999/2-command-pattern-4h9k</guid>
      <description>&lt;p&gt;1 Problem&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client họ chỉ muốn gửi yêu cầu, họ không quan tâm yêu cầu đó sẽ được xử lý như thế nào và khi nào. Họ chỉ quan tâm yêu cầu đó sẽ được thực hiện.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2 Định nghĩa&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Command Pattern đóng gói 1 request thành 1 cái object và từ đó cho phép bạn tham số hoá object đó(pass params thông qua constructor) để thực hiện các request khác nhau, queue and log và undo hành động trước đó&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3 Các thành phần trong Command Pattern &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;ICommand: là một interface or abstract class khai báo các phương thức chung của 1 yêu cầu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Concrete Command: là các lớp sẽ implement ICommand. Nó sẽ đóng gói một hành động cụ thể và chứa thông tin cần thiết để thực hiện yêu cầu đó.Nó thường tham chiếu tới 1 Receiver và gọi 1 phương thức trên Receiver khi lệnh được thực thi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-Commander (người chỉ huy) là thành phần chịu trách nhiệm gọi lệnh và kích hoạt thực thi. Tham chiếu tới ICommand và có thể cấu để làm việc với các lệnh khác nhau 1 cách linh hoạt&lt;/p&gt;

&lt;p&gt;4 Code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;interface ICommand {
  execute(): void
  undo(): void
}

class TurnOffCommand implements ICommand {
    private readonly fan: Fan
    constructor(fan: Fan) {
        this.fan = fan
    }
    execute(): void {
        this.fan.turnOff()
    }
    undo(): void {
        this.fan.turnOn()
    }
}

class TurnOnCommand implements ICommand {
    private readonly fan: Fan
    constructor(fan: Fan) {
        this.fan = fan
    }
    execute(): void {
     this.fan.turnOn()
    }
    undo(): void {
        this.fan.turnOff()
    }
}

class Commander {
    private readonly turnOnCommand: ICommand
    private readonly turnOffCommand: ICommand
    constructor(turnOnCommand: ICommand, turnOffCommand: ICommand) {
        this.turnOffCommand = turnOffCommand
        this.turnOnCommand = turnOnCommand
    }
    public turnOnButtonClick(): void {
        this.turnOnCommand.execute()
    }
    public turnOffButtonClick(): void {
        this.turnOffCommand.execute()
    }
}

// receiver -&amp;gt; cái quạt điều khiển bởi Remote
class Fan {
    turnOn(): void {
        console.log('Turn On')
    }

    turnOff(): void {
        console.log('Turn Off')
    }
}

function main() {
    const fan = new Fan()

    const turnOffCommand = new TurnOffCommand(fan)
    const turnOnCommand = new TurnOnCommand(fan)

    const remote = new Commander(turnOnCommand, turnOffCommand)

    remote.turnOnButtonClick()
    remote.turnOffButtonClick()
}
main()

class Commander {
}

// receiver -&amp;gt; cái quạt điều khiển bởi Remote
class Fan {
}



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>#1 Builder Pattern In Typescript</title>
      <dc:creator>Tình Hoàng Xuân</dc:creator>
      <pubDate>Wed, 17 May 2023 10:38:30 +0000</pubDate>
      <link>https://dev.to/luis_tinh_1999/1-builder-pattern-in-typescript-5g5o</link>
      <guid>https://dev.to/luis_tinh_1999/1-builder-pattern-in-typescript-5g5o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Định nghĩa&lt;/strong&gt;: &lt;br&gt;
Builder Pattern &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;phân tách một đối tượng phức tạp thành các thành phần đơn giản, sau đó tạo chúng 1 cách riêng biệt theo các nhu cầu khác nhau. Và sau cùng là xây dựng lại 1 đối tượng phức tạp&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Để dễ hiểu hơn chúng ta lấy 1 ví dụ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class User {
  constructor(
    public username: string,
    public sex: string,
    public age: number,
    public photo: string,
    public email: string
  ) {}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Chúng ta có 1 Class User và chúng ta khởi tạo 1 đối tượng User với từ khoá New&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const user = new User('john','male',18,'photo','john@gmail.com')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bằng cách này chúng ta vẫn có thể tạo ra 1 đối tượng user nhưng &lt;strong&gt;trong quá trình tạo chúng ta cần chú ý đến thứ tự các tham số được truyền vào, cần truyền đủ các tham số và đúng kiểu dữ liệu của chúng&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Để giải quyết vấn đề trên thì ta có Builder Pattern.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class UserBuilder {
  public username!: string;
  public sex!: string;
  public age!: number;
  public photo!: string;
  public email!: string;

  setUserName(name: string) {
    this.username = name;
    return this;
  }

  setSex(sex: string) {
    this.sex = sex;
    return this;
  }

  setAge(age: number) {
    this.age = age;
    return this;
  }

  setPhoto(photo: string) {
    this.photo = photo;
    return this;
  }

  setEmail(email: string) {
    this.email = email;
    return this;
  }

  build() {
    return new User(this.username, this.sex, this.age, this.photo, this.email);
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Với cách này chúng ta có thể xây dựng lại 1 đối tượng phức tập theo ý muốn của chúng ta.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const bytefer = new UserBuilder()
  .setAge(30)
  .setSex("male")
  .setEmail("bytefer@gmail.com")
  .setPhoto("https://***.com/**")
  .setUserName("Bytefer")
  .build();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kết quả: &lt;/p&gt;

&lt;p&gt;&lt;code&gt;User: {&lt;br&gt;
  "username": "Bytefer",&lt;br&gt;
  "sex": "male",&lt;br&gt;
  "age": 30,&lt;br&gt;
  "photo": "https://***.com/**",&lt;br&gt;
  "email": "bytefer@gmail.com"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nếu ai dùng Nestjs rồi thì thấy cái này quen quen đúng không.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Design Pattern With Typescript</title>
      <dc:creator>Tình Hoàng Xuân</dc:creator>
      <pubDate>Wed, 10 May 2023 10:43:06 +0000</pubDate>
      <link>https://dev.to/luis_tinh_1999/dsdsdsd-19hf</link>
      <guid>https://dev.to/luis_tinh_1999/dsdsdsd-19hf</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/luis_tinh_1999/1-builder-pattern-in-typescript-5g5o"&gt;https://dev.to/luis_tinh_1999/1-builder-pattern-in-typescript-5g5o&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Design Pattern</title>
      <dc:creator>Tình Hoàng Xuân</dc:creator>
      <pubDate>Tue, 09 May 2023 14:17:36 +0000</pubDate>
      <link>https://dev.to/luis_tinh_1999/design-pattern-23ca</link>
      <guid>https://dev.to/luis_tinh_1999/design-pattern-23ca</guid>
      <description>&lt;p&gt;&lt;strong&gt;Design patterns&lt;/strong&gt; are typical solutions to common problems&lt;br&gt;
in software design. Each pattern is like a blueprint&lt;br&gt;
that you can customize to solve a particular&lt;br&gt;
design problem in your code.&lt;/p&gt;

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