গ্লোবাল স্টেট এত খারাপ কেন?


328

আমরা এটি শুরু করার আগে, আমি বলতে পারি যে আমি বিমূর্ততা এবং নির্ভরতা ইনজেকশন এর ধারণাগুলি সম্পর্কে ভালভাবে অবগত। এখানে আমার চোখ খোলার দরকার নেই।

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

ধরা যাক আমার অ্যাপ্লিকেশনটির জন্য আমার একটি বিশ্বব্যাপী কনফিগারেশন প্রয়োজন, উদাহরণস্বরূপ সিস্টেম ফোল্ডার পাথ বা অ্যাপ্লিকেশন-ব্যাপী ডাটাবেস শংসাপত্রগুলির জন্য।

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

আমি জানি এটি খারাপ অপব্যবহার এটা কিন্তু বিশ্বব্যাপী স্থান সত্যিই যে মন্দ? এবং যদি এটি হয়, ভাল বিকল্প আছে কি?


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

25
গ্লোবাল ব্যবহারের সাথে পার্থক্য কোথায়? আপনার "এক এবং একমাত্র জায়গা" খুব সন্দেহজনকভাবে মনে হচ্ছে একা সিঙ্গলনের মতো।
মাদারা উচিহ

130
একমাত্র আসল মন্দটি হ'ল ডগমাস।
পিটার বি

34
আপনার সহকর্মী প্রোগ্রামারদের সাথে বিশ্বব্যাপী রাষ্ট্র ব্যবহার করা আপনার বন্ধুদের সাথে একই টুথব্রাশ ব্যবহার করার মতো - আপনি এটি করতে পারবেন তবে কখনই বুঝতে পারবেন না যে কেউ কখন তার বামটি সরিয়ে দেওয়ার সিদ্ধান্ত নেবে।
ziGi

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

উত্তর:


282

খুব সংক্ষেপে, এটি প্রোগ্রামের রাষ্ট্রটিকে অবিশ্বাস্য করে তোলে।

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

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

একাডেমিক স্তরে এটি এত গুরুতর শোনায় না তবে পরীক্ষার কোডকে একক করতে সক্ষম হওয়া তার যথার্থতা প্রমাণ করার প্রক্রিয়ার একটি বড় পদক্ষেপ (বা উদ্দেশ্য জন্য কমপক্ষে ফিটনেস)।

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

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

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

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

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


61
মূলত, যেহেতু যে কেউ রাষ্ট্র পরিবর্তন করতে পারে, আপনি এটির উপর নির্ভর করতে পারবেন না।
ওদেড

21
@ ট্রুথ বিকল্প? নির্ভরতা ইনজেকশন
rdlowrey

12
আপনার মূল যুক্তিটি এমন কোনও কিছুর সাথে সত্যিকার অর্থে প্রযোজ্য না যা কার্যকরভাবে পঠনযোগ্য যেমন কোনও কনফিগারেশনের প্রতিনিধিত্বকারী কোনও বস্তু।
খোলাখুলি

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

20
being able to unit test code is a major step in the process of proving its correctness (or at least fitness for purpose)। না এটা না। "এখন দুই দশক হয়ে গেছে যেহেতু এটি চিহ্নিত করা হয়েছিল যে প্রোগ্রাম টেস্টিংগুলি দৃinc়তার সাথে বাগগুলির উপস্থিতি প্রদর্শন করতে পারে, তবে তাদের অনুপস্থিতিটি কখনই প্রদর্শন করতে পারে না well এই ভক্তভাবে প্রকাশিত মন্তব্যটির পরে, সফ্টওয়্যার ইঞ্জিনিয়ার দিনের ক্রমটিতে ফিরে এসে অবিরত অবিরত রয়েছে তাঁর পরীক্ষার কৌশলগুলিও পরিমার্জন করতে ঠিক যেমন ইওর এর cheামকিবিদ যিনি তাঁর ক্রিসোকোজমিক পরিশোধনকে আরও পরিমার্জন করে চলেছেন "" - জিক্সট্রা, 1988. (এটি এখন 4.5 দশক ধরে ...)
ম্যাসন হুইলার

135

পরিবর্তনীয় বৈশ্বিক রাষ্ট্র অনেক কারণেই খারাপ:

  • পরিবর্তনীয় গ্লোবাল রাষ্ট্র থেকে বাগগুলি - প্রচুর পরিমাণে ত্রুটিপূর্ণ বাগ বাগানের কারণে ঘটে। প্রোগ্রামের যে কোনও জায়গা থেকে মিউটেশনের ফলে যে বাগগুলি হতে পারে তা এমনকি আরও জটিল, কারণ সঠিক কারণটি খুঁজে পাওয়া প্রায়শই শক্ত
  • দরিদ্র টেস্টিবিলিটি - আপনার যদি পরিবর্তনীয় গ্লোবাল অবস্থা থাকে তবে আপনার লেখার যে কোনও পরীক্ষার জন্য আপনাকে এটি কনফিগার করতে হবে। এটি টেস্টিংকে আরও শক্ত করে তোলে (এবং মানুষ হওয়ার কারণে এটি করার সম্ভাবনা কম থাকে!)। উদাহরণস্বরূপ অ্যাপ্লিকেশন-ব্যাপী ডাটাবেস শংসাপত্রগুলির ক্ষেত্রে, যদি কোনও পরীক্ষার জন্য অন্য সমস্ত কিছুর থেকে আলাদা একটি নির্দিষ্ট টেস্ট ডাটাবেস অ্যাক্সেস করার প্রয়োজন হয়?
  • নমনীয়তা - কোডের একটি অংশের যদি বৈশ্বিক অবস্থায় একটি মান প্রয়োজন, তবে অন্য অংশের জন্য অন্য মান প্রয়োজন (উদাহরণস্বরূপ কোনও লেনদেনের সময় একটি অস্থায়ী মান)? আপনার হঠাৎ আপনার হাতে একটি বাজে রিফ্যাক্টরিং আছে
  • ফাংশন অপরিষ্কার - "বিশুদ্ধ" ফাংশন (অর্থাত্ ফলাফল যেখানে কেবলমাত্র ইনপুট পরামিতিগুলির উপর নির্ভর করে এবং এর কোনও পার্শ্ব প্রতিক্রিয়া নেই) বৃহত্তর প্রোগ্রামগুলি তৈরি করার বিষয়ে যুক্তি তৈরি এবং রচনা করা আরও সহজ। পরিবর্তনযোগ্য বৈশ্বিক রাষ্ট্রের পড়া বা হেরফের করা কার্যগুলি সহজাতভাবে অপরিষ্কার।
  • কোড অনুধাবন - কোড পরিবর্তন যা প্রচুর পরিবর্তনীয় গ্লোবাল ভেরিয়েবলের উপর নির্ভরশীল তা বোঝার জন্য অনেক বেশি কৌশলযুক্ত - কোডটির আচরণের বিষয়ে যুক্তি জানার আগে আপনাকে বৈশ্বিক ভেরিয়েবলের সাথে সম্ভাব্য মিথস্ক্রিয়াটির পরিধি বুঝতে হবে। কিছু পরিস্থিতিতে, এই সমস্যাটি অক্ষম হয়ে উঠতে পারে।
  • সংমেয় সংক্রান্ত সমস্যা - একযোগে অবস্থিত পরিস্থিতিতে যখন পরিবর্তনীয় গ্লোবাল স্টেটের সাধারণত কিছু প্রকারের লক প্রয়োজন হয়। এটি সঠিকভাবে পাওয়া খুব কঠিন (বাগের কারণ) এবং আপনার কোডে আরও জটিলতা যুক্ত করে (কঠোর / বজায় রাখা))
  • পারফরম্যান্স - একাধিক থ্রেড ক্রমাগত একই বিশ্বব্যাপী রাষ্ট্রের উপর চাপ দেওয়া ক্যাশের বিতর্ক সৃষ্টি করে এবং সামগ্রিকভাবে আপনার সিস্টেমকে ধীর করে দেবে।

পরিবর্তনীয় বৈশ্বিক রাষ্ট্রের বিকল্প:

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

11
আমি মনে করি যে ফাংশন প্যারামিটার বা নির্ভরতা ইনজেকশন দ্বারা কোনও প্রসঙ্গ বস্তুটি পাস করার ফলে যদি প্রসঙ্গটি পরিবর্তনীয় হয় তবে একই সমস্যাটি পরিবর্তনীয় গ্লোবাল স্টেট ব্যবহার করার কারণে সমস্যার কারণ হতে পারে।
আলফ্রেডো ওসারিও

1
সমস্ত ভাল জিনিস, এবং আমেন! তবে প্রশ্নটি অপরিবর্তনীয় বৈশ্বিক রাষ্ট্র সম্পর্কে
মার্কজে

@ অ্যালফ্রেডো - খুব সত্য। যদিও এটি ততটা খারাপ না কারণ কমপক্ষে সুযোগটি কিছুটা নিয়ন্ত্রণ করা যায়। তবে সাধারণভাবে, কেবল প্রসঙ্গ এবং নির্ভরতা অপরিবর্তনীয় করে সমস্যার সমাধান করা সহজ।
মাইক্রা

2
পরিবর্তনীয় / অপরিবর্তনীয় জন্য +1। অপরিবর্তনীয় গ্লোবালগুলি ঠিক আছে। এমনকি যেগুলি অলস বোঝাই হলেও কখনও পরিবর্তন হয় না। অবশ্যই, গ্লোবাল ভেরিয়েবলগুলি প্রকাশ করবেন না, তবে একটি গ্লোবাল ইন্টারফেস বা এপিআই।
জেস

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

62
  1. যেহেতু আপনার সম্পূর্ণ জঘন্য অ্যাপ্লিকেশনটি এটি ব্যবহার করা যেতে পারে তাই এগুলি আবার ফিরিয়ে আনা অবিশ্বাস্যরকম শক্ত। আপনি যদি কখনও বিশ্বব্যাপী কিছু করতে চান তবে আপনার সমস্ত কোডের পরিবর্তন হওয়া দরকার। এটি একটি রক্ষণাবেক্ষণের মাথা ব্যথা grepwhich টাইপ নামের পক্ষে কোন কার্যকারিতা এটি ব্যবহার করে তা সন্ধান করার চেয়ে বেশি বেশি ।
  2. তারা খারাপ কারণ তারা লুকানো নির্ভরশীলতাগুলি প্রবর্তন করে, যা বহুবিধ পড়াকে ভেঙে দেয়, যা ক্রমবর্ধমান অনেক অ্যাপ্লিকেশনের পক্ষে ক্রমবর্ধমান গুরুত্বপূর্ণ।
  3. গ্লোবাল ভেরিয়েবলের রাজ্য সর্বদা সম্পূর্ণ অবিশ্বাস্য, কারণ আপনার কোডগুলি সমস্ত এটিকে কিছু করতে পারে।
  4. তারা পরীক্ষা করা সত্যিই কঠিন।
  5. তারা এপিআই কল করা শক্ত করে তোলে। "আপনাকে অবশ্যই এপিআই কল করার আগে SET_MAGIC_VARIABLE () কল করতে হবে" কেউ কল করতে ভুলে যাওয়ার জন্য ভিক্ষা করছেন। এটি এপিআই ত্রুটি-প্রবণটি ব্যবহার করে অনুসন্ধানগুলি খুঁজে বের করতে অসুবিধা সৃষ্টি করে। এটি নিয়মিত প্যারামিটার হিসাবে ব্যবহার করে, আপনি কলারকে সঠিকভাবে একটি মান সরবরাহ করতে বাধ্য করেন।

এটি প্রয়োজন এমন ক্রিয়াকলাপগুলিতে কেবল একটি রেফারেন্স দিন। এটা খুব কঠিন নয়।


3
ঠিক আছে, আপনার কাছে একটি গ্লোবাল কনফিগার ক্লাস থাকতে পারে যা লকিংকে encapsulates, এবং যেকোন সময় সম্ভব রাষ্ট্র পরিবর্তন করার জন্য ডিজাইন করা হয়েছে। আমি কোডের 1000x জায়গা থেকে কনফিগার পাঠকদের ইনস্ট্যান্ট করে তুলতে এই পদ্ধতির পছন্দ করব। তবে হ্যাঁ, অনুমানযোগ্যতা হ'ল তাদের সম্পর্কে একেবারে খারাপ জিনিস।
কোডার

6
@ কোডার: নোট করুন যে গ্লোবালের বুদ্ধিমান বিকল্পটি "কোডের 1000x জায়গা থেকে পাঠকদের কনফিগার করা" নয়, তবে একটি কনফিগার রিডার যা একটি কনফিগার অবজেক্ট তৈরি করে, কোন পদ্ধতিগুলি প্যারামিটার হিসাবে গ্রহণ করতে পারে (-> নির্ভরতা ইনজেকশন)।
sleske

2
নিতপিকিং: গ্লোবালের চেয়ে কোনও প্রকারের জন্য গ্রেপ করা কেন সহজ? এবং প্রশ্নটি কেবল পঠনযোগ্য গ্লোবালগুলি সম্পর্কে, সুতরাং পয়েন্ট 2 এবং 3 প্রাসঙ্গিক নয়
মার্কজে

2
@ মারকজে: আমি আশা করি যে কেউ কখনও নামটি ছায়া করবেন না।
ডেড এমজি

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

34

আপনি যদি "রাষ্ট্র" বলেন তবে এর অর্থ সাধারণত "পরিবর্তনীয় অবস্থা" হিসাবে নেওয়া হয়। এবং বিশ্বব্যাপী পরিবর্তনীয় রাষ্ট্র সম্পূর্ণরূপে দুষ্ট, কারণ এর অর্থ হ'ল প্রোগ্রামের যে কোনও অংশ অন্য কোনও অংশকে (বিশ্ব রাষ্ট্র পরিবর্তন করে) প্রভাবিত করতে পারে

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

আপনি এক্স স্থান পরিবর্তনকারী স্থানগুলি সন্ধান করেন এবং দেখতে পাবেন যে এটি পাঁচটি স্থান পরিবর্তন করে। ভাগ্য A কী কী ক্ষেত্রে কাজ করে তা সন্ধান করে ...


এত অপরিবর্তনীয় বৈশ্বিক রাষ্ট্র কি এত খারাপ নয়?
হতাশ

50
আমি বলব যে অপরিবর্তনীয় বৈশ্বিক রাষ্ট্র হল 'ধ্রুবক' হিসাবে পরিচিত সুপরিচিত ভাল অনুশীলন।
টেলাস্টিন

6
অপরিবর্তনীয় বৈশ্বিক রাষ্ট্রটি খারাপ নয়, এটি কেবল খারাপ :-)। এটি মিলিত হওয়ার কারণে এটি এখনও সমস্যাযুক্ত কারণ এটি পরিবর্তন (পুনরায় ব্যবহার এবং পুনরায় ব্যবহার এবং ইউনিট পরীক্ষা আরও শক্ত করে তোলে) তৈরি করে তবে এটি খুব কম সমস্যা তৈরি করে, তাই সাধারণ ক্ষেত্রে এটি সাধারণত গ্রহণযোগ্য।
sleske

2
আইএফএফের কোনও একটি বৈশ্বিক চলক ব্যবহার করে তবে কেবলমাত্র এক টুকরো কোডটিতে এটি পরিবর্তন করা উচিত। বাকিরা এটি পড়তে নিখরচায়। এটির পরিবর্তিত অন্যদের সমস্যাগুলি এনক্যাপসুলেশন এবং অ্যাক্সেস ফাংশনগুলি দিয়ে যায় না। এই কনস্ট্রাক্টসগুলির জন্য যা তা নয়।
phkahler

1
@ পেসারিয়র: হ্যাঁ, বহুল ব্যবহৃত-ব্যবহৃত ইন্টারফেস পরিবর্তন করা কঠিন, এটি বৈশ্বিক বা স্থানীয় পরিবর্তনশীল হিসাবে ব্যবহার করা হোক না কেন। যাইহোক, এটি আমার বক্তব্য থেকে স্বতন্ত্র, যা হ'ল বৈশ্বিক ভারগুলির সাথে কোডের বিভিন্ন অংশের মিথস্ক্রিয়া বোঝা মুশকিল।
sleske

9

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

অভিজ্ঞ প্রোগ্রামাররা যারা গ্লোবালগুলির মধ্যে একমাত্র বিকল্প হ'ল এবং তাদের সহজ সমাধান হ'ল তার মধ্যে পার্থক্যটি বলতে পারেন, তাদের ব্যবহারে ন্যূনতম সমস্যা হতে পারে। তবে অবিরাম সম্ভাব্য সমস্যাগুলি যা তাদের ব্যবহারের সাথে উত্থাপিত হতে পারে সেগুলি ব্যবহারের বিরুদ্ধে পরামর্শের প্রয়োজন।

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


9

সিঙ্গলটনে অনেক সমস্যা রয়েছে - আমার মনের মধ্যে দুটি বৃহত্তম সমস্যা এখানে।

  • এটি ইউনিট পরীক্ষাকে সমস্যাযুক্ত করে তোলে। একটি রাষ্ট্র থেকে পরের পরীক্ষা পর্যন্ত বৈশ্বিক রাষ্ট্র দূষিত হতে পারে

  • এটি "একমাত্র এবং একমাত্র" কঠোর নিয়ম প্রয়োগ করে, এটি সম্ভবত পরিবর্তন করতে না পারলেও হঠাৎ করে তোলে। ইউটিলিটি কোডের পুরো গোছা যা বিশ্বব্যাপী অ্যাক্সেসযোগ্য অবজেক্ট ব্যবহার করেছিল তারপরে পরিবর্তন করা দরকার।

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

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

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

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

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

সুতরাং, সংক্ষেপে, সিঙ্গলেটনগুলি খারাপ, এবং বিকল্প হ'ল নির্ভরতা ইঞ্জেকশন ফ্রেমওয়ার্ক ব্যবহার করা।

আমি ক্যাসল উইন্ডসরটি ব্যবহার করতে চাই তবে আপনি পছন্দের জন্য ক্ষতিগ্রস্থ হয়েছেন। উপলভ্য ফ্রেমওয়ার্কগুলির তালিকার জন্য ২০০৮ সালে এই পৃষ্ঠাটি ফিরে দেখুন ।


8

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

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

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

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


4

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

প্রশ্নটি বিবেচনা করুন:

... ধরা যাক আমার অ্যাপ্লিকেশনটির জন্য আমার একটি বিশ্বব্যাপী কনফিগারেশন প্রয়োজন, উদাহরণস্বরূপ সিস্টেম ফোল্ডার পাথ বা অ্যাপ্লিকেশন-ব্যাপী ডাটাবেস শংসাপত্রগুলি। ...

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

যদি সমস্ত কনফিগারেশন ডেটা স্পষ্টভাবে পাস করা হয়, উপাদানগুলি পরীক্ষা করা আরও সহজ হয়ে যায় এবং একাধিক পরীক্ষার জন্য কীভাবে বৈশ্বিক কনফিগারেশন মান বুটস্ট্র্যাপ করতে হয় তা আপনাকে কখনও চিন্তা করতে হবে না, এমনকি সমান্তরালেও in


3

ভাল, একটির জন্য, আপনি ঠিক একই সমস্যাটি চালাতে পারেন যা আপনি সিঙ্গেলনের সাথে করতে পারেন। আজকে "গ্লোবাল জিনিস আমার কেবল একটির প্রয়োজন" এর মতো দেখতে হঠাৎ রাস্তায় আপনার আরও কিছু প্রয়োজন এমন কিছুতে হঠাৎ প্রবেশ করবে।

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

(এটি কোনও এলোমেলো উদাহরণ নয় ... আমি যে প্রকল্পে আছি তাতে আমাদের কনফিগারেশন সিস্টেমের সাথে এটি ঘটেছে))

অ-বৈশ্বিক কিছু তৈরির ব্যয়টি সাধারণত নগণ্য বলে বিবেচনা করে এটি করা বোকা। আপনি কেবল ভবিষ্যতের সমস্যা তৈরি করছেন।


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

3

কৌতূহলবশত অন্য সমস্যাটি হ'ল তারা অ্যাপ্লিকেশনটিকে স্কেল করা কঠিন করে দেয় কারণ থায় যথেষ্ট "গ্লোবাল" নয়। গ্লোবাল ভেরিয়েবলের সুযোগ হ'ল প্রক্রিয়া।

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


3

গ্লোবাল স্টেট এত খারাপ কেন?

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

সুতরাং, আমরা কোনও ডিবাগিং বা টেস্ট করতে খুব খারাপ, যার আচরণে প্রোগ্রামের সঞ্চালনের সময় কিছু বাহ্যিক কারণের পরিবর্তন হতে পারে। আমাদের একসাথে নেওয়া এই ডজনগুলি বস্তুর বিষয়ে যখন तर्क করতে হবে তখন একা থাকুন।


3

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

জো-ই একটি উদাহরণ, এবং ডেভিড ওয়াগনার এই সিদ্ধান্তটি এভাবে ব্যাখ্যা করেছেন:

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

সুতরাং এটি সম্পর্কে চিন্তা করার একটি উপায়

  1. প্রোগ্রামিং একটি বিতরণ যুক্তি সমস্যা। বড় প্রকল্পগুলিতে প্রোগ্রামারদের প্রোগ্রামটিকে টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করা প্রয়োজন যা ব্যক্তি দ্বারা যুক্তিযুক্ত হতে পারে।
  2. সুযোগ যত কম হবে তত সহজে আলোচনা করা সহজ। এটি ব্যক্তি এবং স্থিতিশীল বিশ্লেষণ সরঞ্জামগুলির উভয়ই সত্য যা কোনও সিস্টেমের বৈশিষ্ট্য প্রমাণ করার চেষ্টা করে এবং সেই পরীক্ষার জন্য যেগুলি সিস্টেমের বৈশিষ্ট্যগুলি পরীক্ষা করার জন্য প্রয়োজন।
  3. বিশ্বব্যাপী উপলব্ধ কর্তৃপক্ষের উল্লেখযোগ্য উত্সগুলি সিস্টেমটির বৈশিষ্ট্যগুলির পক্ষে যুক্তিযুক্ত হতে পারে।

অতএব, বিশ্বব্যাপী পরিবর্তনযোগ্য রাষ্ট্র এটিকে কঠিন করে তোলে

  1. শক্তিশালী সিস্টেম ডিজাইন,
  2. একটি সিস্টেমের বৈশিষ্ট্য প্রমাণ করা শক্ত এবং এবং
  3. আপনার পরীক্ষাগুলি আপনার উত্পাদন পরিবেশের মতো স্কোপগুলিতে পরীক্ষা করছে তা নিশ্চিত হওয়া শক্ত।

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


2

গ্লোবালগুলি তেমন খারাপ নয়। অন্যান্য বেশ কয়েকটি উত্তরে যেমন বলা হয়েছে, তাদের সাথে আসল সমস্যাটি হ'ল আজ, আপনার বিশ্বব্যাপী ফোল্ডার পথটি আগামীকাল, বেশ কয়েকটি বা এমনকি কয়েকশো হতে পারে। আপনি যদি দ্রুত, এক-অফ প্রোগ্রাম লিখছেন তবে গ্লোবালগুলি আরও সহজ হলে ব্যবহার করুন। সাধারণত, যদিও, আপনি কেবলমাত্র আপনার একটি প্রয়োজন বলে মনে করার পরেও বহুগুণের অনুমতি দেওয়া হ'ল উপায়। একটি বৃহত জটিল প্রোগ্রামটির পুনর্গঠন করা আনন্দদায়ক নয় যা হঠাৎ করে দুটি ডাটাবেসের সাথে কথা বলা দরকার ।

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

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

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

সংযোজন: বহুগঠনের সমস্যা:

(মনে রাখবেন যে ইভেন্টের সারি বা পুনরাবৃত্ত কলগুলির সাথে আপনার একই সমস্যা হতে পারে তবে মাল্টিথ্রেডিং সবচেয়ে খারাপ is) নিম্নলিখিত কোডটি বিবেচনা করুন:

if (filePath != null)  text = filePath.getName();

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

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

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


1
আপনি এর দ্বারা কী বোঝাতে চেয়েছেন তা কি আপনি স্পষ্ট করে বলতে পারেন ?: "স্থানীয় পরিবর্তনশীল বা অপরিবর্তনীয় ক্ষেত্র নয় এমন যে কোনও কিছুই সমস্যা Glo
আন্দ্রেস এফ

1
@ অ্যান্ড্রেসএফ: আমি আমার উত্তরটি প্রসারিত করেছি। আমি মনে করি যে আমি একটি ডেস্কটপ পন্থা নিচ্ছি যেখানে এই পৃষ্ঠার বেশিরভাগ লোকেরা একটি ডেটাবেস-সহ সার্ভার-কোড-বেশি। "গ্লোবাল" এর অর্থ এই ক্ষেত্রে বিভিন্ন জিনিস হতে পারে।
র‌্যাল্ফচাপিন

2

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

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

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


1

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

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


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

1

আমি বৈশ্বিক পরিবর্তনশীলগুলি ভাল বা খারাপ কিনা তা জানাতে চাই না, তবে আমি যে আলোচনায় যুক্ত করতে যাচ্ছি তা হ'ল যদি আপনি বিশ্বব্যাপী রাষ্ট্র ব্যবহার না করে থাকেন তবে আপনি সম্ভবত প্রচুর স্মৃতি নষ্ট করছেন, বিশেষত যখন আপনি ক্ষেত্রগুলিতে তাদের নির্ভরতা সঞ্চয় করতে ক্লাসেস ব্যবহার করেন।

গ্লোবাল রাষ্ট্রের জন্য, এ জাতীয় কোনও সমস্যা নেই, সমস্ত কিছুই বিশ্বব্যাপী।

উদাহরণস্বরূপ: নিম্নলিখিত দৃশ্যের কল্পনা করুন: আপনার একটি 10x10 গ্রিড রয়েছে যা ক্লাসকেস "বোর্ড" এবং "টাইল" দিয়ে তৈরি।

আপনি যদি এটি ওওপি করে করতে চান তবে আপনি সম্ভবত "বোর্ড" অবজেক্টটি প্রতিটি "টাইল" এ পাস করবেন। এখনই বলা যাক যে "টাইল" এর 2 টি "বাইট" টাইপ ক্ষেত্র রয়েছে যা এটি স্থানাঙ্ক সঞ্চয় করে। এটি একটি টাইলের জন্য 32 বিট মেশিনে নেওয়া মোট মেমরিটি হবে (1 + 1 + 4 = 6) বাইট: এক্স কর্ডের জন্য 1, ওয়াই কর্ডের জন্য 1 এবং বোর্ডের পয়েন্টারের জন্য 4। এটি 10x10 টাইলস সেটআপের জন্য মোট 600 বাইট দেয়

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

সুতরাং এক্ষেত্রে আপনি কেবল বিশ্বব্যাপী রাষ্ট্র ব্যবহার করলে আপনি মেমরির 1/3 অংশ ব্যবহার করতে পারেন।

এটি অন্যান্য জিনিসগুলির পাশাপাশি আমার ধারণা, বিশ্বব্যাপী সুযোগটি এখনও সি ++ এর মতো নিম্ন স্তরের ভাষায় (তুলনামূলকভাবে) থাকার কারণ রয়েছে


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

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

0

বৈশ্বিক রাষ্ট্রের সাথে বিবেচনা করার জন্য কয়েকটি কারণ রয়েছে:

  1. প্রোগ্রামার মেমরি স্পেস
  2. অপরিবর্তনীয় গ্লোবাল / একবার গ্লোবাল লিখুন।
  3. পরিবর্তনীয় গ্লোবাল
  4. গ্লোবালগুলির উপর নির্ভরতা।

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

অপরিবর্তনীয় / একবার লেখাই সাধারণত ঠিক থাকে, তবে আরম্ভের ক্রম ত্রুটির জন্য নজর রাখুন।

পরিবর্তনীয় গ্লোবালগুলি প্রায়শই পরিবর্তনযোগ্য গ্লোবালগুলির জন্য ভুল করা হয় ...

কার্যকরভাবে গ্লোবালগুলি ব্যবহার করে এমন একটি ফাংশনে অতিরিক্ত "লুকানো" পরামিতি রয়েছে, এটি আরও শক্তিশালী করে তোলে।

গ্লোবাল স্টেট খারাপ নয়, তবে এটি একটি নির্দিষ্ট মূল্যে আসে - যখন সুবিধাটি ব্যয়ের চেয়ে বেশি হয় তখন এটি ব্যবহার করুন।

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