2016-10-20 25 views
11

शुद्ध कंप्यूटर विज्ञान (या शायद कम्प्यूटेशनल linguisticis) के दृष्टिकोण से, मैं शब्दों के बीच अंतर पता करने के लिए करना चाहते हैं:सजावट, विशेषता, पहलू, और विशेषता के बीच क्या अंतर है?

  • डेकोरेटर
  • गुण
  • पहलू
  • विशेषता

विभिन्न भाषाएं इन शब्दों और कार्यक्षमता को अंतर तरीकों से उपयोग करती हैं। अजगर में, उदाहरण के लिए, डेकोरेटर (जोर मेरा) [अजगर विकी के अनुसार]:

डेकोरेटर गतिशील एक समारोह, विधि, या वर्ग की कार्यक्षमता सीधे उपवर्गों का उपयोग किए बिना बदलने या स्रोत बदलने समारोह के कोड सजाया जा रहा है।

यह मुझे पोस्टस्पर या डायनैमिकप्रॉक्सी जैसे पहलू ओरिएंटेड प्रोग्रामिंग टूल के समान उल्लेखनीय रूप से मारता है। यानी .:

[Profile] 
    private static void SleepSync() 
    { 
     Thread.Sleep(200); 
    } 

स्रोत: PostSharp Examples

सी # और जावा (और साथ ही अन्य भाषाओं के असंख्य) में, एक डेकोरेटर-ish पैटर्न (सी #) या एक क्षेत्र (जावा) मतलब या तो कर सकते हैं विशेषताओं।

और C++ बढ़ावा या PHP builtin विशेषता शब्द, हम कक्षाओं का विस्तार करने के लक्षण उपयोग कर सकते हैं के माध्यम से के माध्यम से यहाँ दिखाया गया है: https://en.wikipedia.org/wiki/Trait_(computer_programming)

तो, एक "शुद्ध" दृष्टिकोण से, के विहित परिभाषाओं क्या है ये वास्तव में क्या हैं? क्या उन्हें परिभाषित करने का कोई बेहतर तरीका है?

+0

भाषाओं के बीच कोई मानक नहीं है। इसके अलावा, मुझे नहीं लगता कि सभी भाषाएं प्रत्येक की सख्त परिभाषा का समर्थन करती हैं। जावा ले लो सजावट = एनोटेशन, विशेषता = फ़ील्ड, विशेषता = डिफ़ॉल्ट विधि (शायद इंटरफ़ेस) ... दूसरी तरफ, एक पहलू किसी भी एक भाषा की सुविधा से अधिक सॉफ्टवेयर आर्किटेक्चर अवधारणा है। –

+1

यह कारण है कि इन संबंधित "चीजों" में से प्रत्येक के लिए एक प्रतिमान-स्तर "शब्द" हो। मुझे एक सैद्धांतिक परिप्रेक्ष्य से विश्वास करने में एक कठिन समय होगा जो आप उन्हें सटीक रूप से माप नहीं सकते थे। – Darkenor

+0

भाषाओं की वास्तविक शब्दावली की बजाय अवधारणाओं पर चर्चा करने के लिए आपको प्रोग्रामिंग भाषाओं के बीच कितनी बार स्विच करने की ज़रूरत है? लक्षण और पहलू का विकिपीडिया पृष्ठ उच्च स्तर से मेरी समझ में पर्याप्त प्रतीत होता है। (संदर्भ: https://en.m.wikipedia.org/wiki/Aspect_(computer_programming)) लेकिन, यदि आप पाइथन के बारे में बात कर रहे हैं और मैं सी # के बारे में बात कर रहा हूं, और हम दोनों सजावटी कहते हैं, तो हमारी समझ शायद विभिन्न। –

उत्तर

3

डेकोरेटर

मैं डिजाइन पैटर्न के मामले में डेकोरेटर के बारे में सोच। डिजाइन पैटर्न कई भाषाओं में मान्यता प्राप्त हैं, विशेष रूप से ऑब्जेक्ट उन्मुख वाले। एक पैटर्न के रूप में सजावटी, फिर एक रैपर है जो कार्यक्षमता को जोड़ता है जो समारोह या कक्षा में सजाया नहीं जाता है।

सबसे सरल उदाहरण मैं सोच सकता हूं कि एक सजावटी कार्य है। समारोह

int foo(int x) 

एक और समारोह है कि एक दूसरा पैरामीटर स्वीकार करता है के द्वारा सजाया जा सकता है, इसके साथ कुछ और होता है, और उसके बाद बारी में foo कॉल(), गुजर मूल पैरामीटर एक्स।

int bar(int x, int y) { 
    return y*y + foo(x); 
} 

डिजाइन पैटर्न आम तौर पर कक्षा स्तर पर लागू कर रहे हैं, सिद्धांत यहाँ एक ही है, और मैं इसे अच्छी तरह से दिखाता है क्या एक डेकोरेटर का क्या मतलब है लगता है। चाहे प्रत्येक विशेष भाषा इसका पालन करे, एक अलग मामला है। एक भाषा में कुछ और हो सकता है जो इसे 'सजावट' कहता है - लेकिन मेरे लिए यह अवधारणा मूल कार्यक्षमता को बदलने या विरासत का उपयोग किए बिना, अतिरिक्त कार्यक्षमता के साथ कुछ सादा सजाने के विचार से मेल खाती है।

जावा में I/O कक्षाएं एक और आम उदाहरण हैं।वहाँ बुनियादी

OutputStream s 

है और फिर आप अधिक विशिष्ट डेटा के प्रकार के आधार वर्गों के साथ पेश किया जा रहा का उपयोग करके इस सजाने कर सकते हैं, या प्रारूप तुम चाहो में डेटा को पढ़ने के लिए:

OutputStream s1 = new FileOutputStream("somefile.txt"); 

या

OutputStream s2 = new ByteOutputStream("rawdata.hex"); 

गुण

मैं सही समझ के रूप में विशेषता के सी # विचार की तरफ झुकता हूं, क्योंकि यह एक सजावट से अलग है। एक विशेषता एक अर्थपूर्ण मान निर्दिष्ट करती है जो ऑब्जेक्ट से ऑब्जेक्ट में भिन्न हो सकती है, और एपीआई के बीच भी जो एक ही विशेषता का उपयोग करती है। मैं एक एक प्रवेश विशेषता और एक एक सुरक्षा विशेषता है, और क्या उन विशेषताओं ग्राहक एपीआई कि उन विशेषताओं की जांच करने के अलग हो सकता है इसका मतलब यह निर्दिष्ट कर सकते हैं

[Logging] Object a; 
[Security] Object b; 

: उदाहरण के लिए, मैं दो वस्तुओं हो सकता है। लॉगिंग को लागू करने के लिए लॉग 4j का उपयोग हो सकता है और कोई अन्य एपीआई का उपयोग कर सकता है। यहां परिभाषा बहुत अधिक तरल पदार्थ है और विभिन्न पक्षों या मेरे कोड के उपयोगकर्ताओं द्वारा व्याख्या के लिए खुला है। कोई निश्चित रूप से एक सजावट के रूप में कार्य करने के लिए एक विशेषता का उपयोग कर सकता है, लेकिन विशेषताओं का उपयोग उससे कहीं अधिक के लिए किया जा सकता है।

बस असंबद्धता के लिए, शब्द विशेषता का उपयोग कक्षा के सदस्य चर को दर्शाने के लिए भी किया जाता है। यहां हम किसी मौजूदा ऑब्जेक्ट या क्लास को पूर्वनिर्धारित अर्थपूर्ण मान निर्दिष्ट करने की बड़ी, अधिक अमूर्त अवधारणा के बारे में बात कर रहे हैं। जावा इन एनोटेशन को कॉल करता है।

मेरे दिमाग में एक गुणक एक विशेषता है, जिस अर्थ में हम बात कर रहे हैं, यह है कि यह केवल अप्रत्यक्ष रूप से व्यवहार को संशोधित नहीं करता है। उदाहरण के लिए, किसी चीज़ पर [लॉगिंग] विशेषता असाइन करना किसी भी तरह से अपना कोड नहीं बदलता है। यह एक नाम टैग संलग्न करने जैसा है जो अन्य ढूंढ रहे हैं। जब कोई अन्य प्रोग्राम या एप्लिकेशन नाम टैग देखता है, तो यह कुछ चीजों का अनुमान लगाता है और उसके अनुसार अपना व्यवहार बदल सकता है। लेकिन (कम से कम जावा में) एनोटेशन या विशेषताएं सीधे कुछ भी संशोधित नहीं करते हैं - फिर, बस एक नाम टैग। यह सी # या अन्य भाषाओं में थोड़ा अलग हो सकता है जो गुणों का समर्थन करते हैं, इस मामले में मैं उन्हें अधिक उन्नत विशेषता या पूरी तरह से कुछ और मानता हूं।

पहलू

पहलू-ओरिएंटेड प्रोग्रामिंग (AOP) के अर्थ में एक पहलू स्वयं संशोधित या स्वयं को अपडेट करने में कोड निर्माण का एक प्रकार है। यह कोड के एक अनुभाग को अधिक लचीला (एक बिंदु काट) के रूप में परिभाषित करता है और कोड के उसी अनुभाग के एक या अधिक संभावित अपडेट, पैच या विभिन्न संस्करणों के बीच उस विशेष अनुभाग को अंदर और बाहर स्विच करने की अनुमति देता है।

क्या आप पहलुओं और विशेषताओं के उपयोग के गुणों के समान कुछ चीजें कर सकते हैं? ज़रूर। लेकिन आप खुद को सिरदर्द क्यों देंगे? एओपी ओओपी से अगले कदम की तरह है, केवल जब आवश्यक हो तो इसका इस्तेमाल किया जाना चाहिए। यह कब आवश्यक है? जब किसी विशेष एप्लिकेशन में सुरक्षा या लॉगिंग जैसी कई "क्रॉस-कटिंग चिंताओं" होती है - उदाहरण के लिए, एक बैंकिंग एप्लिकेशन। ये चिंताओं को पार कटौती; वे परंपरागत सीमाओं से परे पार करते हैं जो अच्छी परिभाषित कक्षाएं और पैकेज बनाते हैं। जब आप लॉगिंग कर रहे हों, तब तक यह बहुत अच्छा नहीं करता जब तक कि आप सबकुछ लॉग न करें; इसलिए, यह चिंता क्रॉस कटिंग है। तो जब आप एक वर्ग के लॉगिंग तंत्र को अपडेट करने के लिए जाते हैं, तो सभी अन्य वर्गों और एपीआई के साथ-साथ संशोधित करना मुश्किल होगा, लेकिन यह भी आवश्यक होगा। अन्यथा आपका लॉगिंग अब असंगत और भ्रमित है, और समस्या निवारण या निगरानी के लिए उपयोग करना अधिक कठिन है।

इन प्रकार के अपडेटों को सिरदर्द से कम करने के लिए, पहलू उन्मुख भाषाओं जैसे पहलू को पेश किया गया था। मैंने एक "पहलू" में भाग नहीं लिया है जिसका मतलब इसके अलावा कुछ भी था, लेकिन कुछ ऐसा हो सकता है जैसा कि पहले सजावटी के बारे में बताया गया था। एक विशेष भाषा कुछ पहलू कह सकती है, लेकिन यह उन अन्य चीजों की तरह दिख सकती है जिन पर हमने पहले ही चर्चा की है।

विशेषता

विशेषता इंटरफेस के साथ पर्याय बन गया है, या कम से कम है कि यह कैसे भाषाओं मैं अध्ययन किया में प्रतीत होता है है।

एक इंटरफ़ेस एक ओओपी अवधारणा है जो उन्हें लागू किए बिना व्यवहार घोषित करता है। इन अपेक्षित व्यवहारों को बनाने से उन व्यवहारों को सामान्य बनने की अनुमति मिलती है, और विशिष्टताओं की देखभाल किए बिना सामान्य रूप से बुलाया जा सकता है। इसे लागू करने के लिए उप-वर्गों को छोड़ दिया गया है।

क्लासिक ओओपी उदाहरण पशु है, जिसमें दो उप-वर्ग, बिल्ली और कुत्ते हैं।

public interface/trait Animal { 
    public void speak(); 
} 
public class Cat implements Animal { 
    public void speak() { 
     output("Meow."); 
    } 
} 
public class Dog implements Animal { 
    public void speak() { 
     output("Bark!"); 
    } 
} 

यह भी बहुरूपता का एक बड़ा उदाहरण है - उन शब्दों है कि गैर कंप्यूटर लोगों चापलूसी बना देती हैं में से एक। इसका मतलब यह है कि बिल्ली और कुत्ते के व्यक्तिगत व्यवहार होते हैं, और यदि मैं एक पशु वस्तु घोषित करता हूं, तो मुझे परवाह नहीं है कि आप मुझे किस तरह देते हैं। आप मुझे बिल्ली या कुत्ता दे सकते हैं। क्योंकि दोनों जानवर हैं, किसी भी मामले में, मुझे बस इतना करना है कि मेरे पशु वस्तु के बोल() फ़ंक्शन को कॉल करें, और मैं आश्वस्त रह सकता हूं कि सही परिणाम किसी भी मामले में होगा। प्रत्येक व्यक्ति उपclass जानता है कि इसे क्या करने की जरूरत है। सी ++ में पानी यहां थोड़ा और गंदा है, लेकिन सामान्य अवधारणा वही है (यदि आप उस खरगोश छेद को शुरू करना चाहते हैं तो कीवर्ड 'आभासी' में पढ़ें)।

रेप-अप

मुझे आशा है कि भ्रम की स्थिति से कुछ ऊपर साफ करता है। ऐसा लगता है कि, जैसा कि आपने कहा था, इनमें से प्रत्येक के लिए कई अलग-अलग भाषाओं के कई अलग-अलग अर्थ हैं, इसमें कोई संदेह नहीं है कि भ्रम में योगदान है। मेरा मानना ​​है कि यदि आप इसे आगे देखते हैं, तो आप पाएंगे कि बड़े पैमाने पर, ये मानक अर्थ हैं। मैं 18+ सालों से कई भाषाओं (वीबी, सी ++, सी #, जावा, पासचल, पीएचपी, पर्ल) में प्रोग्रामिंग कर रहा हूं और ये परिभाषाएं हैं कि मैं एक प्रकार के मानक के रूप में विश्वास करने में सबसे सहज हूं।

मैं निश्चित रूप से जो कहा है उस पर और चर्चा का स्वागत करता हूं।

+2

आईएमएचओ एक विशेषता एक इंटरफ़ेस से बहुत दूर है। एक इंटरफ़ेस केवल घोषणा करता है, कौन सी विधियां पाई जा सकती हैं लेकिन कार्यान्वयन प्रदान नहीं करती हैं। लक्षणों में परिभाषा भी शामिल है। तो मुझे किसी प्रकार की * आंशिक कक्षा * के रूप में एक विशेषता दिखाई देती है जो * कई वर्गों के लिए आंशिक हो सकती है * – derM

+0

@derM जैसा कि मेरे उत्तर में बताया गया है, अलग-अलग भाषाओं के अलग-अलग अर्थ हैं। मैं मानता हूं कि लक्षण सिर्फ एक इंटरफ़ेस होने से बहुत दूर जा सकते हैं। मैंने कभी नहीं कहा कि वे इससे ज्यादा कुछ नहीं हो सकते हैं। जब आप कभी भी इसका अर्थ बनाते हैं कि वे किस प्रकार के गुणों का अर्थ ले सकते हैं, तो आप इंटरफ़ेस के साथ सामान्य संप्रदाय होने के साथ हवा में उतरते हैं। मैं सहमत हूं कि वहाँ अस्पष्टता है, लेकिन यह चर्चा की प्रकृति है। अपने स्वयं के उत्तर पोस्ट करने के लिए स्वतंत्र महसूस करें जो लक्षणों को बेहतर बताता है। – Tim

संबंधित मुद्दे

 संबंधित मुद्दे