স্ট্যাটিক ক্লাস এবং সদস্যদের উপর চিন্তাভাবনা এবং সর্বোত্তম অনুশীলনগুলি [বন্ধ]


11

স্ট্যাটিক সদস্য বা পুরো স্ট্যাটিক ক্লাস সম্পর্কিত চিন্তাভাবনা এবং শিল্পের সেরা অনুশীলনের বিষয়ে আমি খুব কৌতূহলী। এটির কোনও ডাউনসাইড রয়েছে, বা এটি কোনও বিরোধী নিদর্শনগুলিতে অংশ নেয়?

এই সংস্থাগুলি আমি "ইউটিলিটি ক্লাস / সদস্য" হিসাবে দেখছি, এই ক্রিয়াকলাপটি সরবরাহ করার জন্য তাদের ক্লাসটি তাত্ক্ষণিক প্রয়োজন হবে না বা দাবি করা হবে না।

এ সম্পর্কে সাধারণ চিন্তাভাবনা এবং শিল্পের সর্বোত্তম অনুশীলনগুলি কী কী?

আমি কী উল্লেখ করছি তা বোঝাতে নীচের উদাহরণ ক্লাস এবং সদস্যগুলি দেখুন।

// non-static class with static members
//
public class Class1
{
    // ... other non-static members ...

    public static string GetSomeString()
    {
        // do something
    }
}

// static class
//
public static class Class2
{
    // ... other static members ...

    public static string GetSomeString()
    {
        // do something
    }
}

তুমাকে অগ্রিম ধন্যবাদ!



1
@ রবার্ট হার্ভে: আপনি যে নিবন্ধটি উল্লেখ করেছেন তা কার্যকর হলেও এটি স্টাটিক ক্লাস ব্যবহার করার সময় সর্বোত্তম অনুশীলনের ক্ষেত্রে এবং কী কী ক্ষতি হতে পারে তার ক্ষেত্রে এটি তেমন সরবরাহ করে না।
বার্নার্ড

উত্তর:


18

সাধারণভাবে, স্ট্যাটিকগুলি এড়িয়ে চলুন - বিশেষত কোনও ধরণের স্থিতিশীল অবস্থা।

কেন?

  1. পরিসংখ্যান সম্মতিতে সমস্যা সৃষ্টি করে। যেহেতু কেবলমাত্র একটি উদাহরণ রয়েছে, তাই এটি প্রাকৃতিকভাবে একই সাথে ভাগ করে দেওয়া হয়। এই ভাগ করা সংস্থানগুলি সমবর্তী প্রোগ্রামিংয়ের নিষিদ্ধ, এবং প্রায়শই ভাগ করার প্রয়োজন হয় না।

  2. পরিসংখ্যান ইউনিট পরীক্ষায় সমস্যা সৃষ্টি করে। এর নুনের মূল্যমানের কোনও ইউনিট পরীক্ষার কাঠামো একযোগে পরীক্ষা চালায়। তারপরে আপনি # 1 এ চলে যান। সবচেয়ে খারাপটি হলেও, আপনি সেটআপ / টিয়ারডাউন স্টাফের সমস্তগুলি দিয়ে আপনার পরীক্ষাগুলিকে জটিল করে তোলেন এবং সেটআপ কোডটি "ভাগ" করার জন্য আপনি যে হ্যাকারি পড়বেন সেটিই।

ছোট ছোট প্রচুর জিনিসও রয়েছে। পরিসংখ্যানগুলি জটিল নয়। আপনি এগুলি ইন্টারফেস করতে পারবেন না, আপনি সেগুলি ওভাররাইড করতে পারবেন না, আপনি তাদের নির্মাণের সময় নিয়ন্ত্রণ করতে পারবেন না, আপনি জেনেরিকগুলিতে এগুলি ভালভাবে ব্যবহার করতে পারবেন না। আপনি এগুলি সত্যই সংস্করণ করতে পারবেন না।

স্ট্যাটিক্সের অবশ্যই ব্যবহার রয়েছে: ধ্রুবক মানগুলি দুর্দান্ত কাজ করে। বিশুদ্ধ পদ্ধতিগুলি যা একটি একক শ্রেণিতে ফিট করে না এখানে দুর্দান্ত কাজ করতে পারে।

তবে সাধারণভাবে এগুলি এড়িয়ে চলুন।


আপনি বোঝাতে চেয়েছেন সম্মতিতে অক্ষমতার পরিমাণে আমি কৌতূহলী। আপনি কি এটি প্রসারিত করতে পারেন? যদি আপনি বোঝাতে চান যে সদস্যদের কোনও বিচ্ছিন্নতা ছাড়াই অ্যাক্সেস করা যায়, এটি সঠিক ধারণা দেয়। স্ট্যাটিক্সের জন্য আপনার ব্যবহারের ক্ষেত্রে আমি সাধারণত সেগুলি ব্যবহার করি: ধ্রুবক মান এবং বিশুদ্ধ / ইউটিলিটি পদ্ধতি। যদি এটি স্ট্যাটিক্সের জন্য সর্বোত্তম এবং 99% ইউজ-কেস হয় তবে এটি আমাকে এক স্তরের স্বাচ্ছন্দ্য দেয়। এছাড়াও, আপনার উত্তরের জন্য +1। দুর্দান্ত তথ্য।
থমাস স্ট্রিংজার

@ থমাসস্ট্রিঞ্জার - ঠিক যে থ্রেড / টাস্কের মধ্যে আরও স্পর্শপয়েন্টগুলি সমঝোতা ইস্যুগুলির জন্য আরও বেশি সুযোগ এবং / অথবা আরও বেশি পারফরম্যান্স হ্রাস সিনক্রোনাইজেশন করার অর্থ।
তেলস্তিন

সুতরাং যদি বর্তমানে একটি থ্রেড স্থিতিশীল সদস্য অ্যাক্সেস করছে তবে অন্যান্য থ্রেডগুলির নিজস্ব থ্রেডটি রিসোর্সটি প্রকাশ না হওয়া পর্যন্ত অপেক্ষা করা দরকার?
থমাস স্ট্রিংজার

@ থমাসস্ট্রিঞ্জার - সম্ভবত, সম্ভবত নাও। পরিসংখ্যান (খুব প্রায়, বেশিরভাগ ভাষায়) এই ক্ষেত্রে অন্য কোনও ভাগ করা সংস্থান থেকে আলাদা নয়।
তেলস্তিন

@ থমাসস্ট্রিঞ্জার: দুর্ভাগ্যক্রমে এটি সদৃশ থেকে খারাপ, যদি না আপনি সদস্যটিকে চিহ্নিত করেন volatile। আপনি কেবল অস্থির ডেটা ছাড়াই মেমরির মডেল থেকে কোনও আশ্বাস পান না, সুতরাং একটি থ্রেডে পরিবর্তনশীল পরিবর্তন করা তাত্ক্ষণিকভাবে বা মোটেও প্রতিফলিত হতে পারে না।
ফোশি

17

ফাংশনটি যদি "খাঁটি" হয় তবে আমি কোনও সমস্যা দেখছি না। একটি খাঁটি ফাংশন কেবল ইনপুট পরামিতিগুলিতে কাজ করে এবং তার ভিত্তিতে একটি ফলাফল সরবরাহ করে। এটি কোনও বৈশ্বিক রাষ্ট্র বা বাহ্যিক প্রসঙ্গে নির্ভর করে না।

যদি আমি আপনার নিজের কোড উদাহরণটি দেখি:

public class Class1
{
    public static string GetSomeString()
    {
        // do something
    }
}

এই ফাংশনটি কোনও পরামিতি নেয় না। সুতরাং, এটি সম্ভবত খাঁটি নয় (এই ক্রিয়াকলাপের একমাত্র বিশুদ্ধ বাস্তবায়নটি একটি ধ্রুবককে ফিরিয়ে দেওয়া হবে)। আমি ধরে নিই যে এই উদাহরণটি আপনার প্রকৃত সমস্যার প্রতিনিধি নয়, আমি কেবল উল্লেখ করছি যে এটি সম্ভবত কোনও শুদ্ধ কার্য নয়।

একটি আলাদা উদাহরণ নিতে দিন:

public static bool IsOdd(int number) { return (number % 2) == 1; }

এই ফাংশনটি স্থির হওয়ার সাথে কোনও দোষ নেই। আমরা ক্লায়েন্ট কোডটিকে আরও বেশি পঠনযোগ্য হয়ে ওঠে, এটি এমনকি একটি এক্সটেনশন ফাংশন হিসাবেও তৈরি করতে পারি। এক্সটেনশন ফাংশন হয় মূলত শুধু স্ট্যাটিক ফাংশন একটি বিশেষ ধরনের।

টেলাস্টিন স্থিতিশীল সদস্যদের একটি সম্ভাব্য সমস্যা হিসাবে সম্মিলিতভাবে সঠিকভাবে উল্লেখ করেছেন। তবে, যেহেতু এই ফাংশনটি ভাগ করা স্থিতি ব্যবহার করে না, তাই এখানে কোনও সহাবস্থানীয় সমস্যা নেই। এক হাজার থ্রেড কোনও সম্মতিযুক্ত সমস্যা ছাড়াই এই ফাংশনটি একই সাথে কল করতে পারে।

.NET ফ্রেমওয়ার্কে, এক্সটেনশন পদ্ধতিগুলি বেশ কিছু সময়ের জন্য বিদ্যমান। LINQ এক্সটেনশন ফাংশন অনেক ধারণ করে (যেমন Enumerable.Where () , Enumerable.First () , Enumerable.Single () , ইত্যাদি)। আমরা এগুলি খারাপ হিসাবে দেখি না, তাই না?

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

যাইহোক, কোনও সংখ্যার বিজোড় বা এমনকি সমতুল্য কিনা তার উপর নির্ভর করে, কোনও আচরণের জন্য আলাদাভাবে আচরণ করে এমন কোনও পরীক্ষার জন্য লেখার সময়, আমাদের IsOdd()কোনও বিকল্প বাস্তবায়ন দিয়ে কার্যটি প্রতিস্থাপন করতে সক্ষম হওয়ার দরকার নেই to তেমনি, আমি কখন দেখি না যখন আমাদের Enumerable.Where()পরীক্ষার উদ্দেশ্যে পৃথক বাস্তবায়ন সরবরাহ করা প্রয়োজন ।

সুতরাং আসুন এই ফাংশনটির জন্য ক্লায়েন্ট কোডের পঠনযোগ্যতা পরীক্ষা করে দেখুন:

বিকল্প একটি (এক্সটেনশন পদ্ধতি হিসাবে ঘোষিত ফাংশন সহ):

public void Execute(int number) {
    if (number.IsOdd())
        // Do something
}

বিকল্প বি:

public void Execute(int number) {
    var helper = new NumberHelper();
    if (helper.IsOdd(number))
        // Do something
}

স্ট্যাটিক (এক্সটেনশন) ফাংশনটি কোডের প্রথম টুকরোটিকে অনেক বেশি পঠনযোগ্য করে তোলে এবং পাঠযোগ্যতা অনেকটাই গুরুত্বপূর্ণ, তাই যেখানে উপযুক্ত সেখানে স্থির ফাংশন ব্যবহার করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.