Các bài viết

Mẫu thiết kế là gì: tại sao sử dụng chúng, phân loại, ưu và nhược điểm

Trong công nghệ phần mềm, các mẫu thiết kế là giải pháp tối ưu cho các vấn đề thường xảy ra trong thiết kế phần mềm.

Chúng giống như những dự án trướcdeficác công cụ hữu ích, đã được thử và kiểm tra mà bạn có thể tùy chỉnh để giải quyết vấn đề thiết kế lặp lại trong mã của mình.

Thời gian đọc ước tính: 6 minuti

Mẫu thiết kế là gì

Mẫu thiết kế không phải là mã mà chúng ta có thể sao chép và chèn vào chương trình của mình như chúng ta có thể làm với các hàm hoặc thư viện tiêu chuẩn. Mẫu thiết kế là một khái niệm chung có khả năng giải quyết một vấn đề cụ thể. Về cơ bản là một mô hình mà các chi tiết mà chúng tôi có thể theo dõi và triển khai giải pháp phù hợp với thực tế chương trình của chúng tôi.

Mô hình thường bị nhầm lẫn với các thuật toán vì cả hai khái niệm đều mô tả các giải pháp điển hình cho một số vấn đề đã biết. Trong khi một thuật toán defiNếu luôn có một tập hợp hành động rõ ràng có thể đạt được một mục tiêu nhất định thì mô hình là mô tả giải pháp ở cấp độ cao hơn. Mã từ cùng một mô hình được áp dụng cho hai chương trình khác nhau có thể khác nhau.

Muốn làm một sự tương tự, chúng ta có thể nghĩ đến một công thức nấu ăn: cả hai đều có những bước đi rõ ràng để đạt được mục tiêu. Tuy nhiên, một mô hình giống một dự án hơn, trong đó bạn có thể xem kết quả và đặc điểm của nó là gì, nhưng thứ tự thực hiện chính xác phụ thuộc vào chúng ta là người viết mã.

Mẫu thiết kế được làm bằng gì?

Hầu hết các mẫu được mô tả rất hình thức để mọi người có thể tái tạo chúng trong nhiều ngữ cảnh. Chúng ta hãy xem bên dưới các yếu tố có trong phần mô tả của một mô hình:

  • Ý định của mô hình mô tả ngắn gọn cả vấn đề và giải pháp.
  • Sự thúc đẩy giải thích thêm vấn đề và giải pháp mà mô hình có thể thực hiện được.
  • Kết cấu của các lớp hiển thị từng phần của mô hình và chúng có liên quan như thế nào.
  • Ví dụ mã bằng một trong những ngôn ngữ lập trình phổ biến nhất giúp bạn dễ hiểu ý tưởng đằng sau mô hình hơn.

Tại sao sử dụng chúng?

Một lập trình viên có thể phát triển phần mềm mà không cần biết đến sự tồn tại của các mẫu thiết kế. Nhiều người làm như vậy và vì lý do này mà họ thực hiện một số kế hoạch mà không hề biết. Nhưng tại sao chúng ta lại phải dành thời gian tìm hiểu chúng?

  • Các mẫu thiết kế là một bộ giải pháp đã được thử nghiệm các vấn đề thường gặp trong thiết kế phần mềm. Ngay cả khi bạn chưa bao giờ gặp phải những vấn đề này, việc biết các mẫu vẫn hữu ích vì nó dạy bạn cách giải quyết tất cả các loại vấn đề bằng cách sử dụng các nguyên tắc thiết kế hướng đối tượng.
  • Các mẫu thiết kế defiHọ tạo ra một ngôn ngữ chung mà bạn và nhóm của bạn có thể sử dụng để giao tiếp hiệu quả hơn. Bạn có thể nói: “Ồ, chỉ cần sử dụng Singleton để làm việc này” và mọi người sẽ hiểu ý tưởng đằng sau đề xuất của bạn. Không cần phải giải thích singleton là gì nếu bạn biết mẫu và tên của nó.

Phân loại các mẫu thiết kế

Các mẫu thiết kế khác nhau về độ phức tạp, mức độ chi tiết và quy mô ứng dụng trong toàn bộ hệ thống được thiết kế.

Bằng cách tương tự, chúng ta có thể làm cho một giao lộ an toàn hơn bằng cách lắp đặt một vài đèn giao thông hoặc xây dựng toàn bộ nút giao thông nhiều tầng với lối đi ngầm dành cho người đi bộ.

Các mô hình cấp thấp, cơ bản nhất thường được gọi là thành ngữ . Chúng thường chỉ áp dụng cho một ngôn ngữ lập trình duy nhất.

Các mô hình phổ quát và cấp cao nhất là mô hình kiến ​​trúc . Các nhà phát triển có thể triển khai các mẫu này bằng hầu hết mọi ngôn ngữ. Không giống như các mẫu khác, chúng có thể được sử dụng để thiết kế kiến ​​trúc của toàn bộ ứng dụng.

Hơn nữa, tất cả các mô hình có thể được phân loại theo đã thử hoặc mục đích. Ba lớp chính là:

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.
  • Mô hình sáng tạo chúng cung cấp các cơ chế tạo đối tượng để tăng tính linh hoạt và tái sử dụng mã hiện có.
  • Mô hình kết cấu họ giải thích cách tập hợp các đối tượng và lớp thành các cấu trúc lớn hơn, giữ cho các cấu trúc này linh hoạt và hiệu quả.
  • Mô hình hành vi họ giải quyết vấn đề giao tiếp hiệu quả và phân công trách nhiệm giữa các đối tượng.

Ví dụ về Design Pattern trong Laravel: Facade

Mặt tiền là một mẫu thiết kế cấu trúc cung cấp giao diện đơn giản hóa cho thư viện, khung hoặc bất kỳ tập hợp lớp phức tạp nào khác.

Vấn đề

Giả sử chúng ta cần làm cho phần mềm hoạt động được, dựa trên một tập hợp lớn các đối tượng thuộc một thư viện hoặc khung công tác phức tạp. Thông thường, chúng ta sẽ cần khởi tạo tất cả các đối tượng này, theo dõi các phần phụ thuộc, thực thi các phương thức theo đúng thứ tự, v.v.

Do đó, logic nghiệp vụ của các lớp sẽ trở nên gắn kết chặt chẽ với chi tiết triển khai của các lớp bên thứ ba, khiến chúng khó hiểu và khó quản lý.

dung dịch

một facade là lớp cung cấp giao diện đơn giản cho một hệ thống con phức tạp chứa nhiều bộ phận chuyển động. MỘT facade có thể cung cấp chức năng hạn chế so với làm việc trực tiếp với hệ thống con. Tuy nhiên, nó chỉ bao gồm những tính năng mà khách hàng thực sự quan tâm.

Có một facade nó rất hữu ích khi chúng ta cần tích hợp ứng dụng với một thư viện phức tạp có hàng tá tính năng nhưng chúng ta chỉ cần một phần nhỏ chức năng của nó.

Ví dụ: một ứng dụng tải các video ngắn vui nhộn về mèo lên mạng xã hội có thể sử dụng thư viện chuyển đổi video chuyên nghiệp. Tuy nhiên, tất cả những gì chúng ta thực sự cần là một lớp với một phương thức duy nhất encode(filename, format). Sau khi tạo một lớp như vậy và kết nối nó với thư viện chuyển đổi video, chúng ta sẽ có lớp đầu tiên facade.

Ví dụ, người điều hành điện thoại của một trung tâm cuộc gọi giống như một facade. Trên thực tế, khi chúng ta gọi đến dịch vụ điện thoại của một cửa hàng để đặt hàng qua điện thoại, người điều hành là của chúng ta. facade đối với tất cả các dịch vụ và bộ phận của cửa hàng. Nhà điều hành cung cấp giao diện giọng nói đơn giản cho hệ thống đặt hàng, cổng thanh toán và các dịch vụ giao hàng khác nhau.

Ví dụ thực tế trong PHP

Nghĩ về Mặt tiền như một bộ chuyển đổi đơn giản cho một số hệ thống con phức tạp. Facade tách biệt sự phức tạp trong một lớp duy nhất và cho phép mã ứng dụng khác sử dụng giao diện đơn giản.

Trong ví dụ này, Facade che giấu sự phức tạp của thư viện API YouTube và FFmpeg khỏi mã máy khách. Thay vì làm việc với hàng tá lớp, máy khách sử dụng một phương thức đơn giản trên Facade.

<?php

namespace RefactoringGuru\Facade\RealWorld;

/**
 * The Facade provides a single method for downloading videos from YouTube. This
 * method hides all the complexity of the PHP network layer, YouTube API and the
 * video conversion library (FFmpeg).
 */
class YouTubeDownloader
{
    protected $youtube;
    protected $ffmpeg;

    /**
     * It is handy when the Facade can manage the lifecycle of the subsystem it
     * uses.
     */
    public function __construct(string $youtubeApiKey)
    {
        $this->youtube = new YouTube($youtubeApiKey);
        $this->ffmpeg = new FFMpeg();
    }

    /**
     * The Facade provides a simple method for downloading video and encoding it
     * to a target format (for the sake of simplicity, the real-world code is
     * commented-out).
     */
    public function downloadVideo(string $url): void
    {
        echo "Fetching video metadata from youtube...\n";
        // $title = $this->youtube->fetchVideo($url)->getTitle();
        echo "Saving video file to a temporary file...\n";
        // $this->youtube->saveAs($url, "video.mpg");

        echo "Processing source video...\n";
        // $video = $this->ffmpeg->open('video.mpg');
        echo "Normalizing and resizing the video to smaller dimensions...\n";
        // $video
        //     ->filters()
        //     ->resize(new FFMpeg\Coordinate\Dimension(320, 240))
        //     ->synchronize();
        echo "Capturing preview image...\n";
        // $video
        //     ->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
        //     ->save($title . 'frame.jpg');
        echo "Saving video in target formats...\n";
        // $video
        //     ->save(new FFMpeg\Format\Video\X264(), $title . '.mp4')
        //     ->save(new FFMpeg\Format\Video\WMV(), $title . '.wmv')
        //     ->save(new FFMpeg\Format\Video\WebM(), $title . '.webm');
        echo "Done!\n";
    }
}

/**
 * The YouTube API subsystem.
 */
class YouTube
{
    public function fetchVideo(): string { /* ... */ }

    public function saveAs(string $path): void { /* ... */ }

    // ...more methods and classes...
}

/**
 * The FFmpeg subsystem (a complex video/audio conversion library).
 */
class FFMpeg
{
    public static function create(): FFMpeg { /* ... */ }

    public function open(string $video): void { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}

class FFMpegVideo
{
    public function filters(): self { /* ... */ }

    public function resize(): self { /* ... */ }

    public function synchronize(): self { /* ... */ }

    public function frame(): self { /* ... */ }

    public function save(string $path): self { /* ... */ }

    // ...more methods and classes... RU: ...дополнительные методы и классы...
}


/**
 * The client code does not depend on any subsystem's classes. Any changes
 * inside the subsystem's code won't affect the client code. You will only need
 * to update the Facade.
 */
function clientCode(YouTubeDownloader $facade)
{
    // ...

    $facade->downloadVideo("https://www.youtube.com/watch?v=QH2-TGUlwu4");

    // ...
}

$facade = new YouTubeDownloader("APIKEY-XXXXXXXXX");
clientCode($facade);

Ercole Palmeri

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.

Bài viết gần đây

Sự can thiệp sáng tạo vào thực tế tăng cường, với người xem Apple tại Phòng khám đa khoa Catania

Một ca phẫu thuật tạo hình mắt bằng cách sử dụng trình xem thương mại Apple Vision Pro đã được thực hiện tại Phòng khám đa khoa Catania…

3 May 2024

Lợi ích của việc tô màu cho trẻ em - thế giới kỳ diệu dành cho mọi lứa tuổi

Phát triển kỹ năng vận động tinh thông qua tô màu giúp trẻ chuẩn bị cho những kỹ năng phức tạp hơn như viết. Để tô màu…

2 May 2024

Tương lai là đây: Ngành vận tải biển đang cách mạng hóa nền kinh tế toàn cầu như thế nào

Ngành hải quân là một cường quốc kinh tế toàn cầu thực sự, đang hướng tới thị trường 150 tỷ...

1 May 2024

Các nhà xuất bản và OpenAI ký thỏa thuận điều chỉnh luồng thông tin được Trí tuệ nhân tạo xử lý

Thứ Hai tuần trước, Financial Times đã công bố một thỏa thuận với OpenAI. FT cấp phép cho hoạt động báo chí đẳng cấp thế giới…

30 tháng tư 2024

Đọc Đổi mới bằng ngôn ngữ của bạn

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.

Theo chúng tôi