কেন বিশ্বব্যাপী পরিবর্তনগুলি মন্দ? [বন্ধ]


120

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


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

উত্তর:


156

পাইথনের সাথে এর কোনও যোগসূত্র নেই; যে কোনও প্রোগ্রামিং ভাষায় গ্লোবাল ভেরিয়েবলগুলি খারাপ।

যাইহোক, বিশ্বব্যাপী ধ্রুবক যেমন ধারণার দিক থেকে একই নয় গ্লোবাল ভেরিয়েবল ; গ্লোবাল ধ্রুবক পুরোপুরি নিরীহ। পাইথন দুটি পার্থক্য কনভেনশন দ্বারা বিশুদ্ধরূপে হল: CONSTANTS_ARE_CAPITALIZEDএবং globals_are_not

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

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

সব মিলিয়ে আপনার প্রশ্নের উত্তর বিভিন্নভাবে দেওয়া যেতে পারে, তাই আপনার সেরা বেট হ'ল গুগল "কেন বিশ্বব্যাপী পরিবর্তনগুলি খারাপ"। কিছু উদাহরণ:

আপনি যদি আরও গভীরতর দিকে যেতে চান এবং পার্শ্ব প্রতিক্রিয়াগুলি এবং অন্যান্য অনেক আলোকিত বিষয় কেন তা জানতে চান, আপনার ফাংশনাল প্রোগ্রামিং শিখতে হবে:


35

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

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

আমার অনুশীলনে, যদি আমি কোনও ফাংশনে কোনও গ্লোবালকে সংশোধন করতে পারি তবে আমি globalপ্রযুক্তিগতভাবে এর প্রয়োজন না থাকলেও আমি সর্বদা এটি দিয়ে ঘোষণা করি :

cache = {}

def foo(args):
    global cache

    cache[args] = ...

এটি গ্লোবালের ম্যানিপুলেশনগুলি ট্র্যাক ডাউন করতে সহজ করে তোলে।


3
বিভিন্ন উপায়ে, পাইথনের একটি মডিউল একটি সিঙ্গলটন শ্রেণীর অনুরূপ, এবং মডিউল গ্লোবালগুলি শ্রেণীর বৈশিষ্ট্যের সমান।
করলি ব্রিগম্যান

9
@ করলিব্রিগম্যান: সিঙ্গেলটন ক্লাসগুলি প্রায়শই একই সমস্যাগুলির মধ্যে পড়ে সাধারণত বিশ্বব্যাপী দায়ী করা হয় :)
এরিক কাপলুন

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

2
বেশিরভাগ মডিউলগুলি ধ্রুবক ব্যতীত গ্লোবালগুলি সংজ্ঞায়িত করে শুরু হয় না । গ্লোবালগুলি খারাপ মানে বৈকল্পিক / বৈশ্বিক রাষ্ট্র স্থির নয়।
ব্ল্যাকজ্যাক

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

10

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

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

(সম্ভবত) খাঁটি ফাংশন সংজ্ঞা লঙ্ঘন

আমি বিশ্বাস করি যে একটি পরিষ্কার এবং (প্রায়) বাগ-মুক্ত কোডে ফাংশন থাকা উচিত যা যথাসম্ভব খাঁটি ( খাঁটি ফাংশন দেখুন )। একটি খাঁটি ফাংশন হ'ল নিম্নলিখিত শর্তসমূহ:

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

বহিরাগত কোড হিসাবে উভয়ই সম্ভবত অপ্রত্যাশিত ফলাফলের কারণ হতে পারে যদি বিশ্বব্যাপী ভেরিয়েবলগুলি উপরের মধ্যে অন্তত একটির লঙ্ঘন করে।

খাঁটি ফাংশনগুলির আরেকটি সুস্পষ্ট সংজ্ঞা: "খাঁটি ফাংশন হ'ল এমন একটি ফাংশন যা এর সমস্ত ইনপুট সুস্পষ্ট যুক্তি হিসাবে গ্রহণ করে এবং এর সমস্ত আউটপুট সুস্পষ্ট ফলাফল হিসাবে উত্পাদন করে " " [1] । গ্লোবাল ভেরিয়েবল থাকা কোনও ইনপুট এবং খালি আউটপুটগুলির (গ্লোবাল ভেরিয়েবল) স্পষ্টভাবে দেওয়া বা প্রত্যাবর্তন করা হচ্ছে না বলে বিশুদ্ধ ফাংশনগুলির ধারণা লঙ্ঘন করে।

(সম্ভবত) লঙ্ঘন ইউনিট পরীক্ষার প্রথম নীতি

যে উপরন্তু, যদি আপনি ইউনিট-টেস্টিং এবং প্রথম নীতি বিবেচনা ( এফ AST পরীক্ষা আমি ndependent পরীক্ষা আর epeatable, S পরী-যাচাই করা হচ্ছে এবং টি imely) সম্ভবত লঙ্ঘন করবে স্বাধীন নীতি (টেস্টে যার মানে পরীক্ষা নির্ভর করে না একে অপরের উপর).

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

ধ্রুবক হিসাবে গ্লোবাল

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

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


1
আমি "গ্লোবালগুলি ধ্রুবক হিসাবে সমস্যা হিসাবে" পছন্দ করি ... কারণ আপনি যদি ওও ডিজাইন করেন তবে এটি আসলেই। আইডিক্রিটার ক্লাস ছাড়া অন্য কারও আইডি_এলইএন জানতে হবে?
এরিক অ্যারোনস্টি

3

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

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