Laravel: perbedaan antara menggunakan Trait atau memperluas model

Kami sedang mengerjakan aplikasi Laravel dengan modul penjadwalan. Modul ini memiliki tiga jenis kelas yang dapat dimasukkan ke dalam agenda: Tugas, Acara, dan Departemen. Oleh karena itu kami membuat diagram kelas berikut: Diagram Kelas Sekarang, pertanyaan kita: jika kita ingin merealisasikan diagram ini, haruskah kita menggunakan Trait atau memperluas model Plannable.

Model yang dapat direncanakan:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Plannable extends Model
{
    // Code
}

Model tugas:

<?php

namespace App;

use App\Plannable;

class Task extends Plannable
{
    // Code
}

Atau haruskah kita menggunakan ini sebagai sifat:

Sifat yang dapat direncanakan:

<?php

namespace App\Traits;

trait Plannable
{
    // Code
}

Model tugas:

<?php

namespace App;

use App\Plannable;
use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    use Plannable;
    // Code
}

person Lex de Willigen    schedule 21.05.2019    source sumber
comment
Sudahkah Anda mempertimbangkan untuk menggunakan hubungan polimorfik laravel? Saya tidak yakin apa yang ingin Anda capai dengan sifat tersebut. laravel.com/docs/5.8/   -  person FunkyMonk91    schedule 21.05.2019
comment
Saya mendukung pemungutan suara untuk hubungan polimorfik.   -  person ceejayoz    schedule 21.05.2019
comment
Tidak, aku tidak mencoba menjalin hubungan. Saya ingin mencegah duplikat kode di ketiga model   -  person Lex de Willigen    schedule 21.05.2019


Jawaban (2)


Memperluas kelas induk/abstrak paling baik digunakan ketika semua model memiliki karakteristik yang sama tetapi berperilaku (berfungsi) dengan cara yang unik. Misalnya, Cars dan Motorcycles keduanya Vehicles. Keempatnya memiliki karakteristik yang sama (misalnya lampu depan, indikator, mesin, transmisi, dll.), namun cara menggunakannya unik dari satu kelas ke kelas lainnya.

Sifat, di sisi lain, lebih baik digunakan ketika kelas penggunaan (atau model Eloquent dalam hal ini) memerlukan fungsi (yaitu metode) yang umum meskipun memiliki karakteristik yang berbeda.

Tanpa mengetahui lebih banyak tentang proyek Anda, sepertinya Anda mencari yang terakhir dengan masing-masing model memiliki fungsi yang sama (mungkin addToCalendar(), reschedule(), dll.) meskipun memiliki karakteristik yang berbeda.

person Erich    schedule 26.07.2019

Ketika Anda mencoba untuk memperluas suatu kelas, berarti relasi "adalah", Mobil memperluas Kendaraan, Mobil "adalah" Kendaraan. Dalam contoh Anda, Tugas "adalah" Dapat Direncanakan. Apakah itu benar?

Di sisi lain, ciri-ciri menggunakan pendekatan yang berbeda, seperti "Mobil menggunakan roda". Dalam contoh Anda lagi, Tugas menggunakan Plannable. Sepertinya lebih baik daripada memanjang?

Sulit untuk mengatakan lebih banyak tanpa memahami fungsi mana yang akan Anda gunakan untuk implementasi ini. Saya harap, ini memberi beberapa ide.

person Yavuz Koca    schedule 21.05.2019
comment
Perbandingan yang bagus. Apa yang ingin saya capai adalah sebagai berikut: Saya ingin membuat beberapa kode umum yang berlaku untuk semua model yang dapat ditempatkan di kalender. Saya ingin mencegah penulisan kode yang sama di ketiga model terpisah - person Lex de Willigen; 21.05.2019