ลักษณะเป็นอีกวิธีหนึ่งในการแต่งเพลง คิดว่าพวกเขาเป็นวิธีในการเขียนทุกส่วนของชั้นเรียนในเวลารวบรวม (หรือเวลารวบรวม JIT), การประกอบการใช้งานที่เป็นรูปธรรมของชิ้นส่วนที่คุณจะต้อง
โดยทั่วไปคุณต้องการใช้คุณลักษณะเมื่อคุณพบว่าตัวเองกำลังเรียนอยู่กับการผสมผสานคุณสมบัติที่แตกต่างกัน สถานการณ์นี้เกิดขึ้นบ่อยที่สุดสำหรับคนที่เขียนไลบรารีที่ยืดหยุ่นให้ผู้อื่นใช้ ตัวอย่างเช่นนี่คือการประกาศของคลาสทดสอบหน่วยที่ฉันเขียนเมื่อเร็ว ๆ นี้โดยใช้ScalaTest :
class TestMyClass
extends WordSpecLike
with Matchers
with MyCustomTrait
with BeforeAndAfterAll
with BeforeAndAfterEach
with ScalaFutures
หน่วยกรอบทดสอบมีตันของตัวเลือกการกำหนดค่าที่แตกต่างกันและทุกคนในทีมมีการตั้งค่าที่แตกต่างกันเกี่ยวกับวิธีที่พวกเขาต้องการที่จะทำสิ่ง โดยการใส่ตัวเลือกไว้ในลักษณะ (ซึ่งมีการผสมในการใช้งานwith
ใน Scala), ScalaTest สามารถเสนอตัวเลือกเหล่านั้นทั้งหมดโดยไม่ต้องสร้างชื่อคลาสเช่นWordSpecLikeWithMatchersAndFutures
หรือแฟล็กบูลีนรันไทม์จำนวนWordSpecLike(enableFutures, enableMatchers, ...)
มากเช่น นี้จะทำให้มันง่ายที่จะปฏิบัติตามการเปิด / ปิดหลักการ คุณสามารถเพิ่มฟีเจอร์ใหม่และการผสมผสานฟีเจอร์ใหม่ ๆ ได้ง่ายๆเพียงเพิ่มคุณสมบัติใหม่ นอกจากนี้ยังทำให้ง่ายต่อการปฏิบัติตามหลักการแยกส่วนต่อประสานเนื่องจากคุณสามารถใส่ฟังก์ชั่นที่ไม่ต้องการในระดับสากลได้อย่างง่ายดาย
คุณลักษณะยังเป็นวิธีที่ดีในการใส่รหัสทั่วไปลงในคลาสที่ไม่เหมาะสมที่จะแชร์ลำดับชั้นการสืบทอด การรับมรดกเป็นความสัมพันธ์ที่แน่นแฟ้นมากและคุณไม่ควรจ่ายค่านั้นถ้าคุณสามารถช่วยได้ ลักษณะเป็นความสัมพันธ์แบบคู่มากขึ้นอย่างอิสระ ในตัวอย่างของฉันข้างต้นฉันเคยMyCustomTrait
แบ่งปันการใช้ฐานข้อมูลจำลองระหว่างคลาสการทดสอบที่ไม่เกี่ยวข้องหลายคลาสอย่างง่ายดาย
การฉีดขึ้นอยู่กับการบรรลุเป้าหมายเดียวกันหลายอย่าง แต่ที่รันไทม์บนพื้นฐานของผู้ใช้แทนการรวบรวมในเวลาที่ขึ้นอยู่กับการป้อนข้อมูลโปรแกรมเมอร์ คุณลักษณะนี้มีจุดประสงค์เพิ่มเติมเพื่อการอ้างอิงที่เป็นส่วนหนึ่งของคลาสเดียวกัน คุณกำลังรวบรวมชิ้นส่วนของชั้นหนึ่งมากกว่าจะโทรออกไปเรียนอื่นที่มีความรับผิดชอบอื่น
กรอบการฉีดขึ้นอยู่กับการบรรลุเป้าหมายเดียวกันจำนวนมากในเวลารวบรวมขึ้นอยู่กับการป้อนข้อมูลของโปรแกรมเมอร์ แต่ส่วนใหญ่จะเป็นวิธีการแก้ปัญหาสำหรับการเขียนโปรแกรมภาษาโดยไม่มีการสนับสนุนลักษณะที่เหมาะสม ลักษณะนำการพึ่งพาเหล่านี้เข้าสู่ขอบเขตของตัวตรวจสอบชนิดของคอมไพเลอร์พร้อมกับไวยากรณ์ที่สะอาดขึ้นด้วยกระบวนการสร้างที่ง่ายขึ้นซึ่งทำให้ความแตกต่างที่ชัดเจนยิ่งขึ้นระหว่างการพึ่งพาเวลาคอมไพล์กับไทม์