OO के संदर्भ में सामंजस्य को देखने का एक तरीका यह है कि क्या कक्षा में विधियाँ किसी भी निजी विशेषता का उपयोग कर रही हैं। LCOM4 (Lack of Cohesive Methods) जैसे मेट्रिक्स का उपयोग करते हुए, जैसा कि यहाँ इस उत्तर में gnat द्वारा बताया गया है , आप उन वर्गों की पहचान कर सकते हैं जिन्हें रिफैक्ट किया जा सकता है। जिस तरीके से आप रिफ्लेक्टर विधियों या कक्षाओं को अधिक सामंजस्यपूर्ण बनाना चाहते हैं, वह यह है कि यह दूसरों को इसका उपयोग करने के लिए कोड डिज़ाइन को सरल बनाता है । मुझ पर विश्वास करो; जब आप इन मुद्दों को ठीक करते हैं तो अधिकांश टेक लीड और रखरखाव प्रोग्रामर आपसे प्यार करेंगे।
कोड आधार में कम सामंजस्य की पहचान करने के लिए आप अपनी निर्माण प्रक्रिया में उपकरणों का उपयोग कर सकते हैं जैसे सोनार । कुछ बहुत ही सामान्य मामले हैं जो मैं सोच सकता हूं कि "सामंजस्य" में तरीके कहां कम हैं :
केस 1: विधि कक्षा से संबंधित नहीं है
निम्नलिखित उदाहरण पर विचार करें:
public class Food {
private int _foodValue = 10;
public void Eat() {
_foodValue -= 1;
}
public void Replenish() {
_foodValue += 1;
}
public void Discharge() {
Console.WriteLine("Nnngghhh!");
}
}
विधियों में से एक Discharge()
, सामंजस्य का अभाव है क्योंकि यह कक्षा के किसी भी निजी सदस्य को नहीं छूता है। इस मामले में केवल एक निजी सदस्य है _foodValue
:। यदि यह वर्ग के लोगों के साथ कुछ नहीं करता है, तो क्या यह वास्तव में वहां है? विधि को किसी अन्य वर्ग में स्थानांतरित किया जा सकता है जिसे उदाहरण के लिए नाम दिया जा सकता है FoodDischarger
।
// Non-cohesive function extracted to another class, which can
// be potentially reused in other contexts
public FoodDischarger {
public void Discharge() {
Console.WriteLine("Nnngghhh!");
}
}
आप इसे जावास्क्रिप्ट में कर रहे हैं, क्योंकि फ़ंक्शंस प्रथम श्रेणी के ऑब्जेक्ट हैं, डिस्चार्ज एक नि: शुल्क फ़ंक्शन हो सकता है:
function Food() {
this._foodValue = 10;
}
Food.prototype.eat = function() {
this._foodValue -= 1;
};
Food.prototype.replenish = function() {
this._foodValue += 1;
};
// This
Food.prototype.discharge = function() {
console.log('Nnngghhh!');
};
// can easily be refactored to:
var discharge = function() {
console.log('Nnngghhh!');
};
// making it easily reusable without creating a class
केस 2: उपयोगिता वर्ग
यह वास्तव में एक सामान्य मामला है जो सामंजस्य को तोड़ता है। हर कोई उपयोगिता वर्गों से प्यार करता है , लेकिन ये आमतौर पर डिजाइन की खामियों को इंगित करते हैं और ज्यादातर समय कोडबेस को बनाए रखने के लिए मुश्किल बनाता है (उपयोगिता वर्गों से जुड़े उच्च निर्भरता के कारण)। निम्नलिखित वर्गों पर विचार करें:
public class Food {
public int FoodValue { get; set; }
}
public static class FoodHelper {
public static void EatFood(Food food) {
food.FoodValue -= 1;
}
public static void ReplenishFood(Food food) {
food.FoodValue += 1;
}
}
यहां हम देख सकते हैं कि उपयोगिता वर्ग को वर्ग में एक संपत्ति तक पहुंचने की आवश्यकता है Food
। उपयोगिता वर्ग के तरीकों में इस मामले में कोई सामंजस्य नहीं है क्योंकि इसे काम करने के लिए बाहरी संसाधनों की आवश्यकता होती है। इस मामले में, क्या वे जिस कक्षा में खुद के साथ काम कर रहे हैं (पहले मामले में बहुत पसंद करते हैं) करना बेहतर नहीं होगा?
केस 2 बी: यूटिलिटी क्लासेस में छिपा हुआ सामान
उपयोगिता वर्गों का एक और मामला है जहां अवास्तविक डोमेन ऑब्जेक्ट हैं। एक प्रोग्रामर के पास पहले घुटने के झटका की प्रतिक्रिया होती है जब प्रोग्रामिंग स्ट्रिंग हेरफेर इसके लिए एक उपयोगिता वर्ग लिखना है। आम स्ट्रिंग प्रतिनिधित्व के एक जोड़े को मान्य करने वाले यहाँ की तरह:
public static class StringUtils {
public static bool ValidateZipCode(string zipcode) {
// validation logic
}
public static bool ValidatePhoneNumber(string phoneNumber) {
// validation logic
}
}
यहाँ जो कुछ भी महसूस नहीं होता है वह यह है कि एक ज़िप कोड, एक फ़ोन नंबर, या कोई अन्य स्ट्रिंग रीसेन्टेशन एक वस्तु हो सकती है:
public class ZipCode {
private string _zipCode;
public bool Validates() {
// validation logic for _zipCode
}
}
public class PhoneNumber {
private string _phoneNumber;
public bool Validates() {
// validation logic for _phoneNumber
}
}
यह धारणा कि आपको "स्ट्रिंग्स को हैंडल नहीं करना चाहिए" इस ब्लॉगपोस्ट में विस्तृत रूप से @codemonkeyism द्वारा विस्तृत है , लेकिन सामंजस्य से निकटता से संबंधित है क्योंकि जिस तरह से प्रोग्रामर उपयोगिता कक्षाओं में तर्क डालकर तार का उपयोग करते हैं।