আপনি যদি 'চূড়ান্ত' কীওয়ার্ড ছাড়াই 'স্ট্যাটিক' কীওয়ার্ডটি ব্যবহার করেন তবে আপনার ডিজাইনটি সাবধানতার সাথে বিবেচনা করার জন্য এটি একটি সংকেত হওয়া উচিত। এমনকি একটি 'চূড়ান্ত' উপস্থিতি একটি বিনামূল্যে পাস নয়, যেহেতু একটি পরিবর্তনীয় স্থিতিশীল চূড়ান্ত বস্তু ঠিক ততটাই বিপজ্জনক হতে পারে।
আমি প্রায় 85% কোথাও অনুমান করব যে আমি 'ফাইনাল' ছাড়াই 'স্থিতিশীল' দেখছি, এটি ভুল। প্রায়শই, আমি এই সমস্যাগুলি মুখোশ করতে বা আড়াল করতে অদ্ভুত কাজের সন্ধান করব।
অনুগ্রহ করে স্থির পরিবর্তনীয় তৈরি করবেন না। বিশেষত সংগ্রহ। সাধারণভাবে, সংগ্রহগুলি যখন তাদের ধারণকৃত বস্তুটি আরম্ভ করা হয় তখন তাদের নকশাকৃত নকশাগুলি তৈরি করা উচিত যাতে সেগুলি পুনরায় সেট করা হয় বা তাদের ধারণকৃত বস্তুটি কখন ভুলে যায় about
স্ট্যাটিক্স ব্যবহার করা খুব সূক্ষ্ম বাগ তৈরি করতে পারে যা ইঞ্জিনিয়ারদের অনেক দিন ধরে ব্যথা করতে পারে। আমি জানি, কারণ আমি উভয়ই এই বাগগুলি তৈরি এবং শিকার করেছি।
আপনি যদি আরও বিশদ চান, দয়া করে পড়ুন…
স্ট্যাটিকস কেন ব্যবহার করবেন না?
স্ট্যাটিক্সের সাথে অনেকগুলি বিষয় রয়েছে যেমন টেস্ট লেখার এবং সম্পাদন করার পাশাপাশি সূক্ষ্ম বাগগুলি যা তাত্ক্ষণিকভাবে সুস্পষ্ট নয়।
স্ট্যাটিক অবজেক্টের উপর নির্ভর করে এমন কোডগুলি সহজেই ইউনিট পরীক্ষা করা যায় না এবং স্ট্যাটিক্স সহজেই উপহাস করা যায় না (সাধারণত)।
আপনি যদি স্ট্যাটিক ব্যবহার করেন তবে উচ্চ স্তরের উপাদানগুলির পরীক্ষা করার জন্য শ্রেণীর প্রয়োগের অদলবদল করা সম্ভব নয়। উদাহরণস্বরূপ, স্ট্যাটিক গ্রাহক ডিওও কল্পনা করুন যা ডাটাবেস থেকে গ্রাহক বস্তুগুলি লোড করে দেয় returns এখন আমার কাছে ক্লাস গ্রাহক ফিল্টার রয়েছে, এর জন্য কিছু গ্রাহক বস্তু অ্যাক্সেস করা দরকার। যদি কাস্টমারডিও স্থিতিশীল থাকে তবে আমি প্রথমে আমার ডেটাবেস আরম্ভ না করে দরকারী তথ্য পপুলিশ না করে গ্রাহকফিল্টারের জন্য পরীক্ষা লিখতে পারি না।
এবং ডাটাবেস জনসংখ্যা এবং সূচনা দীর্ঘ সময় নেয় takes এবং আমার অভিজ্ঞতায় আপনার ডিবি প্রারম্ভিক কাঠামোটি সময়ের সাথে সাথে পরিবর্তিত হবে, যার অর্থ ডেটা আকারের আকার ধারণ করবে এবং পরীক্ষাগুলি ভেঙে যেতে পারে। আই, কল্পনা করুন গ্রাহক 1 একটি ভিআইপি হিসাবে ব্যবহৃত হত, তবে ডিবি আরম্ভের কাঠামোটি বদলে গেছে, এবং এখন গ্রাহক 1 আর ভিআইপি নয়, তবে আপনার পরীক্ষা গ্রাহক 1 লোড করার জন্য কঠোর কোডে ছিল ...
গ্রাহকদাওকে তাত্ক্ষণিকভাবে তৈরি করা এবং এটি নির্মাণের পরে কাস্টমারফিল্টারে পাস করা আরও ভাল পদ্ধতির। (এর চেয়েও ভাল উপায় হ'ল বসন্ত বা নিয়ন্ত্রণের কাঠামোর অন্য কোনও বিপরীতমুখী ব্যবহার করা।
একবার আপনি এটি করার পরে, আপনি দ্রুত আপনার গ্রাহক ফিল্টারটেষ্টে একটি বিকল্প ডিএওর উপহাস বা স্টক করতে পারেন, যা আপনাকে পরীক্ষার উপর আরও নিয়ন্ত্রণ রাখতে দেয়,
স্ট্যাটিক ডিএও ছাড়াই, পরীক্ষাটি দ্রুত হবে (কোনও ডিবি প্রারম্ভিককরণ নয়) এবং আরও নির্ভরযোগ্য (কারণ ডিবি ইনিশিয়াল কোড পরিবর্তন হলে এটি ব্যর্থ হবে না)। উদাহরণস্বরূপ, এক্ষেত্রে গ্রাহক 1 নিশ্চিত করা সর্বদা একজন ভিআইপি থাকবে, যতক্ষণ না পরীক্ষার বিষয়।
কার্যকর পরীক্ষা
একসাথে ইউনিট পরীক্ষার স্যুটগুলি চালানোর সময় পরিসংখ্যানগুলি একটি আসল সমস্যা সৃষ্টি করে (উদাহরণস্বরূপ, আপনার অবিচ্ছিন্ন ইন্টিগ্রেশন সার্ভারের সাথে)। নেটওয়ার্ক সকেট অবজেক্টের স্থিত মানচিত্রের কল্পনা করুন যা এক পরীক্ষা থেকে অন্য পরীক্ষায় খোলা থাকে। প্রথম পরীক্ষাটি 8080 বন্দরে সকেট খুলতে পারে, তবে পরীক্ষাটি নষ্ট হয়ে গেলে আপনি মানচিত্রটি সাফ করতে ভুলে গিয়েছিলেন। এখন যখন দ্বিতীয় পরীক্ষা শুরু হয়, তখন এটি 8080 বন্দরটির জন্য একটি নতুন সকেট তৈরি করার চেষ্টা করার সময় ক্রাশ হওয়ার সম্ভাবনা রয়েছে, যেহেতু বন্দরটি এখনও দখল করা আছে। আপনার স্ট্যাটিক সংগ্রহের সকেট রেফারেন্সগুলি সরানো হয়নি এবং (ওয়েকহ্যাশম্যাপ বাদে) কখনও ময়লা ফেলার কারণেই ময়লা আবর্জনা সংগ্রহের জন্য যোগ্য নয় বলে মনে করুন।
এটি একটি অতি-সাধারণ উদাহরণ, তবে বড় সিস্টেমে এই সমস্যাটি সমস্ত সময় হয়। লোকেরা একই জেভিএম-এ বারবার তাদের সফ্টওয়্যারটি শুরু এবং বন্ধ করার বিষয়ে ইউনিট পরীক্ষার কথা ভাবেন না, তবে এটি আপনার সফ্টওয়্যার ডিজাইনের একটি ভাল পরীক্ষা এবং যদি আপনার উচ্চতর প্রাপ্যতার দিকে উচ্চাকাঙ্ক্ষা থাকে তবে এটি আপনার সচেতন হওয়া দরকার।
এই সমস্যাগুলি প্রায়শই ফ্রেমওয়ার্ক আইটেমগুলির সাথে উত্থাপিত হয়, উদাহরণস্বরূপ, আপনার ডিবি অ্যাক্সেস, ক্যাশিং, বার্তা এবং লগিং স্তরগুলি। আপনি যদি জাভা ইই বা কিছু সেরা ব্রেড ফ্রেমওয়ার্ক ব্যবহার করছেন তবে তারা সম্ভবত আপনার জন্য এটি প্রচুর পরিমাণে পরিচালনা করে তবে আমার মতো আপনি যদি কোনও উত্তরাধিকার ব্যবস্থা নিয়ে কাজ করছেন তবে এই স্তরগুলি অ্যাক্সেস করার জন্য আপনার কাছে প্রচুর কাস্টম ফ্রেমওয়ার্ক থাকতে পারে।
এই কাঠামোর উপাদানগুলিতে প্রযোজ্য সিস্টেম কনফিগারেশন যদি ইউনিট পরীক্ষার মধ্যে পরিবর্তন হয় এবং ইউনিট পরীক্ষার কাঠামোটি ছিন্ন করে উপাদানগুলি পুনর্নির্মাণ না করে তবে এই পরিবর্তনগুলি কার্যকর হতে পারে না এবং যখন কোনও পরীক্ষা এই পরিবর্তনগুলির উপর নির্ভর করে, তারা ব্যর্থ হবে ।
এমনকি কাঠামোবিহীন উপাদানগুলিও এই সমস্যার সাপেক্ষে। ওপেনর্ডার্স নামে একটি অচল মানচিত্রের কল্পনা করুন। আপনি একটি পরীক্ষা লিখেছেন যা কয়েকটি খোলা অর্ডার তৈরি করে এবং সেগুলি সঠিক অবস্থায় রয়েছে তা নিশ্চিত করার জন্য চেক করে, তারপরে পরীক্ষাটি শেষ হয়। অন্য বিকাশকারী একটি দ্বিতীয় পরীক্ষা লেখেন যা ওপেনর্ডার্স মানচিত্রে প্রয়োজনীয় অর্ডারগুলি রাখে, তারপরে আদেশের সংখ্যাটি নির্ভুল বলে দাবি করে। স্বতন্ত্রভাবে চালান, এই পরীক্ষাগুলি উভয়ই পাস করবে, তবে যখন স্যুইটে একসাথে চালানো হবে তখন তারা ব্যর্থ হবে।
সবচেয়ে খারাপ, ব্যর্থতা পরীক্ষা করা হয়েছিল সেই আদেশের ভিত্তিতে হতে পারে।
এই ক্ষেত্রে, স্ট্যাটিকগুলি এড়িয়ে আপনি আরও ভাল পরীক্ষার নির্ভরযোগ্যতা নিশ্চিত করে পরীক্ষার উদাহরণগুলিতে ডেটা বজায় রাখার ঝুঁকি এড়াতে পারেন।
সূক্ষ্ম বাগ
আপনি যদি উচ্চ প্রাপ্যতা পরিবেশে, বা যে কোনও জায়গায় থ্রেড শুরু এবং বন্ধ হতে পারে এমন জায়গায় কাজ করেন তবে ইউনিট টেস্ট স্যুটগুলির সাথে উপরে উল্লিখিত একই উদ্বেগটি যখন আপনার কোডটিও উত্পাদন চলমান থাকে তখন প্রয়োগ করতে পারে।
থ্রেডের সাথে ডিল করার সময় ডেটা সঞ্চয় করার জন্য কোনও স্থির অবজেক্ট ব্যবহার না করে থ্রেডের সূচনাকালীন পর্যায়ে প্রাথমিকভাবে কোনও অবজেক্টটি ব্যবহার করা ভাল। এইভাবে, প্রতিবার থ্রেড শুরু হওয়ার সাথে সাথে অবজেক্টের একটি নতুন উদাহরণ (সম্ভাব্য নতুন কনফিগারেশন সহ) তৈরি করা হবে এবং আপনি থ্রেডের রক্তপাতের এক উদাহরণ থেকে পরবর্তী উদাহরণ পর্যন্ত ডেটা এড়ান avoid
যখন কোনও থ্রেড মারা যায়, কোনও স্থির বস্তু পুনরায় সেট বা আবর্জনা সংগ্রহ করে না। কল্পনা করুন যে আপনার কাছে "ইমেলকাস্টোমারস" নামে একটি থ্রেড রয়েছে এবং এটি শুরু হয়ে গেলে এটি ইমেল ঠিকানার তালিকা সহ একটি স্ট্যাটিক স্ট্রিং সংগ্রহকে জনপ্রিয় করে তোলে, তারপরে প্রতিটি ঠিকানা ইমেল করা শুরু করে। বলুন থ্রেডটি কোনওভাবে বাধাগ্রস্ত হয়েছে বা বাতিল হয়েছে, সুতরাং আপনার উচ্চ প্রাপ্যতা ফ্রেমওয়ার্কটি থ্রেডটি পুনরায় চালু করে। তারপরে থ্রেডটি শুরু হয়ে গেলে এটি গ্রাহকদের তালিকা পুনরায় লোড করে। তবে সংগ্রহটি স্থির হওয়ার কারণে এটি পূর্ববর্তী সংগ্রহের ইমেল ঠিকানাগুলির তালিকা বজায় রাখতে পারে। এখন কিছু গ্রাহক নকল ইমেল পেতে পারে।
আনসাইড: স্ট্যাটিক ফাইনাল
প্রযুক্তিগত প্রয়োগের পার্থক্য থাকলেও "স্থিতিশীল চূড়ান্ত" ব্যবহার কার্যকরভাবে সি # ডিফাইন এর জাভা সমতুল্য। সংকলনের আগে, প্রি-প্রসেসর দ্বারা এসি / সি ++ # ডিফাইন কোড থেকে সরিয়ে নেওয়া হয়। একটি জাভা "স্ট্যাটিক ফাইনাল" স্ট্যাকের মেমরির বাসিন্দাকে শেষ করবে। এইভাবে, এটি একটি সিডি ++ এর চেয়ে একটি "স্ট্যাটিক কনস্ট" ভেরিয়েবলের সাথে সাদৃশ্যপূর্ণ, এটি একটি # নির্দিষ্ট সংখ্যার চেয়ে বেশি।
সারসংক্ষেপ
আমি আশা করি যে এটি স্ট্যাটিকস সমস্যাযুক্ত কেন কয়েকটি প্রাথমিক কারণ ব্যাখ্যা করতে সহায়তা করে। আপনি যদি জাভা ইই বা স্প্রিং ইত্যাদির মতো কোনও আধুনিক জাভা কাঠামো ব্যবহার করছেন, তবে আপনি এর মধ্যে অনেকের মুখোমুখি নাও হতে পারেন, তবে যদি আপনি লিগ্যাসি কোডের একটি বৃহত সংস্থার সাথে কাজ করছেন তবে সেগুলি আরও ঘন ঘন হয়ে উঠতে পারে।