মকিতো স্থির পদ্ধতিগুলিকে মকিত করে না কেন?


267

স্থিতিশীল পদ্ধতিগুলি সম্পর্কে আমি এখানে কয়েকটি থ্রেড পড়েছি এবং আমি মনে করি স্থিতিশীল পদ্ধতির অপব্যবহার / অতিরিক্ত ব্যবহারের কারণ হতে পারে এমন সমস্যাগুলি আমি বুঝতে পারি। তবে স্থির পদ্ধতিগুলিকে কেন উপহাস করা কেন শক্ত তা আমি সত্যিই তলতে উঠতে পারি নি।

আমি জানি অন্যান্য মশকরা ফ্রেমওয়ার্কগুলি যেমন পাওয়ারমক, এটি করতে পারে তবে মকিতো কেন পারবে না?

আমি এই নিবন্ধটি পড়েছি , তবে লেখক মনে করছেন ধর্মীয়ভাবে এই শব্দটির বিরুদ্ধে static, সম্ভবত এটি আমার খারাপ ধারণা poor

একটি সহজ ব্যাখ্যা / লিঙ্ক দুর্দান্ত হবে।


12
কেবলমাত্র একটি পার্শ্ব-নোট: পাওয়ারমক হ'ল মেক অবজেক্ট লাইব্রেরি প্রতি সেয়ে নয়, এটি অন্যান্য লাইব্রেরির উপরে এই বৈশিষ্ট্যগুলি (উপহাসের স্ট্যাটিক্স এবং সিটার) যুক্ত করেছে। আমরা পাওয়ারমক + মকিতো কাজের সময়ে ব্যবহার করি তারা একে অপরের সাথে ভালভাবে ভাসে।
ম্যাথিয়াস

উত্তর:


238

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

স্ট্যাটিকসকে উপহাস করার একমাত্র উপায় হ'ল রানটাইমের সময় কোনও শ্রেণি 'বাইট কোডটি সংশোধন করা , যা আমি মনে করি উত্তরাধিকারের চেয়ে কিছুটা বেশি জড়িত।

এটি আমার অনুমান, এটির মূল্য কী ...


7
উপায় দ্বারা নির্মাতাদের উপহাসের ক্ষেত্রেও এটি একই। এগুলিও উত্তরাধিকারের মাধ্যমে পরিবর্তন করা যায় না।
ম্যাথিয়াস

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

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

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

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

28

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


3
হ্যাঁ, আমি স্থিতিশীল পদ্ধতিগুলি উচ্চ স্তরের বিমূর্ততা প্রদানের জন্য ব্যবহার করি, যেমন "স্ট্যাটিক দৃ pers়প্রতিবন্ধের মুখোমুখি"। এই ধরণের মুখোমুখি ক্লায়েন্ট কোডগুলি একটি ORM এপিআইয়ের জটিলতা এবং নিম্ন-স্তরের বিশদ থেকে দূরে রাখে, প্রচুর নমনীয়তার অনুমতি দেওয়ার সময় আরও বেশি ধারাবাহিক এবং সহজেই ব্যবহারযোগ্য API সরবরাহ করে।
রোগিরিও

এবং কেন আপনাকে এটি উপহাস করতে হবে? আপনি যদি স্ট্যাটিক পদ্ধতির উপর নির্ভর করেন তবে আপনি "ইউনিট" বা "মডিউল" একা ক্লাস নন তবে এতে "স্ট্যাটিক অধ্যবসায়ী মুখোমুখি" অন্তর্ভুক্ত রয়েছে।
জানুয়ারী

88
সত্য, তবে কখনও কখনও আপনার কোনও বিকল্প নাও থাকতে পারে যদি উদাহরণস্বরূপ আপনার যদি কোনও তৃতীয় পক্ষের শ্রেণিতে থাকে এমন একটি স্ট্যাটিক পদ্ধতি উপহাস করা প্রয়োজন।
স্টিজন জিউকেন্স

6
সত্য, তবে কখনও কখনও আমরা সিলেটলেটগুলির সাথে ডিল করতে পারি।
মনু মঞ্জুনাথ

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

5

আমি গুরুত্ব সহকারে মনে করি যে এটি যদি আপনার স্থির পদ্ধতিগুলিও উপহাস করার দরকার হয় তবে এটি কোড গন্ধ।

  • সাধারণ কার্যকারিতা অ্যাক্সেস স্ট্যাটিক পদ্ধতি? -> একটি সিঙ্গলটন উদাহরণ ব্যবহার করুন এবং এটি ইনজেকশন করুন
  • তৃতীয় পক্ষের কোড? -> এটিকে আপনার নিজের ইন্টারফেস / প্রতিনিধিতে মোড়ানো (এবং যদি প্রয়োজন হয় তবে এটি একটি সিঙ্গলটনও তৈরি করুন)

এটি কেবলমাত্র আমার কাছে অতিমাত্রার চেয়ে বেশি মনে হয়, এটি পেয়ারা জাতীয় লিবার মতো, তবে আপনার এই ধরণের বিদ্রূপ করার দরকার নেই কারণ এটি যুক্তির অংশ ... (Iterables.transform (..) এর মতো স্টাফ)
আপনার নিজের কোড পরিষ্কার থাকে, আপনি আপনার সমস্ত নির্ভরতাগুলি পরিষ্কার উপায়ে উপহাস করতে পারেন এবং আপনার বাহ্যিক নির্ভরতার বিরুদ্ধে একটি বিরোধী দুর্নীতির স্তর রয়েছে। আমি পাওয়ারমককে অনুশীলন করে দেখেছি এবং আমাদের যে ক্লাসগুলির জন্য এটি প্রয়োজন ছিল তা খারাপভাবে ডিজাইন করা হয়েছিল। এছাড়াও সময়ে সময়ে পাওয়ারমকের সংহতকরণ গুরুতর সমস্যা সৃষ্টি করে
(উদাঃ https://code.google.com/p/powermock/issues/detail?id=355 )

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


2
সিঙ্গেলটন আপনাকে সকল প্রকার সমস্যার মধ্যে ফেলে দেবে, বিশেষত যখন আপনি বুঝতে পারেন যে আপনার আসলে একাধিক উদাহরণ প্রয়োজন এবং এটি ঘটতে আপনার এখন আপনার সম্পূর্ণ সিস্টেমের রিফ্যাক্টর প্রয়োজন।
রিকার্ডো ফ্রেইটাস

আমি বলিনি, আমি সবার কাছে সিঙ্গলটন প্যাটার্নটি সুপারিশ করি। আমার অভিপ্রায়টি হ'ল, যদি আমি স্থির ইউটিলিটি ক্লাস এবং একই কার্যকারিতা সরবরাহকারী সিঙ্গলটনের মধ্যে সিদ্ধান্ত নিতে পারি তবে আমি সিঙ্গেলটন বেছে নেব। এবং যদি কোনও শ্রেণি সিঙ্গলটন হয় বা যাইহোক, ডিআই ফ্রেমওয়ার্ক দ্বারা নিয়ন্ত্রিত হওয়া উচিত, আমার ক্লাস I @Inject SomeDependencyএবং আমার কনফিগারেশনে আমি সংজ্ঞায়িত করি bind(SomeDependency.class).in(Singleton.class)। সুতরাং যদি আগামীকাল এটি আর কোনও সিঙ্গলটন না হয় তবে আমি একটি কনফিগারেশন পরিবর্তন করি এবং এটিই।
পিট 83

@ পেট83 আমি শুনছি ভাই। তবে টেস্ট ফ্রেমবুকের ফ্রেমওয়ার্কের নকশা / সীমা পূরণের জন্য ডিভগুলি তাদের নকশা পরিবর্তন করার জন্য টেস্ট লিবস বা ফ্রেমওয়ার্কগুলির সাথে আমার একটি সমস্যা রয়েছে। এটি হ'ল আইএমও হ'ল গাড়িটি ঘোড়ার আগে রাখল, বা লেজ কুকুরটিকে দুলিয়ে দেবে।
ম্যাট ক্যাম্পবেল

1
এই তর্কটি আমার কাছে কিছুটা বোঝায় না। সিঙ্গলটন নিদর্শনগুলি বেশিরভাগ বছর ধরে এখানে তালিকাভুক্ত করার জন্য খুব বেশি পছন্দের বাইরে চলে গেছে। "পরিষ্কার" কোডটি কী গঠন করে? যদি আমার কাছে একটি ক্লাস উদাহরণ পদ্ধতি থাকে যা স্ট্যাটিক সহায়ক পদ্ধতিকে কল করে যা কিছু I / O ক্রিয়াকলাপ ফিরিয়ে দেয়, তবে কেন আমি পরীক্ষায় এমন উপহাস করতে চাইব না? এবং কিভাবে যে খারাপ নকশা? এই সমস্ত হাত ঘেউ ঘেউ ঘেউ ঘেউ ঘেউ করা স্থির পদ্ধতিগুলি জুড়ে না। কোনও পদ্ধতির উপহাস করা এটির পরীক্ষার বিপরীত। যদি এটি বাস্তবায়ন করা খুব কঠিন হয় তবে কেবল এটি বলুন এবং এটি দিয়ে শেষ করুন
বেগুনি

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

4

মকিতো বস্তুগুলি ফেরত দেয় তবে স্থির অর্থ "শ্রেণীর স্তর, বস্তুর স্তর নয়" সুতরাং মকিতো স্থির ক্ষেত্রে নਾਲ পয়েন্টার ব্যতিক্রম দেয়।


0

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


1
স্থির পদ্ধতিগুলির উপহাস উপস্থাপনের পদ্ধতিগুলির উপহাস করার চেয়েও সহজ (যেহেতু কোনও উদাহরণ নেই), যখন উপযুক্ত উপদ্রবকারী API ব্যবহার করা হয়।
রোগারিও

এটি নিজেই প্রশ্নের উত্তর দিয়ে উত্তর দেওয়ার মতো, কেন এটি করা কেন কঠিন , যার কাছে এটি কোনও উত্তর নয়।
ম্যাথিয়াস

40
আমি এটিকে অগ্রাহ্য করেছি কারণ ব্লগ পোস্টটি ব্যবহারের ক্ষেত্রে স্থিতিশীল পদ্ধতিগুলি থেকে কোনও শ্রেণি বিচ্ছিন্ন করার সমস্যাটিকে সমাধান করার পরিবর্তে ব্যয়বহুল ওয়ার্কআউন্ড (প্রোডাকশন কোডটিকে পুনরায় ব্যবহার করার) প্রস্তাব দেয় recommend আইএমও, একটি উপহাসের সরঞ্জাম যা সত্যই কাজটি করে তা কোনও ধরণের পদ্ধতির সাথে বৈষম্য করবে না; কোনও বিকাশকারীকে কোনও এক পথকে বাধ্য করার পরিবর্তে স্থিত পদ্ধতির ব্যবহার কোনও প্রদত্ত পরিস্থিতিতে ভাল বা খারাপ কিনা তা নির্ধারণে স্বাধীন হতে হবে।
রোজিরিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.