প্রচুর স্থিতিশীল পদ্ধতি ব্যবহার করা কোনও খারাপ জিনিস?


97

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

আমি স্ট্যাটিক পদ্ধতিগুলিকে অতিরিক্ত ব্যবহার না করার জন্য (স্ট্যাকওভারফ্লো সহ) বিভিন্ন সুপারিশ পড়েছি তবে উপরের থাম্বের নিয়মটিতে এটি কী ভুল তা আমি এখনও বুঝতে ব্যর্থ হয়েছি।

এটি কি যুক্তিসঙ্গত পন্থা বা না?


হ্যাঁ, তাই এটি দেখুন: yegor256.com/2014/05/05/oop-al
متبادل-

উত্তর:


154

দুটি ধরণের সাধারণ স্থিতিশীল পদ্ধতি রয়েছে:

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

"অনিরাপদ" স্ট্যাটিক্সগুলির কয়েকটি প্রচলিত ব্যবহার রয়েছে - উদাহরণস্বরূপ, সিঙ্গলটন প্যাটার্নে - তবে সচেতন থাকুন যে আপনি যে কোনও সুন্দর নাম সত্ত্বেও আপনি কেবল বৈশ্বিক পরিবর্তনশীলকে পরিবর্তন করছেন। অনিরাপদ স্ট্যাটিক্স ব্যবহার করার আগে সাবধানে চিন্তা করুন।


এটি হ'ল আমার ঠিক সেই সমস্যাটিই সমাধান করতে হয়েছিল - সিঙ্গলটন অবজেক্টের ব্যবহার বা পরিবর্তনের অপব্যবহার।
17

সবচেয়ে দুর্দান্ত উত্তরের জন্য আপনাকে ধন্যবাদ। আমার প্রশ্ন হ'ল, যদি সিঙ্গেলটনগুলি স্থির পদ্ধতিগুলির পরামিতি হিসাবে পাস করা হয় তবে এটি কী স্থির পদ্ধতিটিকে অনিরাপদ করে তোলে?
টনি ডি

4
"খাঁটি ফাংশন" এবং "অপরিষ্কার ফাংশন" পদগুলি আপনি "নিরাপদ" এবং "অনিরাপদ" স্ট্যাটিকসকে কল করেন তার ক্রিয়ামূলক প্রোগ্রামিংয়ে দেওয়া নাম names
ওমনিমিক

19

কোনও অভ্যন্তরীণ অবস্থা ব্যতীত কোনও জিনিস সন্দেহজনক জিনিস।

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

অন্যান্য সময়, এটি কোনও বস্তু ভাষায় প্রক্রিয়াগত নকশা করা হয়।


6
আপনি যা বলছেন তা আমি শুনতে পেয়েছি, তবে ম্যাথ অবজেক্টের মতো কিছু কীভাবে আচরণ ব্যতীত অন্য কিছুকে আবদ্ধ করতে পারে?
জোনোডাব্লু

10
তিনি কেবল সন্দেহজনক বলেছিলেন, ভুল নয়, এবং তিনি একেবারে ঠিক।
বিল কে

4
@ জোনোডাব্লু: ম্যাথ একটি খুব বিশেষ ঘটনা যেখানে অনেকগুলি রাষ্ট্র বিহীন কার্য রয়েছে। অবশ্যই আপনি জাভাতে ফাংশনাল প্রোগ্রামিং করছেন, আপনার অনেক স্টেটলেস ফাংশন রয়েছে।
এস .লট

14

জন মিলিকিনের দুর্দান্ত উত্তরের এটি কেবল একটি অনুসরণ।


যদিও স্টেটলেস পদ্ধতিগুলি (যা বেশ কার্যকরী) স্থিতিশীল করা নিরাপদ হতে পারে তবে এটি কখনও কখনও সংযোজন করতে পারে যা সংশোধন করা শক্ত। আপনার যেমন স্থির পদ্ধতি রয়েছে তা বিবেচনা করুন:

public class StaticClassVersionOne {
    public static void doSomeFunkyThing(int arg);
}

যাকে আপনি বলেছেন:

StaticClassVersionOne.doSomeFunkyThing(42);

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

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

এটি হতে পারে বা এটি কোনও সম্ভাব্য পরিস্থিতি নাও হতে পারে তবে আমি এটি বিবেচনা করার মতো বলে মনে করি।


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

6

অন্য বিকল্পটি হ'ল উত্সর বস্তুটিতে স্থিতিশীল পদ্ধতি হিসাবে যুক্ত করা:

অর্থাত্ পরিবর্তন:

public class BarUtil {
    public static Foo transform(Bar toFoo) { ... }
}

মধ্যে

public class Bar {
    ...
    public Foo transform() { ...}
}

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


5

স্থির ক্লাসগুলি যতক্ষণ না তারা সঠিক জায়গায় ব্যবহার করা হয় ঠিক আছে fine

যথা: যে পদ্ধতিগুলি 'পাতা' পদ্ধতিগুলি (তারা রাষ্ট্র পরিবর্তন করে না, তারা কেবল ইনপুটটিকে কোনওভাবে রূপান্তরিত করে)। এর ভাল উদাহরণগুলি হ'ল পাথ.কোমাইনের মতো জিনিস। এই ধরণের জিনিস দরকারী এবং টিয়ার সিনট্যাক্স জন্য তৈরি।

সমস্যারস্ট্যাটিক্স নিয়ে আমার তা অনেকগুলি:

প্রথমত, আপনার যদি স্ট্যাটিক ক্লাস থাকে তবে নির্ভরতাগুলি লুকানো থাকে। নিম্নোক্ত বিবেচনা কর:

public static class ResourceLoader
{
    public static void Init(string _rootPath) { ... etc. }
    public static void GetResource(string _resourceName)  { ... etc. }
    public static void Quit() { ... etc. }
}

public static class TextureManager
{
    private static Dictionary<string, Texture> m_textures;

    public static Init(IEnumerable<GraphicsFormat> _formats) 
    {
        m_textures = new Dictionary<string, Texture>();

        foreach(var graphicsFormat in _formats)
        {
              // do something to create loading classes for all 
              // supported formats or some other contrived example!
        }
    }

    public static Texture GetTexture(string _path) 
    {
        if(m_textures.ContainsKey(_path))
            return m_textures[_path];

        // How do we know that ResourceLoader is valid at this point?
        var texture = ResourceLoader.LoadResource(_path);
        m_textures.Add(_path, texture);
        return texture; 
    }

    public static Quit() { ... cleanup code }       
}

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

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

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

সংক্ষেপে, স্ট্যাটিকস কিছু জিনিস এবং ছোট সরঞ্জাম বা নিক্ষিপ্ত কোডের জন্য ঠিক আছে আমি তাদের ব্যবহারকে নিরুৎসাহিত করব না। তবে এর বাইরেও এগুলি রক্ষণাবেক্ষণযোগ্যতা, ভাল নকশা এবং পরীক্ষার স্বাচ্ছন্দ্যের জন্য একটি রক্তাক্ত দুঃস্বপ্ন।

সমস্যাগুলির জন্য এখানে একটি ভাল নিবন্ধ: http://gamearchitect.net/2008/09/13/an-anatomy-of-despair-managers-and-contexts/


4

স্থিতিশীল পদ্ধতিগুলি থেকে আপনাকে দূরে সরিয়ে দেওয়ার কারণ হ'ল এগুলি ব্যবহার করা কোনও একটি অবজেক্টের সুবিধাকে হারায়। অবজেক্টগুলি ডেটা এনক্যাপসুলেশনের জন্য তৈরি। এটি অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়াগুলি ঘটতে বাধা দেয় যা বাগগুলি এড়িয়ে চলে। স্থির পদ্ধতিতে কোনও এনক্যাপসুলেটেড ডেটা নেই * এবং তাই এই সুবিধাটি অর্জন করবেন না।

এটি বলেছে, আপনার যদি অভ্যন্তরীণ ডেটা ব্যবহার না করে তবে তারা ব্যবহার করতে ভাল এবং কার্যকর করার জন্য কিছুটা দ্রুত। আপনি সেগুলিতে যদিও বৈশ্বিক ডেটা স্পর্শ করছেন না তা নিশ্চিত করুন।

  • কিছু ভাষার ক্লাস-লেভেল ভেরিয়েবল রয়েছে যা ডেটা এবং স্ট্যাটিক পদ্ধতিগুলির এনক্যাপসুলেশনের অনুমতি দেয়।

4

এটি একটি যুক্তিসঙ্গত পদ্ধতির বলে মনে হচ্ছে। আপনি অনেকগুলি স্থিতিশীল শ্রেণি / পদ্ধতি ব্যবহার করতে চান না তার কারণ হ'ল আপনি অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং থেকে সরে গিয়ে আরও বেশি কাঠামোগত প্রোগ্রামিংয়ের ক্ষেত্রের দিকে চলে যাচ্ছেন।

আপনার ক্ষেত্রে যেখানে আপনি কেবল A কে B তে রূপান্তর করছেন, সেখানে বলুন আমরা যা করছি তা হ'ল পাঠ্যকে রূপান্তর করা

"hello" =>(transform)=> "<b>Hello!</b>"

তারপরে একটি স্ট্যাটিক পদ্ধতিটি বোধগম্য হবে।

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

class Interface{
    method toHtml(){
        return transformed string (e.g. "<b>Hello!</b>")
    }

    method toConsole(){
        return transformed string (e.g. "printf Hello!")
    }
}


class Object implements Interface {
    mystring = "hello"

    //the implementations of the interface would yield the necessary 
    //functionality, and it is reusable across the board since it 
    //is an interface so... you can make it specific to the object

   method toHtml()
   method toConsole()
}

সম্পাদনা করুন: স্থির পদ্ধতির দুর্দান্ত ব্যবহারের একটি ভাল উদাহরণ হ'ল এসপি.নেট এমভিসি বা রুবিতে এইচটিএমএল সহায়ক পদ্ধতি। তারা এইচটিএমএল উপাদান তৈরি করে যা কোনও বস্তুর আচরণের সাথে আবদ্ধ হয় না এবং তাই স্থিতিশীল।

সম্পাদনা 2: কাঠামোগত প্রোগ্রামিংয়ে ফাংশনাল প্রোগ্রামিং পরিবর্তিত হয়েছে (কোনও কারণে আমি বিভ্রান্ত হয়ে পড়েছি), টর্স্টেনের কাছে সেগুলি উল্লেখ করার জন্য প্রপসগুলি।


4
আমি মনে করি না যে স্ট্যাটিক পদ্ধতি ব্যবহার করা কার্যকরী প্রোগ্রামিং হিসাবে যোগ্যতা অর্জন করে, তাই আমি অনুমান করছি যে আপনি মানে স্ট্রাকচার্ড প্রোগ্রামিং।
টর্স্টেন মেরেক

3

আমি সম্প্রতি কিছু ক্লাস অপসারণ / সংশোধন করার জন্য একটি অ্যাপ্লিকেশন রিফেক্টর করেছি যা প্রাথমিকভাবে স্ট্যাটিক ক্লাস হিসাবে প্রয়োগ করা হয়েছিল। সময়ের সাথে সাথে এই ক্লাসগুলি এত বেশি পরিমাণে অর্জন করেছিল এবং লোকেরা কেবল নতুন ফাংশনগুলিকে স্থির হিসাবে ট্যাগ করে রেখেছিল, কারণ এর আশেপাশে কখনও ভাসমান ঘটনা ছিল না।

সুতরাং, আমার উত্তর হ'ল স্থির শ্রেণিগুলি সহজাত খারাপ নয় তবে এখনই উদাহরণগুলি তৈরি করা আরও সহজ হতে পারে, তারপরে পরে রিফ্যাক্টর করতে হবে।


3

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


2

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

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

এবং স্থির পদ্ধতির কোনও অনুরূপ সুবিধা নেই।

হ্যাঁ, তারা খারাপ।


1

যতক্ষণ না অভ্যন্তরীণ অবস্থা কার্যকর হয়, ততক্ষণ তা ঠিক। নোট করুন যে সাধারণত স্থিতিশীল পদ্ধতিগুলি থ্রেড-নিরাপদ বলে আশা করা হয়, তাই আপনি যদি সহায়তাকারী ডেটা স্ট্রাকচার ব্যবহার করেন তবে সেগুলি থ্রেড-নিরাপদ উপায়ে ব্যবহার করুন।


1

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


1

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

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

সুতরাং আমার অ্যাপ যুক্তিতে আমার সাধারণত ছোট স্ট্যাটিক ইউটিলিটি-জাতীয় পদ্ধতি কল থাকে। অর্থাৎ

static cutNotNull(String s, int length){
  return s == null ? null : s.substring(0, length);
}

এর একটি সুবিধা হ'ল আমি এই ধরণের পদ্ধতিগুলি পরীক্ষা করি না :-)


1

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

   public class BusinessService
   {

        public Guid CreateItem(Item newItem, Guid userID, Guid ownerID)
        {
            var newItemId = itemsRepository.Create(createItem, userID, ownerID);
            **var searchItem = ItemsProcessor.SplitItem(newItem);**
            searchRepository.Add(searchItem);
            return newItemId;
        }
    }

আপনি এটিতে স্থির পদ্ধতি কল দেখতে পান ItemsProcessor.SplitItem(newItem);কারণটির গন্ধ হয়

  • আপনি সুস্পষ্ট নির্ভরতা ঘোষিত করবেন না এবং যদি আপনি কোডটি খনন না করেন তবে আপনি আপনার শ্রেণি এবং স্থির পদ্ধতির ধারকের মধ্যে সংযোগকে উপেক্ষা করতে পারেন
  • আপনি BusinessServiceএটি থেকে বিচ্ছিন্নতা পরীক্ষা করতে পারবেন না ItemsProcessor(বেশিরভাগ পরীক্ষার সরঞ্জামগুলি স্ট্যাটিক ক্লাসগুলিকে উপহাস করে না) এবং এটি ইউনিট পরীক্ষা অসম্ভব করে তোলে। ইউনিট পরীক্ষা নেই == নিম্ন মানের

0

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

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