ক্লাসের পদ্ধতিগুলি যদি কোনও ব্যক্তিগত বৈশিষ্ট্য ব্যবহার করে তবে ওওর বিবেচনায় সংহতি দেখার এক উপায়। LCOM4 (সহকারী পদ্ধতিগুলির অভাব) এর মতো মেট্রিকগুলি ব্যবহার করে , এখানে এই উত্তরে জিএনটি দ্বারা নির্দেশিত হিসাবে , আপনি ক্লাসগুলি সনাক্ত করতে পারেন যা রিফেক্টর হতে পারে। আপনি রিফ্যাক্টর পদ্ধতি বা ক্লাসগুলিকে আরও একত্রিত করতে চান তা হ'ল এটি অন্যদের ব্যবহারের জন্য কোড ডিজাইনকে আরও সহজ করে তোলে । আমাকে বিশ্বাস কর; আপনি যখন এই সমস্যাগুলি ঠিক করেন তখন সর্বাধিক প্রযুক্তির সীসা এবং রক্ষণাবেক্ষণ প্রোগ্রামাররা আপনাকে ভালবাসবে।
কোড বেজে কম সংহতি চিহ্নিত করতে আপনি সোনারের মতো আপনার বিল্ড প্রক্রিয়াতে সরঞ্জামগুলি ব্যবহার করতে পারেন । বেশ কয়েকটি প্রচলিত কেস রয়েছে যা আমি ভাবতে পারি যেখানে "সংহতি" তে পদ্ধতিগুলি কোথায় কম :
কেস 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
}
}
এই ধারণাটি যে আপনি সরাসরি " কোডিং স্ট্রিংগুলি" পরিচালনা করবেন না তা @ কোডোমেনকিবাদ দ্বারা এই ব্লগপোস্টে বিশদভাবে বর্ণিত হয়েছে তবে এটি সংহতির সাথে নিবিড়ভাবে সম্পর্কিত কারণ প্রোগ্রামাররা যেভাবে ইউটিলিটি ক্লাসে যুক্তি যুক্ত করে স্ট্রিং ব্যবহার করেন।