উত্তর:
পাইথনের সাথে এর কোনও যোগসূত্র নেই; যে কোনও প্রোগ্রামিং ভাষায় গ্লোবাল ভেরিয়েবলগুলি খারাপ।
যাইহোক, বিশ্বব্যাপী ধ্রুবক যেমন ধারণার দিক থেকে একই নয় গ্লোবাল ভেরিয়েবল ; গ্লোবাল ধ্রুবক পুরোপুরি নিরীহ। পাইথন দুটি পার্থক্য কনভেনশন দ্বারা বিশুদ্ধরূপে হল: CONSTANTS_ARE_CAPITALIZED
এবং globals_are_not
।
গ্লোবাল ভেরিয়েবলগুলি খারাপ হওয়ার কারণ হ'ল তারা ফাংশনগুলিকে গোপন করতে সক্ষম করে (অ-সুস্পষ্ট, আশ্চর্যজনক, সনাক্তকরণে কঠোর, নির্ণয় করা শক্ত) পার্শ্ব প্রতিক্রিয়া, যা জটিলতায় বৃদ্ধি পায় এবং সম্ভবত স্প্যাগেটি কোডের দিকে পরিচালিত করে ।
তবে অ্যালগরিদম অপ্টিমাইজেশন, হ্রাস জটিলতা, ক্যাচিং এবং মেমোয়াইজেশন বা মূলত আবশ্যক কোডবেসে উত্থিত পোর্টিং স্ট্রাকচারের কার্যকারিতা বা বৈজ্ঞানিক প্রোগ্রামিংয়েও বৈশ্বিক রাষ্ট্রের বুদ্ধিমান ব্যবহার গ্রহণযোগ্য (যেমন স্থানীয় রাষ্ট্র ও পরিবর্তন হিসাবে) is
সব মিলিয়ে আপনার প্রশ্নের উত্তর বিভিন্নভাবে দেওয়া যেতে পারে, তাই আপনার সেরা বেট হ'ল গুগল "কেন বিশ্বব্যাপী পরিবর্তনগুলি খারাপ"। কিছু উদাহরণ:
আপনি যদি আরও গভীরতর দিকে যেতে চান এবং পার্শ্ব প্রতিক্রিয়াগুলি এবং অন্যান্য অনেক আলোকিত বিষয় কেন তা জানতে চান, আপনার ফাংশনাল প্রোগ্রামিং শিখতে হবে:
হ্যাঁ, তাত্ত্বিকভাবে , গ্লোবালগুলি (এবং সাধারণভাবে "রাষ্ট্র") খারাপ। অনুশীলনে, আপনি যদি অজগরটির প্যাকেজ ডিরেক্টরিটি দেখুন তবে আপনি দেখতে পাবেন যে বেশিরভাগ মডিউলগুলি বিশ্বব্যাপী ঘোষণার একটি গুচ্ছ দিয়ে শুরু হয়। স্পষ্টতই, লোকেদের তাদের সাথে কোনও সমস্যা নেই।
বিশেষত অজগরের ক্ষেত্রে, গ্লোবালগুলির দৃশ্যমানতা একটি মডিউলে সীমাবদ্ধ, অতএব এমন কোনও "সত্য" গ্লোবাল নেই যা পুরো প্রোগ্রামকে প্রভাবিত করে - যা তাদের একটি উপায়কে ক্ষতিকারক করে তোলে। আরেকটি বিষয়: নেই const
, সুতরাং যখন আপনার একটি ধ্রুবক প্রয়োজন তখন আপনাকে একটি গ্লোবাল ব্যবহার করতে হবে।
আমার অনুশীলনে, যদি আমি কোনও ফাংশনে কোনও গ্লোবালকে সংশোধন করতে পারি তবে আমি global
প্রযুক্তিগতভাবে এর প্রয়োজন না থাকলেও আমি সর্বদা এটি দিয়ে ঘোষণা করি :
cache = {}
def foo(args):
global cache
cache[args] = ...
এটি গ্লোবালের ম্যানিপুলেশনগুলি ট্র্যাক ডাউন করতে সহজ করে তোলে।
এই বিষয়ে একটি ব্যক্তিগত মতামত হ'ল বিশ্বব্যাপী ভেরিয়েবলগুলি একটি ফাংশন যুক্তিতে ব্যবহার করার অর্থ হ'ল অন্য কিছু কোড যুক্তিটি এবং সেই ফাংশনের প্রত্যাশিত আউটপুটকে পরিবর্তন করতে পারে যা ডিবাগিংকে খুব শক্ত করে তোলে (বিশেষত বড় প্রকল্পগুলিতে) এবং পরীক্ষা আরও কঠিন করে তুলবে যেমন.
তদ্ব্যতীত, আপনি যদি অন্য কোডগুলি আপনার কোড (ওপেন সোর্স সম্প্রদায়, সহকর্মী ইত্যাদি) পড়ার বিষয়ে বিবেচনা করেন তবে তারা বুঝতে চেষ্টা করবেন যে বৈশ্বিক চলকটি কোথায় স্থাপন করা হচ্ছে, কোথায় পরিবর্তন করা হয়েছে এবং এই বৈশ্বিক চলকটির বিরোধিতা হিসাবে কী আশা করবেন? কোনও বিচ্ছিন্ন ফাংশনে যে কার্যকারিতাটি ফাংশন সংজ্ঞা নিজেই পড়ে তা নির্ধারণ করা যায়।
আমি বিশ্বাস করি যে একটি পরিষ্কার এবং (প্রায়) বাগ-মুক্ত কোডে ফাংশন থাকা উচিত যা যথাসম্ভব খাঁটি ( খাঁটি ফাংশন দেখুন )। একটি খাঁটি ফাংশন হ'ল নিম্নলিখিত শর্তসমূহ:
বহিরাগত কোড হিসাবে উভয়ই সম্ভবত অপ্রত্যাশিত ফলাফলের কারণ হতে পারে যদি বিশ্বব্যাপী ভেরিয়েবলগুলি উপরের মধ্যে অন্তত একটির লঙ্ঘন করে।
খাঁটি ফাংশনগুলির আরেকটি সুস্পষ্ট সংজ্ঞা: "খাঁটি ফাংশন হ'ল এমন একটি ফাংশন যা এর সমস্ত ইনপুট সুস্পষ্ট যুক্তি হিসাবে গ্রহণ করে এবং এর সমস্ত আউটপুট সুস্পষ্ট ফলাফল হিসাবে উত্পাদন করে " " [1] । গ্লোবাল ভেরিয়েবল থাকা কোনও ইনপুট এবং খালি আউটপুটগুলির (গ্লোবাল ভেরিয়েবল) স্পষ্টভাবে দেওয়া বা প্রত্যাবর্তন করা হচ্ছে না বলে বিশুদ্ধ ফাংশনগুলির ধারণা লঙ্ঘন করে।
যে উপরন্তু, যদি আপনি ইউনিট-টেস্টিং এবং প্রথম নীতি বিবেচনা ( এফ AST পরীক্ষা আমি ndependent পরীক্ষা আর epeatable, S পরী-যাচাই করা হচ্ছে এবং টি imely) সম্ভবত লঙ্ঘন করবে স্বাধীন নীতি (টেস্টে যার মানে পরীক্ষা নির্ভর করে না একে অপরের উপর).
গ্লোবাল ভেরিয়েবল (সর্বদা নয়) থাকলেও বেশিরভাগ ক্ষেত্রে (কমপক্ষে আমি এখন পর্যন্ত যা দেখেছি তার মধ্যে কমপক্ষে) ফলাফল প্রস্তুত করা এবং অন্যান্য কার্যক্রমে ফলাফল পাস করা। এটি পাশাপাশি এই নীতি লঙ্ঘন করে। যদি গ্লোবাল ভেরিয়েবলটি সেভাবে ব্যবহার করা হয় (অর্থাত এক্স ফাংশনে ব্যবহৃত গ্লোবাল ভেরিয়েবলটি প্রথমে একটি ফাংশন ওয়াইতে সেট করতে হবে) এর অর্থ হ'ল পরীক্ষার ফাংশন এক্সকে ইউনিট করতে আপনাকে প্রথমে টেস্ট / রান ফাংশন চালাতে হবে Y।
অন্যদিকে এবং অন্যান্য লোকেরা ইতিমধ্যে উল্লেখ করেছে, গ্লোবাল ভেরিয়েবলটি যদি একটি "ধ্রুবক" ভেরিয়েবল হিসাবে ব্যবহৃত হয় তবে ভাষাটি ধ্রুবককে সমর্থন করে না বলে কিছুটা ভাল হতে পারে। তবে আমি সবসময় ক্লাসের সাথে কাজ করা এবং ক্লাস সদস্য হিসাবে "কনস্ট্যান্টস" থাকা পছন্দ করি এবং কোনও বৈশ্বিক পরিবর্তনশীল ব্যবহার করি না। আপনার যদি এমন একটি কোড থাকে যে দুটি পৃথক শ্রেণীর জন্য একটি বৈশ্বিক পরিবর্তনশীল ভাগ করতে হবে তবে আপনার সম্ভবত আপনার সমাধানটি রিফ্যাক্টর করতে হবে এবং আপনার ক্লাসগুলি স্বাধীন করতে হবে।
আমি বিশ্বাস করি না যে গ্লোবালগুলি ব্যবহার করা উচিত নয়। তবে যদি তারা ব্যবহার করা হয় তবে ক্লিনার এবং প্রায় বাগ-মুক্ত কোডের জন্য লেখকদের কিছু নীতিগুলি (সম্ভবত উপরে বর্ণিত সম্ভবত এবং অন্যান্য সফ্টওয়্যার ইঞ্জিনিয়ারিং নীতিগুলি এবং ভাল অনুশীলনগুলি) বিবেচনা করা উচিত।
এগুলি অপরিহার্য, পর্দা একটি ভাল উদাহরণ। তবে, বহুবিবাহিত পরিবেশে বা অনেক বিকাশকারী জড়িত থাকার সাথে, অনুশীলনে প্রায়শই প্রশ্ন ওঠে: কে (ভ্রান্তভাবে) এটি সেট করেছে বা সাফ করেছে? স্থাপত্যের উপর নির্ভর করে বিশ্লেষণ ব্যয়বহুল হতে পারে এবং প্রায়শই প্রয়োজন হয়। গ্লোবাল ভার পড়ার সময় ঠিক থাকতে পারে, এটিকে লেখার বিষয়টি অবশ্যই নিয়ন্ত্রণ করা উচিত, উদাহরণস্বরূপ একক থ্রেড বা থ্রেডস্যাফ ক্লাস দ্বারা। সুতরাং, বিশ্বব্যাপী যুদ্ধগুলি উচ্চতর উন্নয়নের ব্যয়ের আশঙ্কা নিয়ে আসে যার ফলস্বরূপ তারা নিজেরাই মন্দ বলে বিবেচিত হয়। সুতরাং সাধারণভাবে, বিশ্বব্যাপী ভার্সের সংখ্যা কম রাখা ভাল অনুশীলন।
eval
,import *
, স্ট্রিং সংযুক্তকরণের , পরিবর্তনশীলid
, অ্যাট্রিবিউট ছায়া )