लक्षण रचना करने का एक और तरीका है। उन्हें संकलित समय (या JIT संकलन समय) पर कक्षा के सभी भागों की रचना करने के तरीके के रूप में सोचें, उन भागों के ठोस कार्यान्वयन को इकट्ठा करना होगा जिनकी आपको आवश्यकता होगी।
मूल रूप से, आप विशेषताओं का उपयोग करना चाहते हैं जब आप अपने आप को सुविधाओं के विभिन्न संयोजनों के साथ कक्षाएं बनाते हुए पाते हैं। यह स्थिति सबसे अधिक बार दूसरों के उपभोग के लिए लचीली लाइब्रेरी लिखने वाले लोगों के लिए आती है। उदाहरण के लिए, हाल ही में ScalaTest का उपयोग करते हुए मैंने एक इकाई परीक्षण वर्ग की घोषणा की है :
class TestMyClass
extends WordSpecLike
with Matchers
with MyCustomTrait
with BeforeAndAfterAll
with BeforeAndAfterEach
with ScalaFutures
यूनिट टेस्ट फ्रेमवर्क में अलग-अलग कॉन्फ़िगरेशन विकल्पों का एक टन होता है, और हर टीम की अलग-अलग प्राथमिकताएं होती हैं कि वे कैसे चीजें करना चाहते हैं। विकल्पों को लक्षणों में डालकर (जो with
स्काला में उपयोग में मिलाया जाता है ), स्कैलेस्ट उन सभी विकल्पों की पेशकश कर सकता है जैसे कि कक्षा के नाम WordSpecLikeWithMatchersAndFutures
, या एक रनटाइम बूलियन झंडे का एक टन बनाने के बिना WordSpecLike(enableFutures, enableMatchers, ...)
। इससे ओपन / बंद सिद्धांत का पालन करना आसान हो जाता है । आप नई विशेषताओं को जोड़ सकते हैं, और नई विशेषताओं को जोड़कर, बस एक नया लक्षण जोड़ सकते हैं। यह इंटरफ़ेस अलगाव सिद्धांत का पालन करना भी आसान बनाता है , क्योंकि आप आसानी से एक विशेषता में सार्वभौमिक रूप से आवश्यक कार्यों को नहीं डाल सकते हैं।
लक्षण भी कई वर्गों में सामान्य कोड डालने का एक अच्छा तरीका है जो एक विरासत पदानुक्रम साझा करने के लिए समझ में नहीं आता है। इनहेरिटेंस एक बहुत ही कसौटी भरा रिश्ता है, और अगर आप इसकी मदद कर सकते हैं तो आपको उस कीमत का भुगतान नहीं करना चाहिए। लक्षण एक बहुत अधिक शिथिल-युग्मित संबंध हैं। ऊपर मेरे उदाहरण में, मैं MyCustomTrait
आसानी से कई अन्यथा असंबंधित परीक्षण कक्षाओं के बीच एक नकली डेटाबेस कार्यान्वयन को साझा करता था।
निर्भरता इंजेक्शन कई समान लक्ष्यों को प्राप्त करता है, लेकिन प्रोग्रामर इनपुट के आधार पर संकलन समय के बजाय उपयोगकर्ता इनपुट के आधार पर रनटाइम। लक्षण भी निर्भरता के लिए अधिक अभिप्रेत हैं जो एक ही वर्ग के शब्दार्थ हैं। आप अन्य जिम्मेदारियों के साथ अन्य कक्षाओं के लिए कॉल करने के बजाय एक वर्ग के हिस्सों को इकट्ठा करने के लिए तैयार हैं।
डिपेंडेंसी इंजेक्शन फ्रेमवर्क प्रोग्रामर इनपुट के आधार पर संकलन समय पर समान लक्ष्यों में से कई को प्राप्त करते हैं, लेकिन उचित विशेषता समर्थन के बिना प्रोग्रामिंग भाषाओं के लिए मोटे तौर पर एक वैकल्पिक हल हैं। लक्षण इन आश्रितों को संकलक निर्माण प्रक्रिया के साथ क्लीनर सिंटैक्स के साथ संकलक के प्रकार के दायरे में लाते हैं, जो संकलन-समय और रनटाइम निर्भरता के बीच अधिक स्पष्ट अंतर बनाता है।