স্ট্যাটিক উদাহরণস্বরূপ ক্ষেত্রের উপর নির্ভর করে না এমন পদ্ধতিগুলি তৈরি করুন?


19

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

যে সমস্ত পদ্ধতি কোনও উদাহরণ ক্ষেত্রের উপর নির্ভর করে না সেগুলি কি স্থির ক্রিয়ায় রূপান্তরিত হওয়া উচিত? যদি সত্য হয় তবে এটি গ্রোভির সাথে নির্দিষ্ট বা এটি সাধারণভাবে ওওপি-র জন্য উপলব্ধ? এবং কেন?


এই পদ্ধতিগুলি কি অন্য উদাহরণ পদ্ধতিগুলি কল করে? বা তাদের শ্রেণীর কোনও বস্তুর সাথে আক্ষরিক কিছুই করার নেই? আপনি কি একটি উদাহরণ দিতে পারেন?
রায় তোয়াল

উত্তর:


26

নোট করুন যে আইডিইএর জাভাতেও এই পরিদর্শন রয়েছে , একে বলা হয় মেথডটি 'স্ট্যাটিক' হতে পারে ,

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

বিষয়টি যদিও জাভা কোডের জন্য, এই পরিদর্শনটি ডিফল্ট হিসাবে বন্ধ করা হয় (প্রোগ্রামার তাদের বিবেচনার ভিত্তিতে এটি চালু করতে পারে)। এর কারণ সম্ভবত বেশ কয়েকটি অনুমোদনের উত্সের ভিত্তিতে এই ধরনের পরিদর্শনটির বৈধতা / উপযোগিতা চ্যালেঞ্জ করা যেতে পারে।

শুরু করার জন্য, অফিশিয়াল জাভা টিউটোরিয়ালটি বরং পদ্ধতিগুলি স্থিতিশীল হওয়া উচিত তার উপর সীমাবদ্ধ:

স্থির পদ্ধতিগুলির জন্য একটি সাধারণ ব্যবহার হ'ল স্থির ক্ষেত্রগুলি অ্যাক্সেস করা।

উপরে প্রদত্ত, যে কেউ তর্ক করতে পারে যে পূর্বনির্ধারিত উল্লিখিত পরিদর্শন দ্বারা চালু করা জাভায় স্থির পরিবর্তনকারী ব্যবহারের প্রস্তাবিত ব্যবহারের সাথে সম্মতি দেয় না।

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

উদাহরণস্বরূপ জাভা ওয়ার্ল্ড নিবন্ধটি দেখুন - মিঃ হ্যাপি অবজেক্ট স্থির পদ্ধতি শেখায় :

উদাহরণস্বরূপ রাষ্ট্রের স্বাধীন যে কোনও পদ্ধতি স্থিতিশীল হিসাবে ঘোষণার জন্য প্রার্থী।

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

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

গুগল টেস্টিং ব্লগের একটি নিবন্ধ এমনকি স্ট্যাটিক পদ্ধতিগুলি টেস্টেবলির মৃত্যুর দাবি হিসাবেও গেছে :

একটি মানসিক অনুশীলন করতে দিন। ধরুন আপনার অ্যাপ্লিকেশনটিতে স্থির পদ্ধতি ছাড়া আর কিছু নেই। (হ্যাঁ, এর মতো কোডটি লেখা সম্ভব, একে প্রসেসরিয়াল প্রোগ্রামিং বলে)) এখন সেই অ্যাপ্লিকেশনটির কল গ্রাফটি কল্পনা করুন। আপনি যদি কোনও পাত পদ্ধতি কার্যকর করার চেষ্টা করেন তবে আপনার রাজ্যটি সেট আপ করতে এবং কোণার সমস্ত ক্ষেত্রে জোর দেওয়ার কোনও সমস্যা থাকবে না। কারণটি হ'ল একটি পাতার পদ্ধতিটি আর কল করে না। আপনি পাতা থেকে আরও দূরে সরে যাওয়ার সাথে সাথে রুট main()পদ্ধতির কাছাকাছি যাওয়ার সাথে সাথে আপনার পরীক্ষায় রাষ্ট্র নির্ধারণ করা আরও কঠিন এবং জিনিসকে দৃ to় করা শক্ত। অনেক কিছুই দৃ impossible় করা অসম্ভব হয়ে উঠবে। আপনার পরীক্ষাগুলি ক্রমান্বয়ে আরও বড় হবে get একবার আপনি পৌঁছেছেনmain()পদ্ধতিতে আপনার আর ইউনিট-পরীক্ষা নেই (আপনার ইউনিট পুরো প্রয়োগ হিসাবে) আপনার এখন একটি দৃশ্যের পরীক্ষা আছে। আপনি যে অ্যাপ্লিকেশনটি পরীক্ষার চেষ্টা করছেন এটি একটি ওয়ার্ড প্রসেসর Ima মূল পদ্ধতি থেকে আপনি এতটা দৃsert়তার সাথে বলতে পারবেন না ...

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


আপনি দেখুন, উপরে দেওয়া এটি কেবল প্রাকৃতিক দেখায় যে জাভাটির জন্য উল্লিখিত পরিদর্শনটি ডিফল্ট দ্বারা বন্ধ করা আছে।

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

গ্রোভির পক্ষে বিষয়গুলি একেবারেই আলাদা। উপরে তালিকাভুক্ত যুক্তিগুলির কোনওটি প্রয়োগ হয় না, বিশেষত টেস্টাবিলিটি সম্পর্কিত একটি, যেমন জাভালবির গ্রোভির নিবন্ধে স্ট্যাটিক পদ্ধতিগুলি উপহাস করার ক্ষেত্রে ব্যাখ্যা করা হয়েছে :

আপনি যে গ্রুভি ক্লাসটি পরীক্ষা করছেন তা যদি অন্য গ্রোভী ক্লাসে স্থিতিশীল পদ্ধতি কল করে, তবে আপনি ExpandoMetaClass ব্যবহার করতে পারেন যা আপনাকে ক্রমবর্ধমান পদ্ধতি, নির্মাণকারী, বৈশিষ্ট্য এবং স্থিতিশীল পদ্ধতি যুক্ত করতে দেয় ...

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

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


যাইহোক, রিশার্পার (সি # / ভিজ্যুয়াল স্টুডিওর জন্য জেটব্রেইনস দ্বারা তৈরি) একই জিনিসটির পরামর্শ দেয়
কনরাড মোরাওস্কি

6
পার্শ্ব প্রতিক্রিয়া ছাড়াই এবং ছাড়াই স্থির পদ্ধতিগুলির মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে। গুগল এক্সট্রাক্ট সত্যিই সাবেক ঠিকানা।
assylias

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

5

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

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


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

2
@ ইউজার 40980 এটি বিবেচনা করার মতো, সত্য, তবে এটিও বিবেচনা করা উচিত যে উত্তরাধিকারটি একটি আনাড়ি হাতিয়ার হতে পারে যা প্রায়শই অপব্যবহার করা হয় এবং বেশ কয়েকটি বিশিষ্ট ব্যক্তিত্ব যুক্তি দেয় যে সমস্ত শ্রেণি হওয়া উচিত finalবা বিশেষভাবে মর্যাদায় উত্তরাধিকার নিয়ে ডিজাইন করা উচিত।
সারা

3

আমার মনে হয় এটা করা সম্ভব refactoring সক্ষম করা বিক্ষোভ

একবার পদ্ধতিটি স্থিতিশীল হয়ে উঠলে এটি পরিষ্কার হয় যে এটি শ্রেণীর বাইরে চলে যেতে পারে, একটি unityক্য শ্রেণিকে বলুন।

এটির কোনও একটি পরামিতিগুলির উদাহরণ পদ্ধতিতে এটি রূপান্তর করাও সহজ, প্রায়শই এখানে কোড থাকা উচিত।


-1

নোট করুন যে আপনার স্টেটলেস ক্লাস থাকতে পারে যা কিছু ইন্টারফেস প্রয়োগ করে (যেমন java.lang.Runnable- আপনি তাদের পদ্ধতিগুলি স্থির করতে পারবেন না Some

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


এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

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