ควรใช้คุณลักษณะใดเมื่อเทียบกับการสืบทอดและองค์ประกอบ


9

AFAIK มีสามวิธีทั่วไปในการนำความสามารถในการนำมาใช้ใหม่มาใช้กับ OOP

  1. มรดก: มักจะเป็นตัวแทนของ - ความสัมพันธ์ (เป็นเป็ด - นก)
  2. ส่วนประกอบ: โดยปกติแล้วจะเป็นตัวแทนของความสัมพันธ์แบบมี (รถยนต์มีเครื่องยนต์)
  3. ลักษณะ (เช่นคำสำคัญของคุณลักษณะใน PHP): ... ไม่แน่ใจเกี่ยวกับสิ่งนี้จริงๆ

ในขณะที่ฉันรู้สึกว่าลักษณะสามารถใช้ทั้งความสัมพันธ์แบบ a และ a - a แต่ฉันไม่แน่ใจจริง ๆ ว่าแบบจำลองนั้นมีไว้สำหรับอะไร ลักษณะของสถานการณ์แบบใดที่ออกแบบมาเพื่อ?


คุณอาจอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับคุณลักษณะ แต่คุณลักษณะอาจเป็นอีกคำหนึ่งสำหรับการแต่งเพลงได้หรือไม่
Trilarion


1
ฉันอยากรู้ว่าทำไมเหมือนกัน ยังไม่เคยใช้เลย
Andy

คำตอบ:


6

ลักษณะเป็นอีกวิธีหนึ่งในการแต่งเพลง คิดว่าพวกเขาเป็นวิธีในการเขียนทุกส่วนของชั้นเรียนในเวลารวบรวม (หรือเวลารวบรวม JIT), การประกอบการใช้งานที่เป็นรูปธรรมของชิ้นส่วนที่คุณจะต้อง

โดยทั่วไปคุณต้องการใช้คุณลักษณะเมื่อคุณพบว่าตัวเองกำลังเรียนอยู่กับการผสมผสานคุณสมบัติที่แตกต่างกัน สถานการณ์นี้เกิดขึ้นบ่อยที่สุดสำหรับคนที่เขียนไลบรารีที่ยืดหยุ่นให้ผู้อื่นใช้ ตัวอย่างเช่นนี่คือการประกาศของคลาสทดสอบหน่วยที่ฉันเขียนเมื่อเร็ว ๆ นี้โดยใช้ScalaTest :

class TestMyClass
  extends WordSpecLike
  with Matchers
  with MyCustomTrait
  with BeforeAndAfterAll
  with BeforeAndAfterEach
  with ScalaFutures

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

คุณลักษณะยังเป็นวิธีที่ดีในการใส่รหัสทั่วไปลงในคลาสที่ไม่เหมาะสมที่จะแชร์ลำดับชั้นการสืบทอด การรับมรดกเป็นความสัมพันธ์ที่แน่นแฟ้นมากและคุณไม่ควรจ่ายค่านั้นถ้าคุณสามารถช่วยได้ ลักษณะเป็นความสัมพันธ์แบบคู่มากขึ้นอย่างอิสระ ในตัวอย่างของฉันข้างต้นฉันเคยMyCustomTraitแบ่งปันการใช้ฐานข้อมูลจำลองระหว่างคลาสการทดสอบที่ไม่เกี่ยวข้องหลายคลาสอย่างง่ายดาย

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

กรอบการฉีดขึ้นอยู่กับการบรรลุเป้าหมายเดียวกันจำนวนมากในเวลารวบรวมขึ้นอยู่กับการป้อนข้อมูลของโปรแกรมเมอร์ แต่ส่วนใหญ่จะเป็นวิธีการแก้ปัญหาสำหรับการเขียนโปรแกรมภาษาโดยไม่มีการสนับสนุนลักษณะที่เหมาะสม ลักษณะนำการพึ่งพาเหล่านี้เข้าสู่ขอบเขตของตัวตรวจสอบชนิดของคอมไพเลอร์พร้อมกับไวยากรณ์ที่สะอาดขึ้นด้วยกระบวนการสร้างที่ง่ายขึ้นซึ่งทำให้ความแตกต่างที่ชัดเจนยิ่งขึ้นระหว่างการพึ่งพาเวลาคอมไพล์กับไทม์


สวัสดีนี่เป็นคำตอบที่ดีมาก ฉันขอให้ฉันตัดสินใจได้อย่างไรว่าจะใช้ลักษณะนิสัยอย่างไรและเมื่อใดควรใช้การฉีดแบบพึ่งพา ซึ่งดูเหมือนว่าจะประสบความสำเร็จเหมือนกัน
Extrakun

การสังเกตอย่างชาญฉลาด ดูการแก้ไขของฉัน
Karl Bielefeldt

ขอขอบคุณที่เขียนสิ่งนี้ ฉันอยากรู้เกี่ยวกับคำตอบของคุณเกี่ยวกับลักษณะการเป็นองค์ประกอบ @KarlBielefeldt ชั้นเรียนของคุณสามารถใช้งานได้ทุกที่ที่คุณต้องการและคุณจะยังคงประสบกับความเปราะบางเช่นเดียวกับอินเทอร์เฟซปกติ ดังนั้นดูเหมือนว่าจะใกล้เคียงกับการพิมพ์ย่อยและการสืบทอดไม่ใช่หรือ? ฉันยังไม่แน่ใจว่ามันคล้ายกับ DI ... หรือไม่หากคุณมีคลาสที่กำหนดไว้หลายอย่างซึ่งขยายคุณสมบัติแล้วการอ้างอิงที่เป็นรูปธรรมเหล่านั้นจะไม่ถูกกำหนดไม่ว่าจะอยู่ที่ใดในลำดับชั้นที่กำหนดคลาสนั้น รหัส? ขอบคุณ!
allstar

คุณลักษณะสามารถใช้งานได้เหมือนอินเทอร์เฟซสำหรับคุณสมบัติการสืบทอด แต่นั่นไม่ใช่สิ่งที่ทำให้พวกเขาไม่เหมือนใคร withผู้ประกอบการเป็นสิ่งที่แตกต่างพวกเขาและwithเป็นงานองค์ประกอบ และใช่คุณลักษณะแทนที่ DI โดยไม่จำเป็นต้องกำหนดไว้ที่จุดเริ่มต้นของรหัส นั่นเป็นหนึ่งในสิ่งที่ทำให้พวกเขาชอบในความคิดของฉัน
Karl Bielefeldt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.