রাষ্ট্রহীনতা সম্পর্কে অভিজাত ধারণা হিসাবে "স্থিতিশীল"?


11

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

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

//Before
import com.thirdparty.ThirdPartyLibrary.Thingy;
public class ThirdPartyLibraryWrapper {
    public static Thingy newThingy(InputType input) {
         new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
    }
}

//called as...
ThirdPartyLibraryWrapper.newThingy(input);
//After
public class ThirdPartyFactory {
    public Thingy newThingy(InputType input) {
         new Thingy.Builder().withInput(input).alwaysFrobnicate().build();
    }
}

//called as...
thirdPartyFactoryInstance.newThingy(input);

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

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

উত্তর:


12

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

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

নিম্নোক্ত বিবেচনা কর:

public static class Logger
{
    public static int LogLevel { get; set; }

    public static void Log(string message, int logLevel)
    {
        if (logLevel >= LogLevel)
        {
            // logs the message, but only if it is important enough.
        }
    }
}

এই শ্রেণিটি কেবল রাষ্ট্র ধারণ করে না, তবে রাষ্ট্রটি Logger.Log()পরিবর্তিত হলে পদ্ধতির আচরণ পরিবর্তন হয়। এটি একটি শ্রেণিবদ্ধের নিখুঁতভাবে বৈধ অনুশীলন static, তবে এর মধ্যে এমন কোনও শব্দার্থ গ্যারান্টি নেই যা আপনি পরামর্শ দিচ্ছেন।


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

1
সাধারণত এই ধরনের প্রত্যাশাগুলি পদ্ধতির নথিতে অন্তর্ভুক্ত থাকে; থ্রেড সুরক্ষার ক্ষেত্রেও একই কথা।
রবার্ট হার্ভে

5

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

এটি বলা হচ্ছে, আমার কোডে কী কী ক্লু থাকা উচিত এটি বজায় রাখার জন্য বরাবর আসার জন্য কী আছে এবং কী নয়?

একটি সঠিক সমাধান হ'ল ডকুমেন্ট (উদাহরণস্বরূপ জাভাদোক); এছাড়াও, ফাংশনটির নাম এবং এটি কখনও কখনও যা করে তা থেকে এটি অনুমান করা যায় যে স্থির ক্রিয়াটি একটি খাঁটি ফাংশন। উদাহরণস্বরূপ কারও কাছে বিশ্বাস করার কোনও কারণ নেই যে Assert.assertTrue(boolean)জুনিয়ট থেকে কোথাও কোথাও কোনও রাজ্য পরিবর্তন হবে। অন্যদিকে যখন কোনও ফাংশন System.clearProperty(String)বলা হয় তখন এটি স্পষ্টতই স্পষ্ট হয় যে পার্শ্ব-প্রতিক্রিয়া থাকবে।


"নলিপোটেন্ট" এবং "স্টেটলেস" এর মধ্যে পার্থক্য কী?
প্যাসেরিয়ার

@ পেসারিয়র কোনও পার্থক্য থাকা উচিত নয়।
m3th0dman

4

এটি বলা হচ্ছে, আমার কোডে কী কী ক্লু থাকা উচিত এটি বজায় রাখার জন্য বরাবর আসার জন্য কী আছে এবং কী নয়?

আপনি এগুলি স্থির করতে পারেন। সি # বিশ্বে FxCop ওভার আপনাকে এমন জিনিসগুলিকে স্থিতিশীল করতে বাধ্য করবে যা কোনও রেফারেন্স সদস্যের ভেরিয়েবলগুলি না করে। এটি সঠিক জিনিস (সাধারণত)।

আমি যখন বুঝতে পারি যে সিঙ্গেলন এবং স্ট্যাটিক্সকে উপহাস করার জন্য এটি কী বেদনাদায়ক ছিল, অবশেষে আমি তাদের সম্পর্কে এই মুহুর্তে যা পড়ছি তা "পেয়েছি"।

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


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

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