সহায়ক # স্টাইল "ইউটিলিটি ব্যাগ" স্ট্যাটিক ক্লাসগুলি এড়িয়ে পরিষ্কারভাবে "ফ্রি ফাংশনগুলি" পরিচালনা করতে সি # প্যাটার্ন


9

আমি সম্প্রতি কয়েকটি হেল্পার স্টাইলের "ইউটিলিটি ব্যাগ" স্ট্যাটিক ক্লাসগুলি পর্যালোচনা করছিলাম যেখানে আমি কাজ করি এমন কয়েকটি বৃহত সি # কোডবাসের চারপাশে ভাসমান, মূলত নিম্নলিখিত খুব ঘনীভূত স্নিপেটের মতো জিনিসগুলি:

// Helpers.cs

public static class Helpers
{
    public static void DoSomething() {}
    public static void DoSomethingElse() {}
}

নির্দিষ্ট পর্যালোচনাগুলি আমি পর্যালোচনা করেছি

  • বেশিরভাগই একে অপরের সাথে সম্পর্কিত নয়,
  • আমন্ত্রণগুলি জুড়ে স্পষ্ট রাষ্ট্র ছাড়া,
  • ছোট, এবং
  • প্রতিটি অপ্রাসঙ্গিক প্রকারের দ্বারা গ্রাস করা হয়।

সম্পাদনা করুন: উপরোক্ত অভিযোগযুক্ত সমস্যার তালিকা হতে পারে না। আমি যে নির্দিষ্ট পদ্ধতিগুলি পর্যালোচনা করছি তার সাধারণ বৈশিষ্ট্যের একটি তালিকা। উত্তরের আরও প্রাসঙ্গিক সমাধান সরবরাহে সহায়তা করার প্রসঙ্গ এটি।

এই প্রশ্নের জন্য, আমি এই ধরণের পদ্ধতিটিকে GLUM (সাধারণ লাইটওয়েট ইউটিলিটি পদ্ধতি) হিসাবে উল্লেখ করব। "গ্লাম" এর নেতিবাচক ধারণাটি আংশিকভাবে উদ্দিষ্ট। আমি যদি এটি একটি বোবা শ্লেষ হিসাবে আসে।

এমনকি GLUMs সম্পর্কে আমার নিজস্ব ডিফল্ট সংশয়কে একপাশে রেখেও, আমি এই সম্পর্কে নিম্নলিখিত বিষয়গুলি পছন্দ করি না:

  • একটি স্থির শ্রেণি পুরোপুরি নামস্থান হিসাবে ব্যবহৃত হচ্ছে।
  • স্ট্যাটিক ক্লাস শনাক্তকারী মূলত অর্থহীন।
  • যখন একটি নতুন জিএলএম যুক্ত হয়, হয় (ক) এই "ব্যাগ" শ্রেণিটি অকারণে স্পর্শ করে বা (খ) একটি নতুন "ব্যাগ" শ্রেণি তৈরি হয় (যা নিজেই সাধারণত কোনও সমস্যা নয়; খারাপটি কী নতুনটি হয়) অবিচলিত ক্লাসগুলি প্রায়শই কেবল সম্পর্কিত না হওয়া সমস্যার পুনরাবৃত্তি করে তবে কয়েকটি পদ্ধতিতে)।
  • মেটা-নামকরণ, অনেকটা সে-কারণেই ভয়াবহ, অ-মানক, এবং সাধারণত অভ্যন্তরীণভাবে সঙ্গতিহীন কিনা এটা Helpers, Utilitiesঅথবা যা খুশি।

এটিকে রিফ্যাক্টর করার পক্ষে যুক্তিসঙ্গতভাবে ভাল এবং সাধারণ প্যাটার্নটি কী, সর্বোপরি উপরের উদ্বেগগুলি সমাধান করার জন্য এবং যথাসম্ভব হালকা স্পর্শের সাথে সম্ভব?

আমার সম্ভবত জোর দেওয়া উচিত: আমি যে সমস্ত পদ্ধতির সাথে व्यवहार করছি সেগুলি একে অপরের সাথে যুগলভাবে সম্পর্কযুক্ত। এগুলি নিখরচায়িত দানাযুক্ত এখনও বহু সদস্যের স্ট্যাটিক শ্রেণির পদ্ধতি ব্যাগগুলিতে ভাঙ্গার কোনও যুক্তিসঙ্গত উপায় বলে মনে হচ্ছে না।


1
GLUMs সম্পর্কে I: আমি মনে করি "লাইটওয়েট" এর সংক্ষিপ্তসারটি অপসারণ করা যেতে পারে, যেহেতু সর্বোত্তম অনুশীলনগুলি অনুসরণ করে পদ্ধতিগুলি লাইটওয়েট হওয়া উচিত;)
ফ্যাবিও

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

উত্তর:


17

আমার মনে হয় আপনার দুটি সমস্যা একে অপরের সাথে সম্পর্কিত।

  • স্ট্যাটিক ক্লাসে যুক্তিযুক্তভাবে সম্পর্কিত নয় functions
  • স্থির শ্রেণীর নামগুলি অন্তর্ভুক্ত ফাংশনগুলির অর্থ / প্রসঙ্গ সম্পর্কে সহায়ক তথ্য সরবরাহ করে না।

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

উদ্বেগ এবং সম্ভাব্য সমাধান

পদ্ধতিগুলি বেশিরভাগ একে অপরের সাথে সম্পর্কিত নয় - সমস্যা। একটি স্থিতিশীল শ্রেণীর অধীনে সম্পর্কিত পদ্ধতিগুলি একত্রিত করুন এবং সম্পর্কিত নয় এমন পদ্ধতিগুলি তাদের নিজস্ব স্ট্যাটিক শ্রেণিতে স্থানান্তর করুন।

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

পদ্ধতিগুলি ছোট - কোনও সমস্যা নয়। - পদ্ধতিগুলি ছোট হওয়া উচিত

পদ্ধতিগুলি প্রত্যেকে বিভিন্ন প্রকার সম্পর্কহীন প্রকারের দ্বারা গ্রহণ করা হয় - কোনও সমস্যা নয়। আপনি একটি সাধারণ পদ্ধতি তৈরি করেছেন যা সম্পর্কিত নয় এমন অনেক জায়গায় আবার ব্যবহার করা যেতে পারে।

কোনও স্ট্যাটিক শ্রেণি পুরোপুরি নামস্থান হিসাবে ব্যবহৃত হচ্ছে - কোনও সমস্যা নয়। স্থির পদ্ধতিগুলি এভাবে ব্যবহৃত হয়। যদি এই স্টাইলিং কলিং পদ্ধতিগুলি আপনাকে বিরক্ত করে, তবে এক্সটেনশন পদ্ধতি বা using staticঘোষণার ব্যবহার করে দেখুন ।

স্থির শ্রেণীর শনাক্তকারী মূলত অর্থহীন - সমস্যা । এটি অর্থহীন কারণ কারণ বিকাশকারীরা এতে কোনও সম্পর্কযুক্ত পদ্ধতি রাখছেন না। সম্পর্কহীন পদ্ধতিগুলিকে তাদের নিজস্ব স্ট্যাটিক শ্রেণিতে রাখুন এবং তাদের নির্দিষ্ট এবং বোধগম্য নাম দিন।

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

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

মেটা-নামকরণ অনিবার্যভাবে ভয়াবহ, অ-মানক এবং সাধারণত অভ্যন্তরীণভাবে বেমানান, সে হেল্পার, ইউটিলিটিস বা যাই হোক না কেন - সমস্যা। প্রত্যাশিত আচরণ বর্ণনা করে এমন আরও ভাল নাম সরবরাহ করুন। কেবলমাত্র একটি সম্পর্কিত ক্লাসে সম্পর্কিত পদ্ধতি রাখুন, যা আরও ভাল নামকরণে সহায়তা করে।


এটি কোনও এসআরপি লঙ্ঘন নয়, তবে একটি পরিষ্কার / বন্ধ নীতি লঙ্ঘন clearly এটি বলেছিল, আমি সাধারণত ওসিপিটিকে তার মূল্য থেকে বেশি সমস্যায় পেয়েছি
পল

2
@ পল, ওপেন / ক্লোজ নীতিটি স্ট্যাটিক ক্লাসের জন্য প্রয়োগ করা যাবে না। আমার বক্তব্যটি ছিল, এসআরপি বা ওসিপি নীতিগুলি স্ট্যাটিক ক্লাসগুলির জন্য প্রয়োগ করা যায় না। আপনি স্থির পদ্ধতিতে এটি প্রয়োগ করতে পারেন।
ফ্যাবিও

ঠিক আছে, এখানে কিছু বিভ্রান্তি ছিল। প্রশ্নের আইটেমগুলির প্রথম তালিকাটি অভিযোগযুক্ত সমস্যার তালিকা নয় । আমি যে নির্দিষ্ট পদ্ধতিগুলি পর্যালোচনা করছি তার সাধারণ বৈশিষ্ট্যের একটি তালিকা। উত্তরগুলি আরও প্রয়োগযোগ্য সমাধান সরবরাহ করতে সহায়তা করার প্রসঙ্গ এটি। আমি স্পষ্ট করতে সম্পাদনা করব।
উইলিয়াম

1
পুনরায় "নেমস্পেস হিসাবে স্থির শ্রেণি", এটি সাধারণ প্যাটার্নের অর্থ এই নয় যে এটি কোনও বিরোধী-নিদর্শন নয়। এই নির্দিষ্ট নিম্ন-সংহত স্থিত শ্রেণীর মধ্যে পদ্ধতি (যা মূলত সি / সি ++ থেকে একটি শব্দ ধার করার জন্য "ফ্রি ফাংশন") এই ক্ষেত্রে অর্থবহ সত্তা। এই নির্দিষ্ট প্রসঙ্গে, একক ফাইলে 100 টি পদ্ধতিযুক্ত Aস্ট্যাটিক শ্রেণির চেয়ে 100 একক-পদ্ধতি স্ট্যাটিক ক্লাস (100 ফাইলে) সহ একটি উপ-নেমস্পেস থাকা কাঠামোগতভাবে ভাল বলে মনে হয় A
উইলিয়াম

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

5

কেবল কনভেনশনটিকে আলিঙ্গন করুন যে সি # তে এই জাতীয় পরিস্থিতিতে স্থির ক্লাসগুলি নামপথের মতো ব্যবহৃত হয়। নেমস্পেসগুলি ভাল নাম পায়, তাই এই ক্লাসগুলি করা উচিত। using staticসি # 6 এর বৈশিষ্ট্যটি জীবনকে আরও সহজ করে তোলে।

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

  • আছে ভাল নাম নতুন স্ট্যাটিক ক্লাস এবং
  • আপনি প্রকৃতপক্ষে আপনার প্রকল্পের রক্ষণাবেক্ষণের সুবিধার জন্য এটি বিচার করুন।

সংকলিত উদাহরণ হিসাবে, Helpers.LoadImageএমন কিছু হতে পারে FileSystemInteractions.LoadImage

তবুও, আপনি স্ট্যাটিক ক্লাস পদ্ধতি-ব্যাগগুলি দিয়ে শেষ করতে পারেন। এটি ঘটতে পারে এমন কয়েকটি উপায়ে:

  • মূল পদ্ধতিগুলির মধ্যে কেবল কয়েকটি (বা কোনওই নয়) তাদের নতুন ক্লাসগুলির ভাল নাম রয়েছে।
  • নতুন ক্লাসগুলি পরে অন্যান্য প্রাসঙ্গিক পদ্ধতিগুলি অন্তর্ভুক্ত করতে বিকশিত হতে পারে।
  • সম্ভবত আসল শ্রেণীর নামটি দুর্গন্ধযুক্ত নয় এবং প্রকৃতপক্ষে ঠিক ছিল।

এটি মনে রাখা গুরুত্বপূর্ণ যে এই স্থির শ্রেণীর পদ্ধতি-ব্যাগগুলি সত্যিকারের সি # কোডবাসে ভয়ঙ্করভাবে অস্বাভাবিক নয়। কয়েকটি ছোট ছোট্ট হওয়া সম্ভবত প্যাথলজিকাল নয়


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

এই প্যাটার্নটি ব্যবহার করে ডামি প্রকল্পের কাঠামো

Program.cs

namespace ConsoleApp1
{
    using static Foo;
    using static Flob;

    class Program
    {
        static void Main(string[] args)
        {
            Bar();
            Baz();
            Wibble();
            Wobble();
        }
    }
}

Foo / Bar.cs

namespace ConsoleApp1
{
    static partial class Foo
    {
        public static void Bar() { }
    }
}

Foo / Baz.cs

namespace ConsoleApp1
{
    static partial class Foo
    {
        public static void Baz() { }
    }
}

Flob / Wibble.cs

namespace ConsoleApp1
{
    static partial class Flob
    {
        public static void Wibble() { }
    }
}

Flob / Wobble.cs

namespace ConsoleApp1
{
    static partial class Flob
    {
        public static void Wobble() { }
    }
}

-6

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

আপনি যদি গণিতের লাইব্রেরি বা কিছু লিখছেন তবে আমি প্রস্তাব করব, যদিও আমি সাধারণত তাদের ঘৃণা করি, এক্সটেনশন পদ্ধতি।

আপনি স্ট্যান্ডার্ড ডেটাটাইপগুলিতে ফাংশন যুক্ত করতে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করতে পারেন।

উদাহরণস্বরূপ বলি যে আমি হেল্পার্সের পরিবর্তে আমার একটি সাধারণ ক্রিয়াকলাপ মাইসোর্ট () রেখেছি yমায়েসোর্ট বা একটি নতুন তালিকাঅফমাইটিংসিংস যুক্ত করুন y মাইসোর্টটি আমি এটি আইনেউমারেবল যুক্ত করতে পারি


বিষয়টি হ'ল আরও একটি "হার্ড চেহারা" না নেওয়া। মূল বিষয়টি হ'ল একটি পুনরায় ব্যবহারযোগ্য প্যাটার্ন যা সহজেই ইউটিলিটির একটি "ব্যাগ" পরিষ্কার করতে পারে। আমি জানি যে ইউটিলিটিগুলি গন্ধযুক্ত। প্রশ্ন এই বলে। লক্ষ্য হ'ল এই স্বতন্ত্র (তবে খুব ঘনিষ্ঠভাবে সহ-অবস্থিত) ডোমেন সত্ত্বাগুলি আপাতত বিচ্ছিন্ন করা এবং প্রকল্পের বাজেটে যতটা সম্ভব সহজ হওয়া।
উইলিয়াম

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


1
@ ইভান যে কোনও অনুষ্ঠান নয়, এটি একটি সাধারণ উদ্দেশ্য প্রতিনিধি স্বাক্ষর ...
দ্য থ্যাটিক্সহিসার

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