उच्च सामंजस्य क्या है और इसका उपयोग कैसे करें / इसे करें?


84

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



3
उच्च सामंजस्य: एक साथ बैठने के लिए संबंधित व्यवहार, और कहीं और बैठने के लिए असंबंधित व्यवहार।
तेमन शिपाही

जवाबों:


240

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

आइए इस उदाहरण को लेते हैं:

आपके पास एक वर्ग है जो दो नंबर जोड़ता है, लेकिन एक ही वर्ग परिणाम प्रदर्शित करने वाली एक खिड़की बनाता है। यह एक कम सामंजस्यपूर्ण वर्ग है क्योंकि खिड़की और जोड़ने के संचालन में बहुत आम नहीं है। खिड़की कार्यक्रम का दृश्य हिस्सा है और जोड़ने का कार्य इसके पीछे का तर्क है।

एक उच्च सामंजस्यपूर्ण समाधान बनाने के लिए, आपको एक वर्ग विंडो और एक वर्ग योग बनाना होगा। विंडो परिणाम प्राप्त करने और उसे प्रदर्शित करने के लिए Sum के तरीके को कॉल करेगा। इस तरह आप अपने आवेदन के तर्क और GUI को अलग-अलग विकसित करेंगे।


14
ईमानदारी से मैं इस तरह सामंजस्य को परिभाषित नहीं करता हूं। आपकी परिभाषा एसआरपी (एकल जिम्मेदारी सिद्धांत) है। और सामंजस्य इस बारे में है कि पैकेज वार, समान-सुविधा-परिक्रमा कक्षाएं एक-दूसरे के करीब हैं या नहीं।
v.oddou

4
एसआरपी (सिंगल रिस्पांसिबिलिटी प्रिंसिपल) उसी अवधारणा को व्यक्त करने का एक और तरीका है। सामंजस्य एक मीट्रिक का अधिक है; एसआरपी एक व्यावहारिक दिशानिर्देश है कि यदि इसका पालन किया जाए तो इससे सहगामी वर्गों का विकास होगा।
कॉमड्यूब

3
मुझे लगता है कि कक्षा की खिड़की को किसी कक्षा की राशि के रूप में नहीं बुलाना चाहिए, क्योंकि इसका एकमात्र उद्देश्य यह है कि इसे प्रस्तुत करने के लिए कक्षा योग या किसी अन्य वर्ग के "अस्तित्व" के बारे में जानने की आवश्यकता नहीं है। एक अन्य वर्ग का कहना है कि चालक को परिणाम प्राप्त करना चाहिए योग कक्षा और रेंडर करने के लिए क्लास विंडो के परिणाम को पारित करेगा
एकलव्य

1
मुझे नहीं मिला। यह चाचा बॉब से साफ कोड के अनुसार सामंजस्य नहीं है। यह एसआरपी है
करालिहोनोस

बहुत साफ व्याख्या! धन्यवाद
विन्सेंट Llauderes

55

स्टीव मैककॉनेल के कोड कम्प्लीट से क्या है इसका स्पष्टीकरण :

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

अंकल बॉब के क्लीन कोड से इसे प्राप्त करने का कुछ तरीका :

कक्षाओं में उदाहरण चर की एक छोटी संख्या होनी चाहिए । कक्षा के प्रत्येक तरीकों में से एक या एक से अधिक चर में हेरफेर करना चाहिए। सामान्य रूप से अधिक चर एक विधि अधिक सामंजस्यपूर्ण हेरफेर करता है जो विधि अपनी कक्षा के लिए है। एक वर्ग जिसमें प्रत्येक विधि द्वारा प्रत्येक चर का उपयोग किया जाता है, अधिकतम रूप से सामंजस्यपूर्ण होता है।

सामान्य तौर पर इस तरह के अधिकतम सामंजस्यपूर्ण वर्गों का निर्माण करना न तो उचित है और न ही संभव; दूसरी ओर, हम चाहते हैं कि सामंजस्य अधिक हो। जब सामंजस्य अधिक होता है, तो इसका मतलब है कि कक्षा के तरीके और चर सह-निर्भर हैं और एक तार्किक पूरे के रूप में एक साथ हैं।

युग्मन की धारणा के साथ सामंजस्य की धारणा दृढ़ता से संबंधित है; इसके अलावा, उच्च सामंजस्य के अनुमान के आधार पर एक सिद्धांत है, जिसका नाम एकल जिम्मेदारी सिद्धांत (एसओएलआईडी से एस) है।


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

18

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

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

ईमेल वर्ग। इसमें cc, bcc, विषय, निकाय से डेटा सदस्य होने चाहिए, और इनमें ये तरीके saveAsDraft (), सेंड (), त्यागपत्र () हो सकते हैं। लेकिन लॉगिन () यहां नहीं होना चाहिए, क्योंकि कई ईमेल प्रोटोकॉल हैं, और उन्हें अलग से लागू किया जाना चाहिए।


यह SRP की परिभाषा है: "एक वर्ग को केवल वही करना चाहिए जो वह करने वाला है, और वह पूरी तरह से करता है।"
अलीएन 11

11

सामंजस्य आमतौर पर LCOM (सामंजस्य की कमी) मैट्रिक्स में से एक का उपयोग करके मापा जाता है, मूल LCOM मीट्रिक चिदंबर और केमेरर से आया था। उदाहरण के लिए देखें: http://www.computing.dcu.ie/~renaat/ca421/LCOM.html

एक अधिक ठोस उदाहरण: यदि एक वर्ग के उदाहरण के लिए एक निजी क्षेत्र और तीन विधियाँ हैं; जब तीनों विधियाँ इस क्षेत्र का उपयोग एक ऑपरेशन करने के लिए करती हैं तो कक्षा बहुत ही सामंजस्यपूर्ण होती है।

एक सामंजस्यपूर्ण वर्ग का छद्म कोड:

class FooBar {
  private SomeObject _bla = new SomeObject();

  public void FirstMethod() {
    _bla.FirstCall();
  }

  public void SecondMethod() {
    _bla.SecondCall();
  }

  public void ThirdMethod() {
    _bla.ThirdCall();
  }
}

यदि एक वर्ग के उदाहरण के लिए तीन निजी क्षेत्र और तीन विधियाँ हैं; जब तीनों विधियाँ तीन क्षेत्रों में से केवल एक का उपयोग करती हैं तो कक्षा खराब रूप से सम्वेदनशील होती है।

एक खराब सामंजस्यपूर्ण वर्ग का छद्म कोड:

class FooBar {
  private SomeObject _bla = new SomeObject();
  private SomeObject _foo = new SomeObject();
  private SomeObject _bar = new SomeObject();

  public void FirstMethod() {
    _bla.Call();
  }

  public void SecondMethod() {
    _foo.Call();
  }

  public void ThirdMethod() {
    _bar.Call();
  }
}

एक चीज़ सिद्धांत को करने वाला वर्ग एकल उत्तरदायित्व सिद्धांत है जो रॉबर्ट सी। मार्टिन से आता है और एसओएलआईडी सिद्धांतों में से एक है। सिद्धांत बताता है कि एक वर्ग को बदलने का केवल एक कारण होना चाहिए।

सिंगल रिस्पांसिबिलिटी प्रिंसिपल के करीब रहने से संभवतः अधिक सामंजस्यपूर्ण कोड हो सकता है, लेकिन मेरी राय में ये दो अलग चीजें हैं।


4

यह निम्न सामंजस्य का एक उदाहरण है:

class Calculator
{


     public static void main(String args[])
     {

          //calculating sum here
          result = a + b;
          //calculating difference here
          result = a - b;
          //same for multiplication and division
     }
}

लेकिन उच्च सामंजस्य का तात्पर्य है कि कक्षाओं में कार्य वे करते हैं जो उन्हें करना चाहिए (जैसे उनका नाम लिया जाता है)। और कुछ फ़ंक्शन किसी अन्य फ़ंक्शन का काम नहीं कर रहा है। तो, निम्नलिखित उच्च सामंजस्य का एक उदाहरण हो सकता है:

class Calculator
{


     public static void main(String args[])
     {

          Calculator myObj = new Calculator();
          System.out.println(myObj.SumOfTwoNumbers(5,7));
      }


     public int SumOfTwoNumbers(int a, int b)
     {

          return (a+b);
     }

     //similarly for other operations

}

3

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


1

सामंजस्य का मतलब है कि एक वर्ग या एक तरीका सिर्फ एक परिभाषित कार्य करता है। विधि या वर्ग का नाम भी स्व-व्याख्यात्मक होना चाहिए। उदाहरण के लिए यदि आप एक कैलकुलेटर लिखते हैं, तो आपको कक्षा "कैलकुलेटर" का नाम देना चाहिए न कि "asdfghj"। यह भी आप प्रत्येक कार्य के लिए एक विधि बनाने पर विचार करना चाहिए, उदाहरण के लिए घटाना () जोड़ आदि (...) प्रोग्रामर जो भविष्य में आपके कार्यक्रम का उपयोग कर सकता है, वही जानता है कि आपके तरीके क्या कर रहे हैं। अच्छा नामकरण टिप्पणी के प्रयासों को कम कर सकता है

यह भी एक सिद्धांत DRY है - अपने आप को दोहराएं नहीं


1

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

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

कार्यात्मक रूप से चिपकने वाले मॉड्यूल का एक लाभ यह है कि यूनिट परीक्षणों को विकसित करना और स्वचालित करना सीधा है। वास्तव में एक मॉड्यूल के सामंजस्य का एक अच्छा उपाय यह है कि मॉड्यूल के लिए संपूर्ण इकाई परीक्षणों का एक पूरा सेट बनाना कितना आसान है।

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

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

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

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

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

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

उदाहरण के लिए, एक फ़ंक्शन जो एक अपवाद को फेंकता है या एक वैश्विक त्रुटि चर ( errnoसी में) सेट करता है या इसे एक अनुक्रम में उपयोग किया जाना चाहिए (strtok() फ़ंक्शन मानक सी लाइब्रेरी से एक उदाहरण है क्योंकि यह आंतरिक स्थिति बनाए रखता है) या जो एक पॉइंटर प्रदान करता है जो तब होना चाहिए प्रबंधित या कुछ लॉग उपयोगिता के लिए एक लॉग जारी करता है एक फ़ंक्शन के सभी उदाहरण हैं जो अब कार्यात्मक सामंजस्य नहीं है।

मैंने योरडन और कॉन्स्टेंटाइन की मूल पुस्तक, स्ट्रक्चर्ड प्रोग्रामिंग दोनों को पढ़ा है, जहाँ मुझे पहली बार 1980 के दशक में सामंजस्य का विचार आया और मेइलिर पेज-जोन्स की पुस्तक प्रैक्टिकल गाइड टू स्ट्रक्चर्ड सिस्टम्स डिज़ाइन, और पेज-जोन्स ने वर्णन करने का बेहतर काम किया। युग्मन और सामंजस्य दोनों। The Yourdon और Constantine पुस्तक कुछ अधिक अकादमिक लगती है। स्टीव मैककोनेल की पुस्तक कोड कम्प्लीट काफी अच्छी और व्यावहारिक है और संशोधित संस्करण में अच्छी प्रोग्रामिंग प्रैक्टिस के बारे में कहने के लिए काफी कुछ है।


आप कहते हैं कि The minimum amount of source code needed to create the module outputs is in the module and no moreयह सामंजस्य से संबंधित नहीं है लेकिन DTSTTCPW
v.oddou

@ v.oddou, कोड की न्यूनतम राशि वास्तव में सामंजस्य से संबंधित है। एक मॉड्यूल में अधिक कोड जो मॉड्यूल से असंबंधित है, अधिक संभावना है कि कोड के साइड इफेक्ट होते हैं इसलिए कम सामंजस्य होता है। हर अवधारणा के अलग-अलग दृष्टिकोण होते हैं विशेष रूप से अवधारणाएँ जैसे कि कोशिओन जो कुछ अस्पष्ट हैं। सामंजस्य के लिए माप गुणात्मक हैं जिनके लिए एक विशेष मॉड्यूल को एक श्रेणी या किसी अन्य को किसी प्रकार का एक रुब्रिक का उपयोग करके आवंटित करने के लिए एक तरह के फजी लॉजिक की आवश्यकता होती है। आउटपुट के लिए न्यूनतम कोड कहना कई में से सिर्फ एक के लिए उच्च सामंजस्य के लिए एक पर्याप्त विशेषता नहीं है।
रिचर्ड चैम्बर्स

1

अधिकांश जवाब यह नहीं बताते कि सामंजस्य क्या है, यह चाचा बोब्स बुक क्लीन कोड में अच्छी तरह से परिभाषित है।

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

मुझे इसे कक्षा की परिभाषा के साथ समझाइए

class FooBar {
private _bla;
private _foo;
private _bar;

function doStuff()

   if(this._bla>10){
     this._foo = 10;
     this._bar = 20;
   }

}
function doOtherStuff(){

    if(this._foo==10){
       this._bar = 100;
       this._bla = 200;
    }
}

}

यदि आप उपर्युक्त उदाहरण देखते हैं कि वर्ग समतुल्य है जिसका अर्थ है कि चर को एक साथ काम करने के लिए वर्ग के बीच साझा किया जाता है और अधिक चर साझा किए जाते हैं इसका मतलब है कि वर्ग अत्यधिक एकजुट है और एकल इकाई के रूप में काम करता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.