विशेषता (कंप्यूटर प्रोग्रामिंग)
कंप्यूटर प्रोग्रामिंग में, ट्रैट प्रोग्रामिंग भाषा में प्रयुक्त एक अवधारणा है जो विधि (कंप्यूटर प्रोग्रामिंग) के एक सेट का प्रतिनिधित्व करती है जिसका उपयोग क्लास (कंप्यूटर विज्ञान) की कार्यक्षमता बढ़ाने के लिए किया जा सकता है।[1][2]
तर्क
वस्तु-उन्मुख प्रोग्रामिंग में, व्यवहार कभी-कभी उन क्लासेस के बीच साझा किया जाता है जो एक दूसरे से संबंधित नहीं होते हैं। उदाहरण के लिए, कई असंबद्ध क्लासेस में ऑब्जेक्ट को जेएसओएन में क्रमबद्ध करने के तरीके हो सकते हैं। ऐतिहासिक रूप से, व्यवहार की आवश्यकता वाले प्रत्येक क्लास में कोड को अनुलिपि किए बिना इसे हल करने के लिए कई दृष्टिकोण रहे हैं। अन्य तरीकों में एकाधिक इन्हेरिटेन्स और मिक्सिन सम्मिलित हैं, लेकिन इनमें कमियां हैं: कोड का व्यवहार अप्रत्याशित रूप से बदल सकता है यदि मिक्सिन प्रयुक्त करने के क्रम में बदलाव किया जाता है, या यदि पैरेंट क्लास या मिक्सिन में नए तरीके जोड़े जाते हैं।
ट्रेट इन समस्याओं को क्लासेस को ट्रैट का उपयोग करने और वांछित व्यवहार प्राप्त करने की स्वीकृति देकर संशोधन करते हैं। यदि एक क्लास एक से अधिक ट्रैट का उपयोग करता है, तो जिस क्रम में ट्रैट का उपयोग किया जाता है, उससे कोई अंतर नहीं होता है। ट्रैट द्वारा प्रदान की गई विधियों की क्लास के डेटा तक प्रत्यक्ष रूप से अभिगम्य है।
विशेषताएं
ट्रेट प्रोटोकॉल (इंटरफेस) और मिक्सिन के स्वरूपों को जोड़ते हैं। एक इंटरफ़ेस की तरह, एक ट्रैट एक या एक से अधिक फंक्शन प्रोटोटाइप को परिभाषित करती है, जिनमें से प्रयुक्त करने वाली क्लासेस को कार्यान्वयन प्रदान करना चाहिए। एक मिक्सिन की तरह, एक ट्रैट कार्यान्वयन क्लास के लिए अतिरिक्त व्यवहार प्रदान करती है।
विभिन्न गुणों द्वारा प्रदान की गई विधियों के बीच नामकरण संघट्टन के स्थिति में, प्रोग्रामर को स्पष्ट रूप से स्पष्ट करना चाहिए कि क्लास में इनमें से कौन सी विधियों का उपयोग किया जाएगा; इस प्रकार एकाधिक इन्हेरिटेन्स की हीरक की समस्या को मैन्युअल रूप से संशोधन करना। यह वस्तु-उन्मुख प्रोग्रामिंग में अन्य रचना विधियों से अलग है, जहां परस्पर विरोधी नाम स्कूपिंग (कम्प्यूटर विज्ञान) नियमों द्वारा स्वचालित रूप से संशोधित हो जाते हैं।
संचालन जो ट्रैट के साथ किए जा सकते हैं उनमें सम्मिलित हैं:[3][4]
- सममित योग: एक संचालक जो एक नई ट्रैट बनाने के लिए दो अलग-अलग ट्रैट को मिलाता है
- ओवरराइड (या असममित योग): संचालक जो किसी सम्मिलित ट्रैट में विधियों को जोड़कर एक नई ट्रैट बनाता है, संभवतः इसके कुछ तरीकों को ओवरराइड करता है
- अन्य नाम: एक संचालक जो सम्मिलित पद्धति के लिए एक नया नाम जोड़कर एक नया ट्रैट बनाता है
- बहिष्करण: एक संचालक जो किसी सम्मिलित ट्रैट से एक विधि को हटाकर एक नया ट्रैट बनाता है। इसे उपनाम संचालक के साथ जोड़कर एक उथला नाम बदलें संचालक उत्पन्न होता है।
यदि किसी ट्रैट से किसी विधि को बाहर रखा गया है, तो वह विधि उस क्लास द्वारा प्रदान की जानी चाहिए जो ट्रैट का उपभोग करती है, या उस क्लास के पैरेंट क्लास द्वारा करता है। ऐसा इसलिए है क्योंकि ट्रैट द्वारा प्रदान की गई विधियाँ बहिष्कृत विधि कह सकती हैं।
ट्रैट रचना क्रमविनिमेय है अर्थात दिए गए ट्रैट A और B, A + B, B + A के समतुल्य हैं और साहचर्य अर्थात दिए गए ट्रेट A, B, और C, (A + B) + C, A + (B +) के समतुल्य C है।[1]
सीमाएं
जबकि ट्रेट कई विकल्पों पर महत्वपूर्ण लाभ प्रदान करते हैं, उनकी अपनी सीमाएँ होती हैं।
आवश्यक विधि
यदि एक ट्रेट के लिए उपभोग करने वाले क्लास को कुछ तरीके प्रदान करने की आवश्यकता होती है, तो ट्रैट यह नहीं पहचान सकती है कि क्या वे विधियाँ ट्रेट की आवश्यकताओ के लिए सेमेन्टिक समानता हैं। पीईआरएल जैसी कुछ गतिशील भाषाओं के लिए, आवश्यक विधि को केवल एक विधि नाम से पहचाना जा सकता है, पूर्ण प्रकार के हस्ताक्षर से नहीं, जिससे यह प्रत्याभूति देना कठिन हो जाता है कि आवश्यक विधि उपयुक्त है।
बहिष्करण विधि
यदि किसी ट्रैट से किसी विधि को बाहर रखा जाता है, तो वह विधि ट्रैट के लिए एक 'आवश्यक' विधि बन जाती है क्योंकि ट्रैट के अन्य तरीके इसे कॉल कर सकते हैं।
समर्थित भाषाएँ
ट्रेट मूल रूप से प्रोग्रामिंग लैंग्वेज स्वयं (प्रोग्रामिंग भाषा) से आते हैं[5] और निम्नलिखित प्रोग्रामिंग भाषाओं द्वारा समर्थित हैं:
- एम्बिएंट टॉक: सेल्फ ट्रेट्स (ऑब्जेक्ट-आधारित एकाधिक इनहेरिटेंस) और स्मॉलटाक के स्क्वीक ट्रेट्स (प्रोग्रामर द्वारा ट्रेट की स्पष्ट संयोजन की आवश्यकता) के गुणों को जोड़ती है। यह ट्रैट के अंदर स्थिति को सक्षम करने के लिए स्टेटफुल और फ्रीज़ेबल ट्रैट पर शोध पर आधारित है, जिसकी पहली परिभाषाओं में स्वीकृति नहीं थी।[6]
- C # (प्रोग्रामिंग भाषा): संस्करण 8.0 के बाद से, C# में डिफ़ॉल्ट इंटरफ़ेस विधियों के लिए समर्थन है,[7] जिनमें कुछ विशेष गुण होते हैं।[8]
- C++: जेनेरिक कंटेनर क्लासेस[9][10] और बूस्ट टाइपट्रैट्स लाइब्रेरी[11] को समर्थन करने के लिए मानक टेम्प्लेट लाइब्रेरी और C++ मानक लाइब्रेरी में उपयोग किया जाता है।
- सीयूआरएल (प्रोग्रामिंग भाषा) : मिक्सिन्स के रूप में एब्स्ट्रेक्ट क्लास विधि कार्यान्वयन की स्वीकृति देता है और इस प्रकार दूसरे नाम से ट्रेट बनाता है।[citation needed]
- D (प्रोग्रामिंग भाषा): संस्करण 2.003 के बाद से, ट्रैट भाषा विस्तार[12] और एसटीडी ट्रेट्स मॉड्यूल[13] सहायक टेम्प्लेट संकलन-समय ट्रेट प्रदान करते हैं। अन्य भाषा सुविधाओं (विशेष रूप से टेम्प्लेट और मिक्सिन) के साथ, वे इंटरफेस और प्रकारों के आधार पर सामान्य स्वचालित पीढ़ी के तरीकों की स्वीकृति देते हैं। D कई मेम्बर क्लासेस को अग्रेषित करने सहित मेम्बर विधियों और वेरिएबल के स्पष्ट अलियासिंग की भी स्वीकृति देता है।[14]
- फोरटेस (प्रोग्रामिंग भाषा)[15]
- ग्रूवी (प्रोग्रामिंग भाषा): संस्करण 2.3 के बाद से[16]
- हास्केल (प्रोग्रामिंग भाषा): हास्केल में, ट्रैट को टाइप क्लास के रूप में जाना जाता है।
- हैक्स : संस्करण 2.4.0 के बाद से[17] स्थैतिक एक्सटेंशन कहा जाता है[18] यह
using
कीवर्ड का उपयोग करता है - जावा (प्रोग्रामिंग भाषा): संस्करण 8 के बाद से, जावा में डिफ़ॉल्ट विधियों के लिए समर्थन है,[19] जिनमें कुछ विशेष गुण होते हैं।[20][21][22][23]
- जावास्क्रिप्ट: कार्यों और प्रतिनिधिमंडलों के माध्यम से ट्रेट प्रयुक्त किए जा सकते हैं[24] या लाइब्रेरी के माध्यम से जो गुण प्रदान करते हैं।[25][26][27]
- जूलिया (प्रोग्रामिंग भाषा): कई पैकेज ट्रैट को प्रयुक्त करते हैं, जैसे,[28]
- कोटलिन (प्रोग्रामिंग भाषा): ट्रैट को [29] M12 के बाद से इंटरफेस कहा गया है।[30]
- एलएएसएसओ (प्रोग्रामिंग भाषा)[31]
- ऑनलाइन कम्पाइलर: विभिन्न प्रकार की भाषा सुविधाओं का उपयोग करके ट्रैट को प्रयुक्त किया जा सकता है: मॉड्यूल और मॉड्यूल प्रकार का समावेशन, फ़ंक्टर और फ़ंक्टर प्रकार, क्लास और क्लास प्रकार इन्हेरिटेन्स, आदि सम्मिलित है।
- पीईआरएल: भूमिकाएं कहा जाता है, वे मूस, रोल :: टिनी और रोल :: सामान्य जैसे पीईआरएल लाइब्रेरी में प्रयुक्त होते हैं। रोल सहायक भाषा आरएकेयू (प्रोग्रामिंग भाषा) का भाग हैं। [32] कोरिन्ना ओओपी प्रस्ताव की स्वीकृति के साथ[33] आधुनिक ओओपी प्रणाली के भाग के रूप में मूल भाषा की भूमिका होगी।
- पीएचपी: संस्करण 5.4 के बाद से,[34][35] पीएचपी उपयोगकर्ताओं को उन टेम्पलेट्स को निर्दिष्ट करने की स्वीकृति देता है जो छद्म एकाधिक इन्हेरिटेन्स के रूप में एक से अधिक (ट्रैट-) क्लास से प्राप्त करने की क्षमता प्रदान करते हैं।
- पायथन (प्रोग्रामिंग भाषा): तृतीय-पक्ष लाइब्रेरी के माध्यम से,[36][37] या उच्च-क्रम मिक्सिन क्लासेस के माध्यम से[38]
- आरएसीकेईटी (प्रोग्रामिंग भाषा): लाइब्रेरी के रूप में ट्रैट का समर्थन करता है और उन्हें प्रयुक्त करने के लिए मैक्रोज़, संरचनाओं और प्रथम श्रेणी के क्लासेस का उपयोग करता है।[39]
- रूबी (प्रोग्रामिंग भाषा): ट्रैट को प्रयुक्त करने के लिए मॉड्यूल मिक्सिन का उपयोग किया जा सकता है।[40]
- आरयूएसटी (प्रोग्रामिंग भाषा)[41]
- स्काला (प्रोग्रामिंग भाषा)[42][43] ट्रैट कुंजी शब्द
trait
के साथ समर्थित है - स्मॉलटाक: स्मॉलटॉक की दो भाषाओ स्क्वीक [1]और फिरौन[44] में ट्रेट प्रयुक्त किए गए हैं।
- स्विफ्ट (प्रोग्रामिंग भाषा): प्रोटोकॉल एक्सटेंशन के साथ ट्रेट प्रयुक्त किए जा सकते हैं।[45]
उदाहरण
C #
C# 8.0 पर, इंटरफ़ेस के मेमोरी के रूप में कार्यान्वयन को परिभाषित करना संभव है।
using System; namespace CSharp8NewFeatures; interface ILogger { // Traditional interface methods void Log(string message); void LogError(Exception exception); // Default interface method void LogWarning(string message) { Console.WriteLine(message); } } class Logger : ILogger { public void Log(string message) { Console.WriteLine(message); } public void LogError(Exception exception) { Console.WriteLine(exception.ToString()); } } class Program { static void Main(string[] args) { ILogger logger = new Logger(); logger.LogWarning("Some warning message"); } }
पीएचपी
यह उदाहरण अन्य वर्गों को बढ़ाने के लिए एक विशेषता का उपयोग करता है:
// The template trait TSingleton { private static $_instance = null; private function __construct() {} // Must have private default constructor and be aware not to open it in the class public static function getInstance() { if (null === self::$_instance) { self::$_instance = new self(); } return self::$_instance; } } class FrontController { use TSingleton; } // Can also be used in already extended classes class WebSite extends SomeClass { use TSingleton; }
यह एकाधिक इन्हेरिटेन्स के अनुकरण स्वरूपों की स्वीकृति देता है:
trait TBounding
{
public $x, $y, $width, $height;
}
trait TMoveable
{
public function moveTo($x, $y)
{
// …
}
}
trait TResizeable
{
public function resize($newWidth, $newHeight)
{
// …
}
}
class Rectangle
{
use TBounding, TMoveable, TResizeable;
public function fillColor($color)
{
// …
}
}
आरयूएसटी
आरयूएसटी में एक ट्रैट विधियों के एक सेट की घोषणा करती है जिसे एक प्रकार को प्रयुक्त करना चाहिए।[46] आरयूएसटी कंपाइलर्स को खोजे जाने वाले ट्रैट की आवश्यकता होती है, जो आरयूएसटी में सामान्य प्रोग्रामिंग की सुरक्षा सुनिश्चित करता है।
// type T must have the "Ord" trait
// so that ">" and "<" operations can be done
fn max<T: Ord>(a: &[T]) -> Option<&T> {
let mut result = a.first()?;
for n in a {
if *n > *result {
result = &n;
}
}
Some(result)
}
जैसे ट्रैट के स्थायी और बार-बार कार्यान्वयन को सरल बनाने के लिए Debug
और Ord
, derive
मैक्रो का उपयोग कंपेलरों को स्वचालित रूप से कुछ कार्यान्वयन उत्पन्न करने के लिए अनुरोध करने के लिए किया जा सकता है।[47] व्युत्पन्न ट्रैट में : Clone
, Copy
, Debug
, Default
, PartialEq
, Eq
, PartialOrd
, Ord
और Hash
सम्मिलित हैं।
यह भी देखें
संदर्भ
- ↑ 1.0 1.1 1.2 Schärli, Nathanael; Ducasse, Stéphane; Nierstrasz, Oscar; Black, Andrew P. (2003). "Traits: Composable Units of Behaviour" (PDF). Proceedings of the European Conference on Object-Oriented Programming (ECOOP). Lecture Notes in Computer Science. Springer. 2743: 248–274. CiteSeerX 10.1.1.1011.8. doi:10.1007/978-3-540-45070-2_12. ISBN 978-3-540-45070-2.
- ↑ Ducasse, Stéphane; Nierstrasz, Oscar; Schärli, Nathanael; Wuyts, Roel; Black, Andrew P. (March 2006). "Traits: A mechanism for fine-grained reuse". ACM Transactions on Programming Languages and Systems. 28 (2): 331–388. CiteSeerX 10.1.1.64.2480. doi:10.1145/1119479.1119483. S2CID 16434119.
- ↑ Fisher, Kathleen; Reppy, John (2003). "Statically typed traits" (PDF). University of Chicago. Archived (PDF) from the original on May 17, 2004.
{{cite journal}}
: Cite journal requires|journal=
(help) - ↑ Fisher, Kathleen; Reppy, John (2004). A typed calculus of traits (PDF). 11th Workshop on Foundations of Object-oriented Programming. University of Chicago.
- ↑ Curry, Gael; Baer, Larry; Lipkie, Daniel; Lee, Bruce (1982). Traits: An approach to multiple-inheritance subclassing. SIGOA Conference on Office Information Systems. Philadelphia, Pennsylvania, USA: ACM Press. pp. 1–9. doi:10.1145/966873.806468.
- ↑ Van Cutsem, Tom; Bergel, Alexandre; Ducasse, Stéphane; De Meuter, Wolfgang (2009). लेक्सिकल नेस्टिंग का उपयोग करके लक्षणों में राज्य और दृश्यता नियंत्रण जोड़ना (PDF). European Conference on Object-Oriented Programming (ECOOP 2009). Lecture Notes in Computer Science. Vol. 5653. Springer-Verlag. pp. 220–243. CiteSeerX 10.1.1.372.1265. doi:10.1007/978-3-642-03013-0_11. ISBN 978-3-642-03012-3.
- ↑ "डिफ़ॉल्ट इंटरफ़ेस तरीके". What's new in C# 8.0. Microsoft. Retrieved November 29, 2019.
- ↑ "Interfaces in C# 8.0 gets a makeover". Default Implementation in Interfaces in C# 8.0. Talking Dotnet. 9 September 2019. Retrieved November 29, 2019.
- ↑ "iterator_traits<Iterator>". Standard Template Library. SGI.
- ↑ Myers, Nathan C. (June 1995). "Traits: a new and useful template technique". C++ Report. Retrieved January 23, 2016.
- ↑ Abrahams, David. "Generic Programming Techniques: Traits". Boost C++ Libraries. Retrieved January 23, 2016.
- ↑ "लक्षण". The D Language Reference. Digital Mars. Retrieved January 23, 2016.
- ↑ "एसटीडी.लक्षण". The D Language — Library Reference. Digital Mars. Retrieved January 23, 2016.
- ↑ "कक्षाओं". The D Language Reference. Digital Mars. Retrieved January 23, 2016.
- ↑ Steele, Guy; Maessen, Jan-Willem (June 11, 2006). "किले प्रोग्रामिंग भाषा ट्यूटोरियल" (PDF). Sun Microsystems. Retrieved January 23, 2016.
- ↑ "Object Orientation: Traits". The Groovy Programming Language. Retrieved January 23, 2016.
- ↑ "Haxe 2.4.0 - Haxe - The Cross-platform Toolkit". Haxe - The Cross-platform Toolkit. Retrieved 2017-09-12.
- ↑ "मैनुअल - हैक्स - क्रॉस-प्लेटफ़ॉर्म टूलकिट". Haxe - The Cross-platform Toolkit. Retrieved 2017-09-12.
- ↑ "डिफ़ॉल्ट तरीके". The Java Tutorials. Oracle. Retrieved January 23, 2016.
- ↑ Liquori, Luigi; Spiwack, Arnaud (2008). "FeatherTrait: A Modest Extension of Featherweight Java". ACM Transactions on Programming Languages and Systems. 30 (2): 11:1. doi:10.1145/1330017.1330022. S2CID 17231803.
- ↑ Liquori, Luigi; Spiwack, Arnaud (2008). "इंटरफेस के साथ फेदरट्रेट जावा का विस्तार". Theoretical Computer Science. 398 (1–3): 243–260. doi:10.1016/j.tcs.2008.01.051. S2CID 12923128.
- ↑ Bono, Viviana; Mensa, Enrico; Naddeo, Marco (September 2014). Trait-oriented Programming in Java 8. International Conference on Principles and Practices of Programming on the Java Platform: virtual machines, languages, and tools (PPPJ ’14). pp. 181–6. CiteSeerX 10.1.1.902.161. doi:10.1145/2647508.2647520.
- ↑ Forslund, Emil (February 3, 2016). "जावा में विशेषता पैटर्न की परिभाषा". Age of Java. Archived from the original on August 4, 2016. Retrieved February 3, 2016.
- ↑ Seliger, Peter (April 11, 2014). "जावास्क्रिप्ट की कई प्रतिभाएँ". Retrieved January 23, 2015.
- ↑ "Traits.js: Traits for JavaScript". Retrieved January 23, 2016.
- ↑ Van Cutsem, Tom; Miller, Mark S. (2012). "जावास्क्रिप्ट के लिए मजबूत विशेषता संरचना" (PDF). Science of Computer Programming. Retrieved January 23, 2016.
- ↑ "कॉकटेलजेएस". Retrieved January 23, 2016.
- ↑ mauro3. "सिंपलट्रेट्स.जेएल". GitHub. Retrieved March 23, 2017.
- ↑ "इंटरफेस". Kotlin Reference. JetBrains. Retrieved January 23, 2016.
- ↑ Breslav, Andrey (May 29, 2015). "Kotlin M12 is out!". Kotlin Blog. JetBrains. Retrieved January 23, 2016.
- ↑ "लक्षण". Lasso Language Guide. LassoSoft. January 6, 2014. Retrieved January 23, 2016.
- ↑ chromatic (April 30, 2009). "पर्ल रोल्स का क्यों". Retrieved January 23, 2016.
- ↑ Curtis "Ovid" Poe. "कोरिना ओओपी प्रस्ताव". Corinna RFC. Retrieved September 30, 2022.
- ↑ "लक्षण". PHP Documentation. The PHP Group. Retrieved January 23, 2016.
- ↑ Marr, Stefan (January 9, 2011). "Request for Comments: Horizontal Reuse for PHP". PHP.net wiki. The PHP Group. Retrieved January 31, 2011.
- ↑ Perä, Teppo. "py3traits Documentation". Retrieved January 23, 2016.
- ↑ Perä, Teppo (2015-03-25). "py2traits". GitHub. Retrieved January 23, 2016.
- ↑ "हायर ऑर्डर मिक्सिन क्लासेस". Archived from the original on 2016-10-09.
- ↑ "लक्षण". The Racket Reference. Retrieved January 23, 2016.
- ↑ David Naseby (February 14, 2004). "रूबी में गुण". Ruby Naseby. Retrieved January 23, 2016.
- ↑ "लक्षण". The Rust Programming Language. Retrieved September 30, 2019.
- ↑ "लक्षण". A Tour of Scala. École polytechnique fédérale de Lausanne. Retrieved January 23, 2016.
- ↑ Neward, Ted (April 29, 2008). "The busy Java developer's guide to Scala: Of traits and behaviors". IBM developerWorks. IBM. Retrieved January 23, 2016.
- ↑ "10 मिनट में लक्षण". Pharo: The CollaborActive Book. Retrieved January 23, 2016.
- ↑ Hollemans, Matthijs (July 22, 2015). "Mixins and Traits in Swift 2.0". Retrieved January 23, 2016.
- ↑ "Traits - Introduction to Programming Using Rust".
- ↑ "Traits - the Rust Programming Language".
बाहरी संबंध
- "Traits: Composable Units of Behavior". Software Composition Group. University of Bern.