Gunakan polimorfisme untuk mengembalikan berbilang hasil dan menggunakan berbilang gelagat pada masa yang sama
P粉187677012
P粉187677012 2023-09-06 00:04:47
0
1
623
<p>Saya menggunakan Laravel 9 dan saya mempunyai permintaan yang mengandungi: </p> <ul> <li>Parameter bernama SEASON, nilai boleh menjadi <kod>array</code> Jadi parameter <code>SEASON</code> boleh menjadi <code>array</code> <li>Parameter bernama EXPIRY boleh sama ada <code>array</code> atau <code>null</code></li> </ul> <p>Saya mempunyai dua kelas, satu untuk fungsi <code>SEASON</code> dan satu untuk <code>EXPIRY</code>, kedua-duanya daripada <code>Repository</code> Kedua-duanya mempunyai kaedah yang dipanggil <code>execute</code> <pre class="brush:php;toolbar:false;">abstract class Repository { abstract public function execute(): tatasusunan; } Kelas Expiry memanjangkan Repositori { fungsi awam laksana () { return ['Permintaan mengandungi Parameter Tamat Tempoh, dan tingkah laku bermusim dilakukan']; } } kelas Musim memanjangkan Repositori { fungsi awam laksana () { return ['Permintaan mengandungi Parameter Musim, dan tingkah laku tamat tempoh telah dilakukan']; } }</pre> <p>Jika permintaan saya mengandungi SEASON, saya mahu memanggil kaedah laksana kelas Musim atau jika permintaan saya mengandungi Tamat, saya ingin memanggil kaedah laksana tamat tempoh. Atau hubungi mereka dan gabungkan pulangan pelaksanaan ke dalam tatasusunan supaya saya boleh mendapatkan hasilnya. </p> <pre class="brush:php;toolbar:false;">['Permintaan mengandungi Parameter Tamat Tempoh, dan tingkah laku bermusim selesai', 'Permintaan mengandungi Parameter Tamat Tempoh dan tingkah laku tamat tempoh telah dilakukan']</pre> ; <p>Inilah yang saya cuba dalam pengawal: </p> <pre class="brush:php;toolbar:false;">public function bootstrap($data) { $parseTopics = Pembantu::parseTopicsRequest(); $basicProgram = new BasicProgramRepository(); $seasonalProgram = new SeasonalProgramRepository($parseTopics['SEASONAL']); $objek = count($parseTopics['SEASONAL']) ? // Polimorfisme pulangkan $object->execute(); }</pre> <p>Soalan 1: Saya tidak pasti sama ada saya perlu menggunakan ini atau sesuatu yang serupa untuk menyelesaikan keperluan saya: </p> <pre class="brush:php;toolbar:false;">$employe = new Program(new BasicProgramRepository());</pre> <p>Hasil yang dijangkakan: Hasil yang dijangkakan bergantung pada sama ada saya mempunyai parameter musim dan masa tamat tempoh. Apa yang saya ingin capai ialah menggunakan tingkah laku yang berbeza (kaedah laksana)</p>
P粉187677012
P粉187677012

membalas semua(1)
P粉086993788

Jika anda ingin melaksanakan pendekatan polimorfik, lebih baik buat repositori atau sesuatu hanya untuk menguruskan logik itu.

Ini adalah contoh.

class SampleRepository
{
    /**
     * repository instance value
     *
     * @var string[] | null
     */
    private $sampleArray; // maybe here is SEASON or EXPIRY or null

    /**
     * constructor
     *
     * @param string[] | null $sampleArray
     */
    public function __construct($sampleArray)
    {
        $this->sampleArray = $sampleArray;
    }

    /**
     * execute like class interface role
     *
     * @return array
     */
    public function execute()
    {
        return (!$this->sampleArray) ? [] : $this->getResult();
    }

    /**
     * get result
     *
     * @return array
     */
    private function getResult()
    {
        // maybe pattern will be better to manage another class or trait.
        $pattern = [
            "SEASON" => new Season(),
            "EXPIRY" => new Expiry()
        ];
        return collect($this->sampleArray)->map(function($itemKey){
            $requestClass = data_get($pattern,$itemKey);
            if (!$requestClass){ // here is space you don't expect class or canIt find correct class
                return ["something wrong"];
            }
            return $requestClass->execute();
        })->flatten();
    }
}

Boleh panggil macam ni.

$sampleRepository  = new SampleRepository($sampleValue); // expect string[] or null like ["SEASON"],["SEASON","EXPIRY"],null
    $result = $sampleRepository->execute(); // [string] or [string,string] or []

Kaedah ini hanya berfungsi dengan nilai parameter anda yang ditentukan. Jika keputusan pulangan kelas Musim dan kelas Tamat tempoh adalah hampir sama, adalah lebih baik untuk mengurusnya mengikut ciri. (iaitu $pattern dalam kod contoh)

Cuba sikit.

Saya baca komen, jadi ikuti..

Sebagai contoh, ia lebih suka hanya mendapatkan hasil getResult(). Oleh itu, corak tertentu dan banyak logik tidak boleh ditulis pada getResult();

Jika anda menggunakan ciri, berikut adalah contoh. Pertama, anda perlu mencipta kelas tingkah laku pengurusan.

kelakuan.php

<?php 
namespace App\Repositories;

class Behavior
{
    use Behavior\BehaviorTrait;
    // if you need to add another pattern, you can add trait here.
}

Kemudian, anda perlu mencipta direktori Gelagat pada tahap yang sama. Apabila anda mengalihkan direktori ini, anda mencipta fail tandatangan sedemikian.

<?php

namespace App\Repositories\Behavior;

trait BehaviorTrait
{
    public static function findAccessibleClass(string $itemKey)
    {
      return data_get([
        "SEASON" => new Season(),
        "EXPIRY" => new Expiry()
      ],$itemKey);
    }
}
Kaedah

findAccessibleClass() bertanggungjawab untuk mencari kelas yang betul.

Kemudian, anda boleh memanggil kaedah ini seperti ini.

private function getResult()
    {
        return collect($this->sampleArray)->map(function($itemKey){
            $requestClass = Behavior::findAccessibleClass($itemKey); // fix here.
            if (!$requestClass){ // here is space you don't expect class or canIt find correct class
                return ["something wrong"];
            }
            return $requestClass->execute();
        })->flatten();
    }

Jika terdapat terlalu banyak kod dalam getResult(), adalah lebih baik untuk memisahkan kod yang bertanggungjawab.

Untuk mencipta Trait Tingkah Laku, getResult tidak perlu bertanggungjawab terhadap logik tingkah laku. Pendek kata, ia akan menjadi mudah untuk diuji atau diperbaiki.

Semoga semuanya berjalan lancar.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan