de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

प्रदान किए गए लेक्चर सामग्री के आधार पर, यह मार्गदर्शिका UML मॉडलिंग के संदर्भ में ऑब्जेक्ट कॉन्स्ट्रेंट लैंग्वेज (OCL) की मूल अवधारणाओं, सिंटैक्स और व्यावहारिक अनुप्रयोगों को कवर करती है।

Objct Constraint Language (OCL)


1. OCL का परिचय

हमें OCL की क्यों आवश्यकता है?

जबकि UML आरेख (जैसे क्लास आरेख) संरचना के दृश्यीकरण के लिए उत्तम हैं, वे एक विनिर्माण के सभी प्रासंगिक पहलुओं को व्यक्त नहीं कर सकते हैं।

  • प्राकृतिक भाषा अस्पष्ट है।

  • पारंपरिक औपचारिक भाषाएँ अस्पष्ट नहीं हैं लेकिन औसत सिस्टम मॉडेलर्स के लिए पढ़ने और लिखने के लिए बहुत कठिन हैं।

  • OCL इस अंतर को पार करता है: यह एक है औपचारिक भाषा सटीक सीमाओं को व्यक्त करने के लिए उपयोग की जाती है, फिर भी यह रहती है पढ़ने और लिखने में आसान.

OCL की मुख्य विशेषताएँ

  1. शुद्ध एक्सप्रेशन भाषा: एक्सप्रेशन में कोई साइड इफेक्ट नहीं होते हैं। OCL एक्सप्रेशन का मूल्यांकन एक मान लौटाता है लेकिन नहीं कर सकता है सिस्टम की स्थिति को बदल सकता है। हालांकि, यह कर सकता है वर्णन कर सकता है एक स्थिति परिवर्तन का (उदाहरण के लिए, पोस्ट-शर्त में)।

  2. एक प्रोग्रामिंग भाषा नहीं है: आप प्रोग्राम तर्क, नियंत्रण प्रवाह लिख नहीं सकते, या राज्य को बदलने वाली प्रक्रियाओं/ऑपरेशन को आह्वान नहीं कर सकते।

  3. टाइप्ड भाषा: प्रत्येक एक्सप्रेशन का एक प्रकार होता है। अच्छी तरह से गठित एक्सप्रेशनों को प्रकार संगति नियमों का पालन करना चाहिए। प्रत्येक UML क्लासिफायर OCL का एक प्रकार है।

  4. तत्काल मूल्यांकन: वस्तुओं की स्थिति बदल नहीं सकती है दौरान OCL एक्सप्रेशन के मूल्यांकन के दौरान।


2. मूल सिंटैक्स और अर्थ

संदर्भ और सेल्फ

प्रत्येक OCL अभिव्यक्ति को एक विशिष्ट UML वर्गीकरण (वर्ग, इंटरफेस, आदि) के संदर्भ में मूल्यांकन किया जाता है।

  • संदर्भ: सीमा के लागू होने वाले वर्ग को परिभाषित करता है।

  • सेल्फ: वर्गीकरण वर्ग के विशिष्ट उदाहरण को संदर्भित करने वाला आरक्षित शब्द।

संदर्भ व्यक्ति
-- 'सेल्फ' व्यक्ति के एक विशिष्ट उदाहरण को संदर्भित करता है

टिप्पणियाँ और ऑपरेटर

  • टिप्पणियाँ: द्वारा चिह्नित किया गया है -- (उदाहरण के लिए -- यह एक टिप्पणी है).

  • इनफिक्स ऑपरेटर: आप मानक गणित/तार्किक ऑपरेटरों का उपयोग कर सकते हैं (+-=<). अवधारणात्मक रूप से, a + b समान है a.+(b).

गुणों तक पहुँच

विशेषताओं या संचालनों तक पहुँचने के लिए डॉट संकेतन का उपयोग करें। संचालनों के लिए कोष्ठक अनिवार्य हैं, भले ही उनमें कोई पैरामीटर न हों।

संदर्भ व्यक्ति
self.age             -- 'age' विशेषता को प्राप्त करता है
self.stockPrice()    -- 'stockPrice' संचालन को कॉल करता है

3. प्रकार और संग्रह

मूल निर्धारित प्रकार

OCL में विशिष्ट संचालन वाले मानक प्रकार शामिल हैं:

  • बूलियन: सत्यअसत्य (संचालन: औरयानहींअनुसरण करता हैया-नहीं)

  • पूर्णांक / वास्तविक: संख्याएँ (संचालन: +-*/absमहत्तमन्यूनतमभागमॉड)

  • स्ट्रिंग: पाठ (संक्रियाएँ: आकारसंयोजित करेंउपस्ट्रिंगपूर्णांक में बदलें)

संग्रह

संग्रह एक अमूर्त प्रकार हैं जिनका उपयोग एक से अधिक तत्वों को रखने के लिए किया जाता है। इन्हें -> प्रतीकात्मक रूप से प्राप्त किया जाता है।

  1. सेट: गणितीय सेट (कोई दोहराव नहीं, क्रम नहीं है)। सेट {1, 2, 5}

  2. क्रमबद्ध सेट: कोई दोहराव नहीं, लेकिन स्थिति द्वारा क्रमबद्ध। क्रमबद्ध सेट {5, 4, 3}

  3. बैग: डुप्लीकेट्स की अनुमति देता है, क्रम नहीं है। बैग {1, 2, 2, 5}

  4. अनुक्रम: डुप्लीकेट्स की अनुमति देता है, क्रमबद्ध। अनुक्रम {1, 2, 5, 10}

    • नोट: द .. नोटेशन क्रमागत पूर्णांकों का अनुक्रम बनाता है: अनुक्रम {1..5}.

मुख्य संग्रह संचालन

  • सामान्य: आकार()खालीहै()खाली नहीं है()शामिल है(v)बाहर रखता है(v)गिनती(v)योग().

  • पुनरावृत्तिकर्ता (OCL के लिए महत्वपूर्ण):

    • चयन करें(व्यंजक): वापसी तत्व जहां एक्सप्रेशन सत्य है।

    • अस्वीकृति(एक्सप्रेशन): वापसी तत्व जहां एक्सप्रेशन गलत है।

    • संग्रह(एक्सप्रेशन): सभी तत्वों से एक विशिष्ट संपत्ति निकालता है और एक नए संग्रह में रखता है।

    • सभी के लिए(एक्सप्रेशन): वापसी सत्य यदि एक्सप्रेशन कम से कम एक तत्व के लिए सत्य है सभी तत्वों।

    • मौजूद है(एक्सप्रेशन): वापसी सत्य यदि एक्सप्रेशन कम से कम एक तत्व के लिए सत्य है कम से कम एक तत्व।

    • पुनरावृत्ति(तत्व; संचय = प्रारंभ | एक्सप्रेशन): सभी इटरेटर्स के लिए सामान्य आधार।

इटरेटर सिंटैक्स विविधताएं:

स्वयं.कर्मचारी->चयन(आयु > 50)
स्वयं.कर्मचारी->चयन(p | p.आयु > 50)
स्वयं.कर्मचारी->चयन(p: व्यक्ति | p.आयु > 50)

4. यूएमएल मॉडल्स का नेविगेशन

OCL का अनुसंधान संबंधों को पार करने के लिए एक नेविगेशन भाषा के रूप में भारी मात्रा में उपयोग किया जाता है।

मानक नेविगेशन

विपरीत भूमिका के नाम का उपयोग करके नेविगेशन करें। प्रतिलाभ प्रकार बहुलता पर निर्भर करता है:

  • बहुलता 1 या 0..1: एक एकल वस्तु लौटाता है।

  • बहुलता *: लौटाता है सेट (या क्रमबद्ध सेट अगर चिह्नित है {क्रमबद्ध}).

संदर्भ कंपनी
self.manager.age > 40               -- प्रबंधक 0..1 है, एक व्यक्ति वस्तु लौटाता है
self.employee->notEmpty()           -- कर्मचारी 0..* है, एक सेट लौटाता है

यदि भूमिका का नाम अनुपलब्ध है, तो दूसरे छोर पर क्लास के छोटे अक्षर नाम का उपयोग करें (उदाहरण के लिए self.bank).

संबंध वर्ग

संबंध वर्ग के छोटे अक्षर नाम का उपयोग करके संबंध वर्ग तक नेविगेशन करें।

संदर्भ व्यक्ति
self.job->size() >= 1  -- 'नौकरी' व्यक्ति और कंपनी के बीच संबंध वर्ग है

पुनरावर्ती संबंध

जब एक संबंध एक ही क्लास पर वापस लौटता है (उदाहरण के लिए, दो व्यक्तियों के बीच विवाह), तो आपको वर्गाकार कोष्ठक का उपयोग करके दिशा निर्दिष्ट करनी होगी [भूमिका नाम].

संदर्भ व्यक्ति
self.marriage[wife]->select(m | m.ended = false)->size() = 1

योग्य संबंध

एक विशिष्ट वस्तु का चयन करने के लिए विशिष्ट गुणवत्ता वाले विशेषताओं का वर्गाकार कोष्ठक में उपयोग करें।

संदर्भ बैंक
self.customer[12345]  -- खाता संख्या 12345 वाले विशिष्ट व्यक्ति को लौटाता है
self.customer         -- सभी ग्राहकों के सेट को लौटाता है

पुनः प्रकार निर्धारण (प्रकारांतरण)

उपयोग करें oclAsType() उपप्रकार या छिपे हुए उपवर्ग गुणधर्म को प्राप्त करने के लिए।

self.oclAsType(Sub).p       -- उपप्रकार में परिभाषित 'p' गुणधर्म को प्राप्त करता है
self.oclAsType(Super).p     -- उपवर्ग में परिभाषित 'p' गुणधर्म को प्राप्त करता है

5. प्रतिबंध लिखना

1. अपरिवर्तनीयता (inv)

वे शर्तें जो अनिवार्य रूप से हमेशा एक वर्ग के सभी उदाहरणों के लिए सत्य होनी चाहिए।

संदर्भ कंपनी 
inv: self.noEmployees <= 50
inv SME: self.stockPrice() > 0  -- 'SME' प्रतिबंध के लिए वैकल्पिक नाम है

2. पूर्व और पश्चात् शर्तें (पूर्वपश्चात्)

क्रियाओं से जुड़े प्रतिबंध।

  • पूर्व: सत्य होना चाहिए पहले क्रियान्वयन के बाद।

  • पश्चात्: सत्य होना चाहिए बाद में निष्पादन। उपयोग करें परिणाम प्राप्त मान के लिए।

  • @पूर्व: पोस्ट-शर्तों में एक संपत्ति के मान को संदर्भित करने के लिए उपयोग किया जाता है पहले क्रियान्वयन शुरू होने के बाद।

संदर्भ व्यक्ति::आय(): पूर्णांक
पूर्व वयस्क: स्वयं.आयु >= 18
पोस्ट परिणामस्वरूप: परिणाम < 5000

संदर्भ कंपनी::कर्मचारी नियुक्त करें(p: व्यक्ति)
पोस्ट: कर्मचारी = कर्मचारी@पूर्व->शामिल करना(p)

3. शरीर, प्रारंभिक और व्युत्पन्न व्यंजक

  • शरीर: एक प्रश्न संचालन के परिणाम को परिभाषित करता है (पुनरावर्ती हो सकता है)।

  • प्रारंभिक: एक गुण के प्रारंभिक मान को परिभाषित करता है।

  • व्युत्पन्न: एक व्युत्पन्न गुण को परिभाषित करता है।

संदर्भ व्यक्ति::आय(): पूर्णांक
शरीर: स्वयं.नौकरी.वेतन->योग()

संदर्भ व्यक्ति::विवाहित: बूलियन
प्रारंभिक: गलत

संदर्भ कंपनी::कर्मचारी संख्या: पूर्णांक
व्युत्पन्न: स्वयं.कर्मचारी->आकार()

6. उन्नत OCL विशेषताएँ

लेट और डेफ व्यंजक

  • लेट: एक एकल व्यंजक के भीतर स्थानीय चर को परिभाषित करता है।

    लेट कुलघंटाएँ: पूर्णांक = स्वयं.काम करता है->संकलन(घंटे)->योग() में कुलघंटाएँ >= 30
    
  • डेफ: एक वर्गीकरण के साथ जुड़े पुनः उपयोगी चर या संचालन को परिभाषित करता है।

    डेफ: शीर्षक है(t: जीवन): बूलियन = स्वयं.नौकरी->मौजूद है(शीर्षक = t)
    

अपरिभाषित मान (3-मूल्य तर्क)

यदि एक उप-व्यंजक अपरिभाषित है (उदाहरण के लिए, नल संबंध के माध्यम से नेविगेट करना), तो पूरा व्यंजक अपरिभाषित हो जाता है। हालांकि, बूलियन ऑपरेटरों के लिए शॉर्ट-सर्किट अपवाद हैं:

  • सत्य या <अपरिभाषित> = सत्य

  • गलत और <अपरिभाषित> = गलत

  • गलत अनुमानित <अपरिभाषित> = सत्य

  • <अपरिभाषित> अनुमानित सत्य = सत्य

वर्ग विशेषताएं और पूर्वनिर्धारित वस्तु गुण

  • सभी_उदाहरण(): एक वर्ग के सभी मौजूदा उदाहरणों का सेट लौटाता है।

    व्यक्ति.सभी_उदाहरण()->आकार() <= 100
    
  • वस्तु गुण: oclIsTypeOf(प्रकार)oclIsKindOf(प्रकार)oclInState(अवस्था)oclIsNew (पोस्ट-शर्तों में उपयोग किया जाता है)।


7. व्यापक केस स्टडी: कंपनी मॉडल

इन अवधारणाओं को मजबूत करने के लिए, यहां एक कंपनी डेटाबेस मॉडल (कर्मचारी, विभाग, परियोजनाएं, निर्भरताएं) पर लागू अखंडता सीमाओं का संग्रह है।

मूल गुण सीमाएं

-- उम्र कम से कम 18 वर्ष होनी चाहिए
संदर्भ कर्मचारी अंतर्निहित: स्वयं.उम्र() >= 18

-- नियुक्ति तिथि जन्म तिथि के बाद होनी चाहिए
संदर्भ कर्मचारी अंतर्निहित: स्वयं.नियुक्ति_तिथि > स्वयं.जन्म_तिथि

-- प्रबंधक की शुरुआत की तिथि नियुक्ति तिथि के बाद होनी चाहिए
संदर्भ कर्मचारी अंतर्निहित: स्वयं.प्रबंधित->खाली_नहीं() अनुमानित स्वयं.प्रबंधित.शुरुआत_तिथि > स्वयं.नियुक्ति_तिथि

नेविगेशन और संबंध सीमाएं

-- सुपरवाइजर कर्मचारी से अधिक उम्र का और अधिक वेतन प्राप्त करना चाहिए
संदर्भ कर्मचारी
अंतर्निहित: स्वयं.सुपरवाइजर->खाली_नहीं() अनुमानित स्वयं.उम्र() > स्वयं.सुपरवाइजर.उम्र()
अंतर्निहित: स्वयं.सुपरवाइजर->खाली_नहीं() अनुमानित स्वयं.वेतन < स्वयं.सुपरवाइजर.वेतन

-- सुपरवाइजर को अपने अधीनस्थों से पहले नियुक्त किया जाना चाहिए
संदर्भ कर्मचारी
अंतर्निहित: स्वयं.अधीनस्थ->खाली_नहीं() अनुमानित स्वयं.अधीनस्थ->सभी(e | e.नियुक्ति_तिथि > स्वयं.नियुक्ति_तिथि)

-- विभाग प्रबंधक उसी विभाग का कर्मचारी होना चाहिए
संदर्भ विभाग
अंतर्निहित: स्वयं.काम_करता_है->शामिल_है(स्वयं.प्रबंधित.कर्मचारी)

-- परियोजना स्थान विभाग के स्थानों में से एक होना चाहिए
संदर्भ परियोजना
अंतर्निहित: स्वयं.नियंत्रित_स्थानों->शामिल_है(स्वयं.स्थान)

-- कर्मचारी केवल उस विभाग द्वारा नियंत्रित परियोजनाओं पर काम कर सकता है जिसमें वह काम करता है
संदर्भ कर्मचारी
अंतर्निहित: स्वयं.काम_करता_है.नियंत्रित->शामिल_सभी(स्वयं.काम_करता_है.परियोजना)

संग्रह और इटरेटर सीमाएं

-- एसएसएन को सभी कर्मचारियों में एकमात्र पहचानकर्ता होना चाहिए
संदर्भ कर्मचारी
अंतर्निहित: कर्मचारी.सभी_उदाहरण->सभी(e1, e2 | e1 <> e2 अनुमानित e1.SSN <> e2.SSN)

-- निर्भरता का नाम और संबंध प्रति कर्मचारी अद्वितीय होना चाहिए
संदर्भ कर्मचारी
अंतर्निहित: स्वयं.निर्भरताएं->सभी(e1, e2 |
      e1 <> e2 अनुमानित (e1.नाम <> e2.नाम या e1.संबंध <> e2.संबंध))

-- व्युत्पन्न गुण: विभाग में कर्मचारियों की संख्या
संदर्भ विभाग
अंतर्निहित: स्वयं.कर्मचारी_संख्या = स्वयं.काम_करता_है->आकार()

-- कर्मचारी अधिकतम 4 परियोजनाओं पर काम कर सकता है
संदर्भ कर्मचारी
अंतर्निहित: स्वयं.काम_करता_है->आकार() <= 4

जटिल तर्क का उपयोग करके लेट और चयन करें

-- कुल कार्य समय हफ्ते में 30 से 50 के बीच होना चाहिए
संदर्भ कर्मचारी 
नियम: लेट totHours: पूर्णांक = स्वयं.काम करता है->संकलन(घंटे)->योग 
     इसमें totHours >= 30 और totHours <= 50

-- किसी विशिष्ट परियोजना पर अधिकतम 2 कर्मचारी 10 घंटे से कम काम कर सकते हैं
संदर्भ परियोजना 
नियम: स्वयं.काम करता है->चयन(घंटे < 10)->आकार() <= 2

-- केवल विभाग प्रबंधक ही किसी परियोजना पर 5 घंटे से कम काम कर सकते हैं
संदर्भ कर्मचारी 
नियम: स्वयं.काम करता है->चयन(घंटे < 5)->खाली नहीं है() अनुमानित 
     स्वयं.काम करता है.प्रबंधित.कर्मचारी = स्वयं

-- उन कर्मचारियों को सभी अपनी परियोजनाओं पर कम से कम 10 घंटे काम करना होगा जिनके अधीनस्थ नहीं हैं
संदर्भ कर्मचारी 
नियम: स्वयं.अधीनस्थ->खाली है() अनुमानित स्वयं.काम करता है->सभी(घंटे >= 10)

-- विभाग प्रबंधक को विभाग द्वारा नियंत्रित सभी परियोजनाओं पर कम से कम 5 घंटे काम करना होगा
संदर्भ विभाग 
नियम: स्वयं.नियंत्रित->सभी(p: परियोजना | 
      स्वयं.प्रबंधित.कर्मचारी.काम करता है->चयन(घंटे >= 5)->मौजूद है(p))

चक्रों को रोकना (पुनरावर्ती तर्क)

-- कर्मचारी स्वयं के निरीक्षण नहीं कर सकता
संदर्भ कर्मचारी नियम: स्वयं.अधीनस्थ->अपवाह स्वयं

-- निरीक्षण पदानुक्रम में चक्र नहीं होने चाहिए
संदर्भ कर्मचारी 
परिभाषा: सभी अधीनस्थ = स्वयं.अधीनस्थ->संयोजन(
          स्वयं.अधीनस्थ->संकलन(e: कर्मचारी | e.सभी अधीनस्थ))
नियम: स्वयं.सभी अधीनस्थ->अपवाह स्वयं

यह पोस्ट Deutsche, English, Español, فارسی, Français, Bahasa Indonesia, 日本語, Polski, Portuguese, Ру́сский, Việt Nam, 简体中文 और 繁體中文 में भी उपलब्ध है।