Laravel: ความแตกต่างระหว่างการใช้ Trait หรือการขยายโมเดล

เรากำลังทำงานกับแอปพลิเคชัน Laravel พร้อมโมดูลการกำหนดเวลา โมดูลนี้มีชั้นเรียนสามประเภทที่สามารถจัดไว้ในวาระการประชุมได้: งาน กิจกรรม และแผนก ดังนั้นเราจึงได้ไดอะแกรมคลาสต่อไปนี้: Class Diagram คำถามของเรา: หากเราเข้าใจแผนภาพนี้ เราควรใช้ Trait หรือควรขยาย Plannable Model

โมเดลที่วางแผนได้:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Plannable extends Model
{
    // Code
}

รูปแบบงาน:

<?php

namespace App;

use App\Plannable;

class Task extends Plannable
{
    // Code
}

หรือเราควรใช้สิ่งนี้เป็นลักษณะ:

ลักษณะที่วางแผนได้:

<?php

namespace App\Traits;

trait Plannable
{
    // Code
}

รูปแบบงาน:

<?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 แหล่งที่มา
comment
คุณเคยพิจารณาใช้ความสัมพันธ์แบบ polymorphic ของ laravel หรือไม่? ฉันไม่แน่ใจว่าคุณกำลังพยายามทำอะไรให้สำเร็จด้วยคุณสมบัตินี้ laravel.com/docs/5.8/   -  person FunkyMonk91    schedule 21.05.2019
comment
ฉันโหวตเป็นครั้งที่สองสำหรับความสัมพันธ์แบบหลายรูปแบบ   -  person ceejayoz    schedule 21.05.2019
comment
ไม่ ฉันไม่ได้พยายามที่จะมีความสัมพันธ์ ฉันต้องการป้องกันไม่ให้รหัสซ้ำกันในทั้ง 3 รุ่น   -  person Lex de Willigen    schedule 21.05.2019


คำตอบ (2)


การขยายคลาสพาเรนต์/คลาสนามธรรมจะใช้ได้ดีที่สุดเมื่อโมเดลทั้งหมดมี ลักษณะเฉพาะ ร่วมกัน แต่มีพฤติกรรม (ฟังก์ชัน) ในลักษณะเฉพาะ ตัวอย่างเช่น Cars และ Motorcycles ต่างก็เป็น Vehicles มีลักษณะที่เหมือนกัน (เช่น ไฟหน้า ไฟเลี้ยว เครื่องยนต์ ระบบส่งกำลัง ฯลฯ) แต่วิธีการ operate() มีลักษณะเฉพาะในแต่ละคลาส

ในทางกลับกัน คุณลักษณะจะถูกใช้ดีกว่าเมื่อคลาสการใช้งาน (หรือโมเดล Eloquent ในกรณีนี้) ต้องการ ฟังก์ชันการทำงาน ทั่วไป (เช่น วิธีการ) แม้ว่าจะมีคุณลักษณะที่แตกต่างกันก็ตาม

โดยไม่ทราบข้อมูลเพิ่มเติมเกี่ยวกับโปรเจ็กต์ของคุณ ดูเหมือนว่าคุณกำลังมองหารุ่นหลังโดยแต่ละรุ่นมีฟังก์ชันการทำงานที่เหมือนกัน (อาจเป็น addToCalendar(), reschedule() ฯลฯ) แม้ว่าจะมีคุณลักษณะที่แตกต่างกันก็ตาม

person Erich    schedule 26.07.2019

เมื่อคุณพยายามที่จะขยายคลาส หมายความว่า "เป็น" ความสัมพันธ์ Car ขยายยานพาหนะ Car "คือ" ยานพาหนะ ในตัวอย่างของคุณ งาน "คือ" ที่วางแผนได้ ใช่มั้ยล่ะ?

ในทางกลับกัน ลักษณะจะใช้แนวทางที่แตกต่างกัน เช่น "รถยนต์ใช้ล้อ" ในตัวอย่างของคุณอีกครั้ง Task ใช้ Plannable ดูดีกว่าการขยายฉันเดา?

มันยากที่จะพูดมากกว่านี้โดยไม่เข้าใจว่าฟังก์ชันใดที่คุณจะมีลักษณะเฉพาะสำหรับการใช้งานนี้ ฉันหวังว่ามันจะช่วยให้มีความคิดบางอย่าง

person Yavuz Koca    schedule 21.05.2019
comment
การเปรียบเทียบที่ดี สิ่งที่ฉันพยายามทำให้สำเร็จมีดังต่อไปนี้: ฉันต้องการสร้างโค้ดทั่วไปที่ใช้ได้กับทุกรุ่นที่สามารถใส่ไว้ในปฏิทินได้ ฉันต้องการป้องกันไม่ให้เขียนโค้ดเดียวกันในทั้งสามโมเดลแยกกัน - person Lex de Willigen; 21.05.2019