ບົດຄວາມ

ຮູບແບບການອອກແບບແມ່ນຫຍັງ: ເປັນຫຍັງຕ້ອງໃຊ້ພວກມັນ, ການຈັດປະເພດ, ຂໍ້ດີແລະຂໍ້ເສຍ

ໃນວິສະວະກໍາຊອບແວ, ຮູບແບບການອອກແບບແມ່ນການແກ້ໄຂທີ່ດີທີ່ສຸດຕໍ່ກັບບັນຫາທີ່ເກີດຂື້ນເລື້ອຍໆໃນການອອກແບບຊອບແວ.

ພວກເຂົາເຈົ້າແມ່ນຄ້າຍຄືໂຄງການກ່ອນdefinite, ພະຍາຍາມແລະທົດສອບເຄື່ອງມືທີ່ທ່ານສາມາດປັບແຕ່ງເພື່ອແກ້ໄຂບັນຫາການອອກແບບທີ່ເກີດຂື້ນໃນລະຫັດຂອງທ່ານ.

ເວລາອ່ານໂດຍປະມານ: 6 ນາທີ

ຮູບແບບການອອກແບບແມ່ນຫຍັງ

ຮູບແບບການອອກແບບບໍ່ແມ່ນລະຫັດທີ່ພວກເຮົາສາມາດຄັດລອກແລະໃສ່ໃນໂປຼແກຼມຂອງພວກເຮົາ, ດັ່ງທີ່ພວກເຮົາສາມາດເຮັດໄດ້ດ້ວຍຫນ້າທີ່ມາດຕະຖານຫຼືຫ້ອງສະຫມຸດ. ຮູບແບບການອອກແບບແມ່ນແນວຄວາມຄິດທົ່ວໄປທີ່ສາມາດແກ້ໄຂບັນຫາໂດຍສະເພາະ. ໂດຍພື້ນຖານແລ້ວແມ່ນຕົວແບບທີ່ມີລາຍລະອຽດທີ່ພວກເຮົາສາມາດປະຕິບັດຕາມ ແລະປະຕິບັດການແກ້ໄຂທີ່ເໝາະສົມກັບຄວາມເປັນຈິງຂອງໂຄງການຂອງພວກເຮົາ.

ແບບຈໍາລອງມັກຈະສັບສົນກັບ algorithms, ເພາະວ່າແນວຄວາມຄິດທັງສອງອະທິບາຍວິທີການແກ້ໄຂບັນຫາທົ່ວໄປບາງຢ່າງ. ໃນຂະນະທີ່ສູດການຄິດໄລ່ defiຖ້າມີການກໍານົດການກະທໍາທີ່ຊັດເຈນສະເຫມີທີ່ສາມາດບັນລຸເປົ້າຫມາຍທີ່ແນ່ນອນ, ຮູບແບບແມ່ນຄໍາອະທິບາຍໃນລະດັບທີ່ສູງກວ່າຂອງການແກ້ໄຂ. ລະຫັດຈາກຕົວແບບດຽວກັນທີ່ໃຊ້ກັບສອງໂຄງການທີ່ແຕກຕ່າງກັນອາດຈະແຕກຕ່າງກັນ.

ຕ້ອງການເຮັດການປຽບທຽບ, ພວກເຮົາສາມາດຄິດເຖິງສູດປຸງແຕ່ງອາຫານ: ທັງສອງມີຂັ້ນຕອນທີ່ຊັດເຈນເພື່ອບັນລຸເປົ້າຫມາຍ. ຢ່າງໃດກໍ່ຕາມ, ຮູບແບບແມ່ນຄ້າຍຄືກັບໂຄງການ, ເຊິ່ງທ່ານສາມາດເຫັນໄດ້ວ່າຜົນໄດ້ຮັບແລະຄຸນລັກສະນະຂອງມັນແມ່ນຫຍັງ, ແຕ່ຄໍາສັ່ງທີ່ແນ່ນອນຂອງການປະຕິບັດແມ່ນຂຶ້ນກັບພວກເຮົາທີ່ຂຽນລະຫັດ.

ຮູບແບບການອອກແບບເຮັດມາຈາກຫຍັງ?

ຮູບແບບສ່ວນໃຫຍ່ຖືກອະທິບາຍຢ່າງເປັນທາງການເພື່ອໃຫ້ຄົນສາມາດຜະລິດພວກມັນໄດ້ໃນຫຼາຍສະພາບການ. ໃຫ້ເບິ່ງຂ້າງລຸ່ມນີ້ອົງປະກອບທີ່ມີຢູ່ໃນຄໍາອະທິບາຍຂອງຕົວແບບ:

  • ຄວາມຕັ້ງໃຈ ຂອງຕົວແບບອະທິບາຍໂດຍຫຍໍ້ທັງບັນຫາແລະການແກ້ໄຂ.
  • ແຮງຈູງໃຈ ອະທິບາຍຕື່ມກ່ຽວກັບບັນຫາ ແລະການແກ້ໄຂທີ່ຕົວແບບນັ້ນເຮັດໃຫ້ເປັນໄປໄດ້.
  • ໂຄງສ້າງ ຂອງຫ້ອງຮຽນສະແດງໃຫ້ເຫັນແຕ່ລະພາກສ່ວນຂອງຕົວແບບແລະວິທີການທີ່ເຂົາເຈົ້າມີຄວາມກ່ຽວຂ້ອງ.
  • ຕົວຢ່າງລະຫັດ ໃນຫນຶ່ງໃນພາສາການຂຽນໂປລແກລມທີ່ນິຍົມທີ່ສຸດເຮັດໃຫ້ມັນງ່າຍຕໍ່ການເຂົ້າໃຈແນວຄວາມຄິດທີ່ຢູ່ເບື້ອງຫລັງຂອງຕົວແບບ.

ເປັນຫຍັງຕ້ອງໃຊ້ພວກມັນ?

ຜູ້ຂຽນໂປລແກລມສາມາດພັດທະນາຊອບແວໄດ້ໂດຍບໍ່ຮູ້ເຖິງການມີຢູ່ຂອງຮູບແບບການອອກແບບ. ຫຼາຍຄົນເຮັດ, ແລະດ້ວຍເຫດຜົນນີ້, ພວກເຂົາປະຕິບັດບາງໂຄງການໂດຍບໍ່ຮູ້ຕົວ. ແຕ່​ແລ້ວ​ເປັນ​ຫຍັງ​ເຮົາ​ຄວນ​ໃຊ້​ເວລາ​ເພື່ອ​ຮຽນ​ຮູ້​ເຂົາ​ເຈົ້າ?

  • ຮູບແບບການອອກແບບແມ່ນຊຸດຂອງ ການ​ແກ້​ໄຂ​ການ​ທົດ​ສອບ​ແລະ​ການ​ທົດ​ສອບ​ ກັບບັນຫາທົ່ວໄປໃນການອອກແບບຊອບແວ. ເຖິງແມ່ນວ່າທ່ານບໍ່ເຄີຍພົບບັນຫາເຫຼົ່ານີ້, ການຮູ້ຮູບແບບແມ່ນຍັງເປັນປະໂຫຍດເນື່ອງຈາກວ່າມັນສອນທ່ານວິທີການແກ້ໄຂບັນຫາທຸກປະເພດໂດຍໃຊ້ຫຼັກການການອອກແບບວັດຖຸ.
  • ຮູບແບບການອອກແບບ defiພວກເຂົາເຈົ້າສ້າງພາສາທົ່ວໄປທີ່ທ່ານແລະທີມງານຂອງທ່ານສາມາດນໍາໃຊ້ເພື່ອຕິດຕໍ່ສື່ສານປະສິດທິພາບຫຼາຍ. ເຈົ້າສາມາດເວົ້າວ່າ, "ໂອ້, ພຽງແຕ່ໃຊ້ Singleton ເພື່ອເຮັດສິ່ງນີ້," ແລະທຸກຄົນຈະເຂົ້າໃຈຄວາມຄິດທີ່ຢູ່ເບື້ອງຫລັງຄໍາແນະນໍາຂອງເຈົ້າ. ບໍ່ຈໍາເປັນຕ້ອງອະທິບາຍວ່າ singleton ແມ່ນຫຍັງຖ້າທ່ານຮູ້ຮູບແບບແລະຊື່ຂອງມັນ.

ການຈັດປະເພດຂອງຮູບແບບການອອກແບບ

ຮູບ​ແບບ​ການ​ອອກ​ແບບ​ແຕກ​ຕ່າງ​ກັນ​ໃນ​ຄວາມ​ສັບ​ສົນ​, ລະ​ດັບ​ຂອງ​ລາຍ​ລະ​ອຽດ​, ແລະ​ຂະ​ຫນາດ​ຂອງ​ການ​ນໍາ​ໃຊ້​ໃນ​ທົ່ວ​ລະ​ບົບ​ການ​ອອກ​ແບບ​.

ໂດຍການປຽບທຽບ, ພວກເຮົາສາມາດເຮັດໃຫ້ທາງແຍກມີຄວາມປອດໄພກວ່າໂດຍການຕິດຕັ້ງໄຟຈາລະຈອນຈໍານວນຫນ້ອຍຫນຶ່ງຫຼືການກໍ່ສ້າງທາງແຍກຫຼາຍລະດັບທັງຫມົດກັບທາງໃຕ້ດິນສໍາລັບຄົນຍ່າງ.

ແບບພື້ນຖານທີ່ສຸດ, ລະດັບຕ່ໍາແມ່ນມັກຈະເອີ້ນວ່າ ສຳນວນ . ປົກກະຕິແລ້ວພວກມັນໃຊ້ກັບພາສາການຂຽນໂປຼແກຼມດຽວເທົ່ານັ້ນ.

ຮູບແບບທົ່ວໄປທີ່ສຸດແລະລະດັບສູງແມ່ນ ຮູບແບບສະຖາປັດຕະຍະກໍາ . ນັກພັດທະນາສາມາດປະຕິບັດຮູບແບບເຫຼົ່ານີ້ໃນເກືອບທຸກພາສາ. ບໍ່ເຫມືອນກັບຮູບແບບອື່ນໆ, ພວກເຂົາສາມາດຖືກນໍາໃຊ້ເພື່ອອອກແບບສະຖາປັດຕະຍະກໍາຂອງຄໍາຮ້ອງສະຫມັກທັງຫມົດ.

ນອກຈາກນັ້ນ, ຮູບແບບທັງຫມົດສາມາດຖືກຈັດປະເພດຕາມຮູບແບບຂອງພວກເຂົາ ພະຍາຍາມ ຫຼືຈຸດປະສົງ. ສາມ​ຊັ້ນ​ຕົ້ນ​ຕໍ​ແມ່ນ​:

ຈົດໝາຍຂ່າວປະດິດສ້າງ
ຢ່າພາດຂ່າວທີ່ສໍາຄັນທີ່ສຸດກ່ຽວກັບການປະດິດສ້າງ. ລົງທະບຽນເພື່ອຮັບພວກມັນທາງອີເມວ.
  • ຮູບແບບການສ້າງສັນ ພວກເຂົາສະຫນອງກົນໄກການສ້າງວັດຖຸທີ່ເພີ່ມຄວາມຍືດຫຍຸ່ນແລະການນໍາໃຊ້ຄືນໃຫມ່ຂອງລະຫັດທີ່ມີຢູ່.
  • ຮູບແບບໂຄງສ້າງ ພວກເຂົາເຈົ້າອະທິບາຍວິທີການປະກອບວັດຖຸແລະຫ້ອງຮຽນເຂົ້າໄປໃນໂຄງສ້າງຂະຫນາດໃຫຍ່, ຮັກສາໂຄງສ້າງເຫຼົ່ານີ້ມີຄວາມຍືດຫຍຸ່ນແລະປະສິດທິພາບ.
  • ຕົວແບບພຶດຕິກຳ ພວກເຂົາຈັດການກັບການສື່ສານທີ່ມີປະສິດທິພາບແລະການມອບຫມາຍຄວາມຮັບຜິດຊອບລະຫວ່າງວັດຖຸ.

ຕົວຢ່າງຂອງການອອກແບບຮູບແບບໃນ Laravel: Facade

ອຳ ນວຍຄວາມສະດວກ ແມ່ນຮູບແບບການອອກແບບໂຄງສ້າງທີ່ສະຫນອງການໂຕ້ຕອບທີ່ງ່າຍດາຍໃຫ້ກັບຫ້ອງສະຫມຸດ, ກອບ, ຫຼືຊຸດຊັ້ນຮຽນທີ່ສັບສົນອື່ນໆ.

ບັນຫາ

ໃຫ້ສົມມຸດວ່າພວກເຮົາຈໍາເປັນຕ້ອງເຮັດໃຫ້ການເຮັດວຽກຂອງຊອບແວ, ອີງໃສ່ຊຸດຂະຫນາດໃຫຍ່ຂອງວັດຖຸທີ່ເປັນຂອງຫ້ອງສະຫມຸດຫຼືກອບທີ່ຊັບຊ້ອນ. ໂດຍປົກກະຕິ, ພວກເຮົາຈະຕ້ອງເລີ່ມຕົ້ນວັດຖຸເຫຼົ່ານີ້ທັງຫມົດ, ຕິດຕາມການເພິ່ງພາອາໄສ, ປະຕິບັດວິທີການໃນຄໍາສັ່ງທີ່ຖືກຕ້ອງ, ແລະອື່ນໆ.

ດັ່ງນັ້ນ, ເຫດຜົນທາງທຸລະກິດຂອງຫ້ອງຮຽນຈະກາຍເປັນຄູ່ກັນຢ່າງແຫນ້ນຫນາກັບລາຍລະອຽດການປະຕິບັດຂອງຊັ້ນຮຽນຂອງບຸກຄົນທີສາມ, ເຮັດໃຫ້ມັນຍາກທີ່ຈະເຂົ້າໃຈແລະການຄຸ້ມຄອງ.

ວິທີແກ້ໄຂ

Una facade ແມ່ນຫ້ອງຮຽນທີ່ສະຫນອງການໂຕ້ຕອບງ່າຍດາຍກັບລະບົບຍ່ອຍສະລັບສັບຊ້ອນທີ່ປະກອບດ້ວຍຫຼາຍພາກສ່ວນການເຄື່ອນຍ້າຍ. ກ facade ອາດຈະສະຫນອງການເຮັດວຽກທີ່ຈໍາກັດເມື່ອທຽບກັບການເຮັດວຽກໂດຍກົງກັບລະບົບຍ່ອຍ. ຢ່າງໃດກໍ່ຕາມ, ມັນພຽງແຕ່ປະກອບມີຄຸນສົມບັດທີ່ລູກຄ້າສົນໃຈແທ້ໆ.

ມີຫນຶ່ງ facade ມັນເປັນປະໂຫຍດໃນເວລາທີ່ພວກເຮົາຈໍາເປັນຕ້ອງໄດ້ປະສົມປະສານ app ກັບຫ້ອງສະຫມຸດທີ່ຊັບຊ້ອນທີ່ມີຫລາຍສິບລັກສະນະ, ແຕ່ພວກເຮົາຕ້ອງການພຽງແຕ່ສ່ວນຂະຫນາດນ້ອຍຂອງການເຮັດວຽກຂອງມັນ.

ຕົວຢ່າງ, ແອັບທີ່ອັບໂຫຼດວິດີໂອຕະຫຼົກສັ້ນກັບແມວໃສ່ສື່ສັງຄົມອາດຈະໃຊ້ຫ້ອງສະໝຸດການແປງວິດີໂອແບບມືອາຊີບໄດ້. ຢ່າງໃດກໍຕາມ, ທັງຫມົດທີ່ພວກເຮົາຕ້ອງການແມ່ນຫ້ອງຮຽນທີ່ມີວິທີການດຽວ encode(filename, format). ຫຼັງ​ຈາກ​ການ​ສ້າງ​ຫ້ອງ​ຮຽນ​ດັ່ງ​ກ່າວ​ແລະ​ການ​ເຊື່ອມ​ຕໍ່​ກັບ​ຫ້ອງ​ສະ​ຫມຸດ​ການ​ປ່ຽນ​ແປງ​ວິ​ດີ​ໂອ​, ພວກ​ເຮົາ​ຈະ​ມີ​ການ​ທໍາ​ອິດ​ຂອງ​ພວກ​ເຮົາ​ facade.

ຕົວຢ່າງ, ຜູ້ປະຕິບັດການໂທລະສັບຂອງສູນການໂທແມ່ນຄ້າຍຄື a facade. ໃນຄວາມເປັນຈິງ, ເມື່ອພວກເຮົາໂທຫາບໍລິການໂທລະສັບຂອງຮ້ານເພື່ອວາງຄໍາສັ່ງໂທລະສັບ, ຜູ້ປະກອບການແມ່ນຂອງພວກເຮົາ facade ຕໍ່ການບໍລິການ ແລະພະແນກການທັງໝົດຂອງຮ້ານ. ຜູ້ປະກອບການສະຫນອງການໂຕ້ຕອບສຽງທີ່ງ່າຍດາຍກັບລະບົບການສັ່ງຊື້, ປະຕູການຈ່າຍເງິນແລະການບໍລິການຈັດສົ່ງຕ່າງໆ.

ຕົວຢ່າງທີ່ແທ້ຈິງໃນ PHP

ຄິດກ່ຽວກັບ ອຳ ນວຍຄວາມສະດວກ ເປັນຕົວດັດແປງແບບງ່າຍດາຍສໍາລັບບາງລະບົບຍ່ອຍທີ່ສັບສົນ. Facade isolates ຄວາມຊັບຊ້ອນພາຍໃນຫ້ອງຮຽນດຽວແລະອະນຸຍາດໃຫ້ລະຫັດຄໍາຮ້ອງສະຫມັກອື່ນໆທີ່ຈະນໍາໃຊ້ການໂຕ້ຕອບງ່າຍດາຍ.

ໃນຕົວຢ່າງນີ້, Facade ເຊື່ອງຄວາມຊັບຊ້ອນຂອງຫ້ອງສະໝຸດ YouTube API ແລະ FFmpeg ຈາກລະຫັດລູກຄ້າ. ແທນທີ່ຈະເຮັດວຽກກັບຫລາຍສິບຫ້ອງຮຽນ, ລູກຄ້າໃຊ້ວິທີການງ່າຍໆໃນ 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

ຈົດໝາຍຂ່າວປະດິດສ້າງ
ຢ່າພາດຂ່າວທີ່ສໍາຄັນທີ່ສຸດກ່ຽວກັບການປະດິດສ້າງ. ລົງທະບຽນເພື່ອຮັບພວກມັນທາງອີເມວ.

Recent articles

Veeam ມີລັກສະນະສະຫນັບສະຫນູນທີ່ສົມບູນແບບທີ່ສຸດສໍາລັບ ransomware, ຈາກການປົກປ້ອງເຖິງການຕອບສະຫນອງແລະການຟື້ນຕົວ

Coveware ໂດຍ Veeam ຈະສືບຕໍ່ໃຫ້ບໍລິການຕອບໂຕ້ເຫດການ extortion cyber. Coveware ຈະສະ ເໜີ ຄວາມສາມາດດ້ານນິຕິສາດແລະການແກ້ໄຂ…

23 April 2024

ການປະຕິວັດສີຂຽວ ແລະ ດິຈິຕອລ: ວິທີການຮັກສາການຄາດເດົາແມ່ນການຫັນປ່ຽນອຸດສາຫະກຳນ້ຳມັນ ແລະອາຍແກັສ

ການຮັກສາການຄາດເດົາແມ່ນການປະຕິວັດຂະແໜງນ້ຳມັນ ແລະ ອາຍແກັສ, ດ້ວຍແນວທາງນະວັດຕະກໍາ ແລະ ຕັ້ງໜ້າໃນການຄຸ້ມຄອງພືດ.…

22 April 2024

ຜູ້ຄວບຄຸມການຕ້ານການໄວ້ວາງໃຈຂອງອັງກິດໄດ້ປຸກ BigTech ໃນໄລຍະ GenAI

CMA ຂອງອັງກິດໄດ້ອອກຄໍາເຕືອນກ່ຽວກັບພຶດຕິກໍາຂອງ Big Tech ໃນຕະຫຼາດປັນຍາປະດິດ. ຢູ່ທີ່ນັ້ນ…

18 April 2024

Casa Green: ການປະຕິວັດພະລັງງານເພື່ອອະນາຄົດທີ່ຍືນຍົງໃນອິຕາລີ

ດຳລັດ “Case Green” ທີ່​ສ້າງ​ຂຶ້ນ​ໂດຍ​ສະ​ຫະ​ພາບ​ເອີ​ລົບ ເພື່ອ​ຍົກ​ສູງ​ປະ​ສິດ​ທິ​ພາບ​ດ້ານ​ພະ​ລັງ​ງານ​ຂອງ​ຕຶກ​ອາ​ຄານ, ໄດ້​ສິ້ນ​ສຸດ​ຂະ​ບວນ​ການ​ນິ​ຕິ​ບັນ​ຍັດ​ຂອງ​ຕົນ​ດ້ວຍ…

18 April 2024

ອ່ານນະວັດຕະກໍາໃນພາສາຂອງເຈົ້າ

ຈົດໝາຍຂ່າວປະດິດສ້າງ
ຢ່າພາດຂ່າວທີ່ສໍາຄັນທີ່ສຸດກ່ຽວກັບການປະດິດສ້າງ. ລົງທະບຽນເພື່ອຮັບພວກມັນທາງອີເມວ.

ປະຕິບັດຕາມພວກເຮົາ