'উচ্চ সংহতি' এর অর্থ কী?


28

আমি সম্প্রতি এমন একটি ছাত্র যারা সম্প্রতি একটি ইন্টার্ন হিসাবে একটি সফ্টওয়্যার বিকাশ সংস্থায় যোগদান করেছি। বিশ্ববিদ্যালয়ে ফিরে আমার এক অধ্যাপক বলতেন যে আমাদের "লো সংযুক্তি এবং উচ্চ সংহতি" অর্জনের জন্য প্রচেষ্টা করতে হবে।

আমি কম সংযোগের অর্থ বুঝতে পারি। এর অর্থ পৃথক পৃথক উপাদানগুলির কোড পৃথকভাবে রাখা, যাতে এক জায়গায় পরিবর্তন অন্য জায়গায় কোড ভঙ্গ না করে।

তবে উচ্চ সংহতি বলতে কী বোঝায়। যদি এর অর্থ একই উপাদানটির বিভিন্ন টুকরা একে অপরের সাথে ভালভাবে সংহত করা হয় তবে আমি বুঝতে পারি না কীভাবে এটি সুবিধাজনক হয়।

উচ্চ সংহতি বলতে কী বোঝায়? এর উপকারিতা বোঝার জন্য একটি উদাহরণ ব্যাখ্যা করা যেতে পারে?



1
উইকিপিডিয়া নিবন্ধটি কি আপনার প্রশ্নের যথেষ্ট উত্তর দেয় না? en.wikedia.org/wiki/Cohesion_( কম্পিউটার_সায়েন্স)
ইওন ক্যারল

আছে: এ সম্পর্কে একটি ভাল নিবন্ধ হয় msdn.microsoft.com/en-us/magazine/cc947917.aspx
NoChance

1
@EoinCarrol: দুর্ভাগ্যক্রমে উইকিপিডিয়া বর্তমান মুহুর্তে নিবন্ধ নতুন প্রোগ্রামাররা কাজ করতে পারে এমন কোনও ভাল কংক্রিটের উদাহরণ দেয় না । থিওরি ভাল এবং সব কিছু, তবে আপনি কম সংহতির চারপাশে ভুল না করা অবধি সত্যই আঁকেন না। উচ্চতর সংহতি হ'ল সেই বিষয়গুলির মধ্যে একটি যা আমাকে বেশ কয়েক বছর ধরে প্রোগ্রামিংয়ে নিয়েছে কেন এটি গুরুত্বপূর্ণ এবং এটি কীভাবে অর্জন করা যায় তা পুরোপুরি বুঝতে ।
স্পোকাইক

ক্লিন কোড না পড়া পর্যন্ত আমি কখনই কোহেনশনকে সত্যই বুঝতে পারি নি। আপনারও উচিত.
সেবাস্তিয়ান রেডল

উত্তর:


25

ক্লাসের পদ্ধতিগুলি যদি কোনও ব্যক্তিগত বৈশিষ্ট্য ব্যবহার করে তবে ওওর বিবেচনায় সংহতি দেখার এক উপায়। 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
    }
}

এই ধারণাটি যে আপনি সরাসরি " কোডিং স্ট্রিংগুলি" পরিচালনা করবেন না তা @ কোডোমেনকিবাদ দ্বারা এই ব্লগপোস্টে বিশদভাবে বর্ণিত হয়েছে তবে এটি সংহতির সাথে নিবিড়ভাবে সম্পর্কিত কারণ প্রোগ্রামাররা যেভাবে ইউটিলিটি ক্লাসে যুক্তি যুক্ত করে স্ট্রিং ব্যবহার করেন।


এখন কেবলমাত্র যদি আমরা আমাদের কাস্টম জিপকোড এবং ফোন নাম্বার ক্লাসগুলি সঠিকভাবে পরিচালনা করতে আমাদের ওআরএম পেতে পারি: |
পিট

+1 ভাল উদাহরণ। শেষ বিন্দু জন্য, তাও দেখতে sourcemaking.com/refactoring/primitive-obsession
AlexFoxGill

@Pete তোমার ORM এটি পরিচালনা করবে যদি আপনি আপনার সংজ্ঞায়িত প্রকার (পিনকোড, PHONENUMBER) এর স্ট্রিং থেকে রুপান্তরের অপারেটার প্রদান: msdn.microsoft.com/en-us/library/85w54y0a.aspx
মার্কাস

9

উচ্চ সামঞ্জস্যের অর্থ অনুরূপ এবং সম্পর্কিত জিনিসগুলি একত্রে রাখা, দম্পতি বা ফিউজ অংশ যা সামগ্রী, কার্যকারিতা, কারণ বা লক্ষ্য ভাগ করে । অন্য কথায়, নিম্ন সামঞ্জস্যের অর্থ উদাহরণস্বরূপ কোনও ফাংশন / শ্রেণি / কোড সত্তা হতে পারে যা " বিন্দুতে " না হয়ে একাধিক উদ্দেশ্যে কাজ করে । বহন করার ধারণাগুলির মধ্যে একটি হল একটি কাজ করা এবং এটি ভালভাবে করা । অন্যরা স্পষ্ট সত্যটি অন্তর্ভুক্ত করতে পারে যে আপনি অনেক জায়গায় একই কার্যকারিতাটির প্রতিরূপ তৈরি করেন না। এটি কোড বেসের স্থানীয়তাও উন্নত করে, চারপাশে ছড়িয়ে ছিটিয়ে থাকার পরিবর্তে নির্দিষ্ট কিছু জায়গায় (ফাইল, শ্রেণি, ফাংশনগুলির সেট, ...) পাওয়া যায়।

উদাহরণস্বরূপ, এমন একটি শ্রেণী বিবেচনা করুন যা দুটি বা তিনটি উদ্দেশ্যে পরিবেশন করে: লোড / স্টোর রিসোর্সগুলি (উদাহরণস্বরূপ একটি ফাইল) এবং তারপরে বিশ্লেষণ করে সামগ্রীটি প্রদর্শন করে। এই জাতীয় শ্রেণীর কম সংহতি রয়েছে কারণ এটি কমপক্ষে দুটি পৃথক কাজ পরিচালনা করে যা একেবারেই সম্পর্কিত নয় (ফাইল I / O, বিশ্লেষণ এবং প্রদর্শন)। একটি উচ্চ সাদৃশ্য নকশাটি সংস্থানটি লোড এবং সঞ্চয় করতে, এটি বিশ্লেষণ করে এবং তারপরে প্রদর্শন করার জন্য পৃথক শ্রেণি ব্যবহার করতে পারে।

অন্যদিকে, কম সংযোগের লক্ষ্য পৃথক জিনিসগুলি পৃথক করে রাখা - যাতে তারা একে অপরের সাথে যতটা সম্ভব সামান্য যোগাযোগ করে যা জটিলতা হ্রাস করে এবং নকশাটিকে সহজতর করে।


7

এর অর্থ হল যে প্রদত্ত বস্তুর অংশগুলি বস্তুর ক্রিয়াকলাপের সাথে ঘনিষ্ঠভাবে জড়িত। এর অর্থ হল কার্যকারিতা বা দায়িত্বের দিক দিয়ে অবজেক্টের মধ্যে খুব কম বা কোনও অপচয় নেই। পরিবর্তে এটি প্রশ্নের মধ্যে থাকা অবজেক্টটি কী ব্যবহার করা উচিত তা বোঝার উন্নতি করতে পারে।


এটি কি কেবলমাত্র বস্তুর চেয়ে উচ্চ স্তরের ক্ষেত্রে প্রযোজ্য নয়? যেমন নেমস্পেসের কোনও কাজের সাথে সম্পর্কিত গ্রুপিং আপত্তি / ফাংশন?
stijn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.