গ্লোবাল ভেরিয়েবল ব্যবহার করা কখন ঠিক হবে


22

ঠিক আছে, সুতরাং এটি সত্যই কিছুটা শয়তানদের অ্যাডভোকেট প্রশ্ন।

গ্লোবাল ভেরিয়েবলগুলি কখন ঠিক আছে, এবং যদি তা না হয় তবে আপনি বিকল্প হিসাবে কী ব্যবহার করবেন?

এই প্রশ্নের একটি আকর্ষণীয় পক্ষ-কেস, পাবলিক স্ট্যাটিক ক্লাস ফিল্ড কীভাবে বিশ্বব্যাপী থেকে আলাদা?


5
কোড সম্পূর্ণ , দ্বিতীয় সংস্করণ, .313.3।
জেরি কফিন

1
মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলির জন্য বিশ্বব্যাপী ভেরিয়েবলগুলি প্রয়োজন
জল


4
@ একোয়া মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলি যেখানে গ্লোবাল ভেরিয়েবলগুলি সবচেয়ে ক্ষতিকারক হতে পারে। প্রত্যেকে জটিল লকিং যুক্তি ঘৃণা করে।
লুস্কুবাল

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

উত্তর:


18

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

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


2
আমি একটি অপরিবর্তনীয় ক্ষেত্রকে একটি ধ্রুবক বলব ।
আইয়ুব

14

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


আপনি কি এটির জন্য বা কোনও সর্বজনীন স্ট্যাটিক / সিঙ্গলটনের জন্য খাঁটি গ্লোবাল ব্যবহার করবেন?
ocodo

1
@ স্লোমোজো: অবশ্যই সিঙ্গলটন নয়। পরিস্থিতির উপর নির্ভর করে, হয় একটি কনফিগারেশন ক্লাসের স্ট্যাটিকস, বা একটি CONFIG_বা CFG_উপসর্গের সাথে প্লেইন গ্লোবালগুলি ।
আনন

আমি যে পরিবর্তনটি প্রস্তাব করব তা +1 হ'ল "... ত্রুটি-ঝুঁকির সাথে একে অন্য শ্রেণীর প্রতিটি পদ্ধতিতে প্রেরণ" say অন্যথায় এটি যা যা পরিবেশন করে তা ক্লাসে ফেলে দেওয়া যেতে পারে - সিঙ্গলটন আমার মনে হয়।
মাইকেল ডুরান্ট

8

রিয়েল টাইম / এম্বেড থাকা সিস্টেমগুলি বাদ দিয়ে, আপনার কেবলমাত্র ধ্রুবক মানের জন্য গ্লোবালগুলি ব্যবহার করা উচিত really আপনি যদি মনে করেন যে এগুলি ছাড়া আপনি আপনার সমস্যা সমাধান করতে পারবেন না, আপনি সম্ভবত কিছু ভুল করছেন।

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


8
আমি সম্ভবত সিঙ্গলেটন এড়ানো পরামর্শ দিই।
ocodo

আমি প্রস্তাব দিচ্ছি না যে সিঙ্গলেটগুলি দুর্দান্ত, তবে আমি এখনও মনে করি তারা বিশ্বব্যাপী ভেরিয়েবলকে অনেক বেশি পরাজিত করে।
প্রিয় Žদ্রো

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

1
একটি Singleton ক্ষেত্র হয় , বিশ্বব্যাপী ভেরিয়েবল তাই আমি কিভাবে কোন পার্থক্য দেখি না।

1
@ চিতুলহু আমাকে নিজের বক্তব্যটি লিখতে দিন: "এই পরিস্থিতিতে যখন আপনার বিশ্বব্যাপী অ্যাক্সেস পয়েন্ট পাওয়ার দরকার হয়"।
Žদ্রো

6

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

আমি এইরকমটি অনুভব করি তার অন্য একটি উদাহরণের জন্য, রুবিতে মিক্সিন ব্যবহারের দিকে নজর দিন।


গ্লোবালগুলির এই ব্যবহারগুলির জন্য আপনি কী উদাহরণ ব্যবহার করবেন?
ocodo

1
@ স্লোমোজো: গ্লোবালগুলির একটি উদাহরণ যা আমি আপত্তি করি না তা হ'ল পার্লে @ARGV এবং $ _ এর ব্যবহার। আমি যে উদাহরণটি মনে করি তা হ'ল সাবরোটাইনগুলিতে সস্তা প্যারামিটারটি পাস করার জন্য গ্লোবাল ব্যবহার।
btilly

5

এটি সবই নেমস্পেসের কথা।

এক মুহুর্তের জন্য কল্পনা করুন যে বিশ্বের প্রত্যেকের একই নাম ছিল। কী এলোমেলো.

(ভারতে শিখদের একই একই শেষ নাম রয়েছে: সিংহ - একবার দেখুন)


6
এটি নেমস্পেসগুলি সম্পর্কে সবসময় ব্যবহৃত হত , তবে এখন এটি থ্রেড সুরক্ষা সম্পর্কে।
dan04

6
@ dan04 এটি দূরবর্তী জায়গায় ভুতুড়ে কর্মের সাথে একটি জঘন্য নকশা না রাখার বিষয়ে।
টম হাটিন -

2
@ টম: সম্ভবত আমরা সেইটিকে জিভ-ইন-গাল, "কোয়ান্টাম প্রোগ্রামিং" বলতে পারি
ক্রিস্টোফার মাহান

4

সংক্ষিপ্ত সংস্করণ: যখন প্রোগ্রামটিকে যুক্তিযুক্ত করা সহজ করে। সাধারণত কেসগুলি হ'ল কিছু ধরণের বৈশ্বিক রাষ্ট্র বা স্থিতিশীল সংস্থান যা ব্যাপকভাবে ব্যবহৃত হয়।

দীর্ঘ সংস্করণ: টম হাটিন বলেছিলেন "দূরত্বে ভুতুড়ে কর্মের সাথে" ... গ্লোবালগুলির সাথে ঠিক এটিই সমস্যা - এটি আপনাকে কোথায় ব্যবহার করা হচ্ছে এবং কীভাবে জানতে হবে, বা আপনি কিছু সত্যই অদ্ভুত এবং ট্র্যাক খুঁজে পেতে পারেন বাগ। প্রোগ্রামারটিকে যুক্তিযুক্ত করার জন্য প্রোগ্রামারকে কী বুঝতে হবে তা বাড়ানোর কৌশলটি স্থানীয়রা কম বা কম কিছু নয়।

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

আপনার কাছে যত বেশি গ্লোবাল রয়েছে ততই তাদের সাথে কী ঘটছে তা ট্র্যাক করে রাখা। এগুলি খুব কম এবং খুব দূরত্বের হওয়া উচিত।


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

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

3

গ্লোবাল এবং সিঙ্গেলটনের সাথে দুটি গোগাছ হ'ল পরীক্ষাযোগ্যতা এবং শৃঙ্খলাবদ্ধ।

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

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

সামগ্রিকভাবে, আমি এই কারণগুলি অনুমান করি যে গ্লোবাল এবং সিঙ্গলেটগুলি কেবল ব্যতিক্রমীভাবে ব্যবহৃত হয়।


2

সমালোচনামূলক এম্বেড থাকা সিস্টেমগুলির বিকাশে সাধারণত গ্লোবাল ভেরিয়েবলের ব্যবহার জড়িত।

স্ট্যাকের আকারগুলি ছোট, সমস্ত কিছু স্থিতিশীলভাবে বরাদ্দ করা হয় ( malloc()নিষিদ্ধ), গ্লোবাল ভেরিয়েবলগুলি তাদের অন্তর্ভুক্ত লাইব্রেরির বাইরে থেকে লুকানো থাকে।


0

একটি ভয়াবহ ভিবি 6 কোড বেসে বিশ্ববালগুলি আপত্তি জানায় যেমন আগামীকাল নেই, আমি একটি নতুন প্রবর্তনের জন্য দোষী:

Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained

আমি মনে করি এটি কোনও বিশ্বব্যাপী অবজেক্টের জন্য কয়েকটি বৈধ ব্যবহারের কেস।

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