Gunakan polimorfisme untuk mengembalikan berbilang hasil dan menggunakan berbilang gelagat pada masa yang sama
P粉187677012
2023-09-06 00:04:47
<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>
Jika anda ingin melaksanakan pendekatan polimorfik, lebih baik buat repositori atau sesuatu hanya untuk menguruskan logik itu.
Ini adalah contoh.
Boleh panggil macam ni.
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
Kemudian, anda perlu mencipta direktori Gelagat pada tahap yang sama. Apabila anda mengalihkan direktori ini, anda mencipta fail tandatangan sedemikian.
KaedahfindAccessibleClass() bertanggungjawab untuk mencari kelas yang betul.
Kemudian, anda boleh memanggil kaedah ini seperti ini.
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.