কীভাবে গ্লোবাল একটি ডাটাবেস থেকে আলাদা?


250

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

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

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


117
প্রবীণ সদস্যরা
ডগমাসকে

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

45
গ্লোবাল স্টেট এমন একটি অ্যাপ্লিকেশনগুলির স্বেচ্ছাসেবী সংখ্যার সাথে একযোগে অবিচ্ছিন্নভাবে অনেকগুলি কলামগুলি অ্যাক্সেস করে একক সারিতে একক টেবিলের সাথে একটি ডাটাবেস রাখার মতো।
বেভিনকিউ

42
ডাটাবেসগুলিও খারাপ।
স্টিগ হেমার

27
আপনি এখানে যুক্তিটি "উল্টো" করা এবং অন্যদিকে যেতে মনোরম ing অন্য স্ট্রাক্টের একটি পয়েন্টার রয়েছে এমন স্ট্রাক্টটি যুক্তিযুক্তভাবে কেবল একটি টেবিলের এক সারিতে একটি বিদেশী কী যা অন্য টেবিলের অন্য সারিতে চাবি দেয়। ওয়াকিং লিঙ্কযুক্ত তালিকাগুলি সহ কোনও কোডের সাথে কীভাবে কাজ করছেন ডেটাবেজে ডেটা ম্যানিপুলেট করা থেকে আলাদা? উত্তর: তা নয়। প্রশ্ন: তাহলে কেন আমরা মেমরির ডেটা স্ট্রাকচার এবং ইন-ডাটাবেস ডেটা স্ট্রাকচারগুলিকে এই জাতীয় বিভিন্ন সরঞ্জাম ব্যবহার করে ম্যানিপুলেট করি? উত্তর: আমি আসলে জানি না! ভাল ডিজাইনের চেয়ে ইতিহাসের দুর্ঘটনার মতো মনে হচ্ছে।
এরিক লিপার্ট

উত্তর:


118

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

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

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

  • কোনও অ্যাপ্লিকেশনে গ্লোবাল স্টেট সাধারণত কোনও দৃ database় ধারাবাহিকতার গ্যারান্টি সরবরাহ করে না যে কোনও ডাটাবেস করে - এমন কোনও লেনদেন হয় না যে সময়ে আপনি এর জন্য একটি সামঞ্জস্যপূর্ণ রাষ্ট্র দেখেন, কোনও পারমাণবিক আপডেট ইত্যাদি হয় না etc.

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


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

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

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

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

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

75

প্রথমত, আপনি যে লিঙ্ক করেছেন এমন প্রশ্নের স্বীকৃত উত্তরের ভিত্তিতে বৈশ্বিক পরিবর্তনশীলগুলির সাথে সমস্যাগুলি কী?

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

ডেটাবেসগুলি হ'ল, সময়ের সিংহভাগ, এসিডি অনুগত। এসিডি বিশেষত অন্তর্নিহিত সমস্যাগুলিকে সম্বোধন করে যা একটি ডেটা স্টোরকে অবিশ্বাস্য বা অবিশ্বাস্য করে তুলবে।

তদুপরি, গ্লোবাল স্টেট আপনার কোডের পঠনযোগ্যতাকে আঘাত করে।

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

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

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


4
+1 আপনি যা বলছেন তা হ'ল ডাটাবেসগুলিতে লেনদেন হয়, বৈশ্বিক রাষ্ট্রের একাধিক টুকরোটি পরমাণুভাবে পড়া এবং লেখা সম্ভব করে তোলে । ভাল পয়েন্ট, যা কেবলমাত্র প্রতিটি সম্পূর্ণ স্বতন্ত্র তথ্যের জন্য গ্লোবাল ভেরিয়েবল ব্যবহার করে পরিবেষ্টিত করা যায় ।
l0b0

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

1
সুতরাং গ্লোবাল ভেরিয়েবলগুলি ব্যবহার করা ঠিক হবে যদি আমি ফাংশনের শুরুতে স্থানীয় ভেরিয়েবলের (একটি মুটেক্স সহ) মানটি অনুলিপি করি, স্থানীয় ভেরিয়েবলটি সংশোধন করি এবং তারপরে মানটি বিশ্বব্যাপী ভেরিয়েবলের শেষে কপি করি global কাজ? (... তিনি বক্তৃতা দিয়ে জিজ্ঞাসা করলেন।)
আরএম

1
@ আরএম তিনি দুটি বিষয় উল্লেখ করেছেন। আপনি যা ছুঁড়ে ফেলেছেন তা প্রথমে সম্বোধন করতে পারে (প্রোগ্রামের অবস্থাটি অনাকাঙ্ক্ষিত) তবে এটি দ্বিতীয়টিকে (আপনার কোডের পঠনযোগ্যতা) সম্বোধন করে না। আসলে এটি আপনার প্রোগ্রামের পঠনযোগ্যতা আরও খারাপ করে দিতে পারে: পি।
রিওয়ালক

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

45

আমি কয়েকটি পর্যবেক্ষণ প্রস্তাব করব:

হ্যাঁ, একটি ডাটাবেস বিশ্বব্যাপী রাষ্ট্র।

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

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

হুম ... জিনিসটি এখানে:

যদি কোনও মডিউল কোনও উপায়ে বাহ্যিকভাবে কাজ না করে তবে এটি কিছুই করে না।

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

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

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

তবে, আমরা সাধারণত বিশ্ব রাষ্ট্রের সাথে সরাসরি কাজ করছি না ।

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

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

এবং পরিশেষে, আমরা সাধারণত বিভিন্ন জিনিস ডাটাবেস সাথে আমরা চেয়ে না পারে দুষ্টু globals সঙ্গে।

একটি দুষ্টু, ভাঙা গ্লোবাল দেখতে এরকম:

Int32 counter = 0;

public someMethod() {
  for (counter = 0; counter < whatever; counter++) {
    // do other stuff.
  }
}

public otherMethod() {
  for (counter = 100; counter < whatever; counter--) {
    // do other stuff.
  }
}

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


3
গ্যারান্টি দেওয়ার উপায় (যেহেতু আমরা ধরে নিতে পারি না) "আমাদের দেওয়া ডেটা পরিবর্তন হয়নি" একটি ডাটাবেসে লেনদেন হবে।
l0b0

হ্যাঁ ... এটিকে "একই ধরণের লকিং" দিয়ে বোঝানো হয়েছিল।
এসভিডজেন

তবে, দিন শেষে সাবধানতার সাথে চিন্তা করা কঠিন হতে পারে।

হ্যাঁ, ডাটাবেসগুলি সত্যই বিশ্বব্যাপী রাষ্ট্র - যার কারণেই গিট বা আইপিএস-এর মতো কিছু ব্যবহার করে ডেটা ভাগ করে নেওয়া এত লোভনীয়।
উইলিয়াম

21

আমি মৌলিক দাবির সাথে একমত নই যে:

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

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

তবে আমি একটি স্থাপত্য স্তরেও ডায়সগ্রি করি g একটি বৈশ্বিক পরিবর্তনশীল কেবল বৈশ্বিক রাষ্ট্র নয়। এটি বিশ্বব্যাপী রাষ্ট্র যা স্বচ্ছতার যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য। একটি ডাটাবেস ব্যবহারের বিপরীতে আপনার এটির একটি হ্যান্ডেল থাকা দরকার - (যদি না আপনি একটি বৈশ্বিক পরিবর্তনশীল হিসাবে হ্যান্ডেলের চেয়ে সঞ্চয় করেন ....)

উদাহরণস্বরূপ, বিশ্বব্যাপী ভেরিয়েবল ব্যবহার করা এর মতো দেখতে পারে

int looks_ok_but_isnt() {
  return global_int++;
}

int somewhere_else() {
  ...
  int v = looks_ok_but_isnt();
  ...
}

তবে একটি ডাটাবেসের সাথে একই জিনিসটি করা কী করছে তা সম্পর্কে আরও সুস্পষ্ট হতে হবে

int looks_like_its_using_a_database( MyDB * db ) {
   return db->get_and_increment("v");
}

int somewhere_else( MyBD * db ) { 
   ...
   v = looks_like_its_using_a_database(db);
   ...
}

ডেটাবেস এক স্পষ্টতই একটি ডেটাবেস সঙ্গে মিকিং হয়। আপনি যদি কোনও ডাটাবেস না ব্যবহার করতে চান তবে আপনি স্পষ্ট অবস্থা ব্যবহার করতে পারেন এবং এটি ডেটাবেস কেসের মতো দেখতে প্রায় একই দেখাচ্ছে।

int looks_like_it_uses_explicit_state( MyState * state ) {
   return state->v++;
}


int somewhere_else( MyState * state ) { 
   ...
   v = looks_like_it_uses_explicit_state(state);
   ...
}

সুতরাং আমি যুক্তি দিয়েছি যে একটি ডাটাবেস ব্যবহার করা গ্লোবাল ভেরিয়েবল ব্যবহারের চেয়ে সুস্পষ্ট রাষ্ট্র ব্যবহারের মতো using


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

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

1
+1 পার্শ্ব নোটে, এই উত্তরটি অনেকটা ব্যাখ্যা করে যে নির্ভরতা ইনজেকশন সম্পর্কে আমি সবচেয়ে বেশি ঘৃণা করি। এটি নির্ভরশীলতা এই ধরণের লুকায়।
jpmc26

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

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

18

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

ডাটাবেসগুলি অবশ্য আলাদা বিষয়, কারণ এগুলি কথা বলতে "বিশ্বব্যাপী" অ্যাক্সেস করার উদ্দেশ্যে তৈরি করা হয়েছে।

উদাহরণ স্বরূপ:

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

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


1
হাহ। আমি প্রায় অভিন্ন উত্তর লেখার মধ্য দিয়ে যখন ছিলাম তখন আপনি আমাকে এটিকে মারলেন। :)
জুলাই

@ আপনার উত্তরগুলিকে জাজগুলি প্রয়োগের দিক থেকে আরও বিশদ সরবরাহ করে; এটা রাখ.
জেফরি সুইনি 20

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

হাই, আপনি জাভার মতো স্থির-টাইপযুক্ত ভাষা ব্যবহার করছেন যদি পয়েন্ট 1 এবং 3 এখনও কার্যকর হয়?
জেসভিন জোস

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

10

কিন্তু যখন আমি এটি দেখি, আমি সাহায্য করতে পারি না তবে ভাবতে পারি যে এটি একটি সত্যই দুর্বল ব্যাখ্যা, কারণ এটি কোনও ডাটাবেসে সঞ্চিত ডেটা দিয়ে কাজ করা থেকে আলাদা কীভাবে?

বা একটি ইন্টারেক্টিভ ডিভাইস, একটি ফাইল সহ ভাগ করা মেমরি ইত্যাদির সাথে কাজ করা ইত্যাদির চেয়ে আলাদা কোনও প্রোগ্রাম A হ্যাঁ, এটি একটি দুর্বল যুক্তি।

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

অন্যদিকে গ্লোবাল ভেরিয়েবলের সাথে এটি একেবারেই সুস্পষ্ট নয়। এপিআই কল করতে বলে foo(this_argument, that_argument)। কলিং সিক্যুয়েন্সে এমন কিছুই নেই যা বলে যে গ্লোবাল ভেরিয়েবলকে g_DangerWillRobinsonকিছু মান নির্ধারণ করা উচিত তবে কল করার আগে foo(বা কল করার পরে পরীক্ষা করা হয়েছিল foo)।


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

কোডটি একবার লেখা হয় এবং কয়েকবার পরিবর্তিত হয় তবে এটি যদি মোটামুটি ভাল হয় তবে এটি অনেকগুলি, বহুবার পড়া হয়। যোগাযোগের লুকানো রেখাগুলি খুব খারাপ কর্ম। সি ++ এর নন-কনস্ট্যান্ট রেফারেন্স যোগাযোগের একটি সামান্য লুকানো লাইনের প্রতিনিধিত্ব করে। একটি ভাল এপিআই বা একটি ভাল আইডিই আমাকে দেখায় যে "ওহ! এটি রেফারেন্সের মাধ্যমে কল" " গ্লোবাল ভেরিয়েবলগুলি যোগাযোগের একটি বিশাল লুকানো লাইন।


আপনার উত্তরটি আরও অর্থবহ করে।
বিল্লাল বেগেরাদজ

8

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


8

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

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

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

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


7

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

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

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

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

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

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

পিএস: অন্যান্য তুলনা রয়েছে যা এই তুলনার জন্য গুরুত্বপূর্ণ, যেমন সম্মতি জড়িত কিনা, তবে that পয়েন্টটি এখানে অন্যান্য উত্তর দ্বারা আবৃত।


আমি পছন্দ করি আপনি নির্ভরতার কোণ থেকে এটি নিয়েছেন।
cbojar

6

ঠিক আছে, startতিহাসিক দিক থেকে শুরু করা যাক।

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

এর অর্থ কি বিশ্বব্যাপী পরিবর্তনশীল ঘৃণা অতীতের একটি বিষয়? বেশ না।

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

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

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

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

এই সমস্যাগুলি সমাধান করা কি সম্ভব? আসলে তা না. এটি হ্যান্ডেল করার জন্য আপনার এনক্যাপসুলেশন প্রয়োজন বা সত্যই কঠোর শৃঙ্খলা। জিনিসগুলি সঠিকভাবে করা শক্ত এবং এটি সাধারণত সফ্টওয়্যার বিকাশে সাফল্যের খুব ভাল রেসিপি নয় :)

ছোট স্কোপগুলি কারণে যুক্তিযুক্ত কোডকে আরও সহজ করে তোলে। গ্লোবাল ভেরিয়েবলগুলি এমনকি কোডের সহজতম টুকরোকে স্কোপের বিশাল পরিমাণ অন্তর্ভুক্ত করে।

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


অনেকটা শারীরিক জগতের মতো শোনাচ্ছে: জিনিসগুলি পিছনে ফেরা খুব শক্ত।

এটি একটি ভাল উত্তর, তবে এটি শুরুতে একটি থিসিস স্টেটমেন্ট (টিএল; ডিআর বিভাগ) দাঁড়াতে পারে।
jpmc26

6

একটি বৈশ্বিক পরিবর্তনশীল একটি সরঞ্জাম, এটি ভাল এবং মন্দ জন্য ব্যবহার করা যেতে পারে।

একটি ডাটাবেস একটি সরঞ্জাম, এটি ভাল এবং মন্দ জন্য ব্যবহার করা যেতে পারে।

মূল পোস্টার নোট হিসাবে, পার্থক্য সব এত বড় নয়।

অনভিজ্ঞ শিক্ষার্থীরা প্রায়শই মনে করে যে বাগগুলি এমন একটি জিনিস যা অন্য মানুষের ক্ষেত্রে ঘটে। শিক্ষকরা খারাপ ডিজাইনের শাস্তি দেওয়ার সরল কারণ হিসাবে "গ্লোবাল ভেরিয়েবলগুলি অশুভ" use শিক্ষার্থীরা সাধারণত বুঝতে পারে না যে তাদের 100-লাইনের প্রোগ্রামটি বাগ ফ্রি হওয়ার অর্থ এই নয় যে 10000-লাইন প্রোগ্রামের জন্য একই পদ্ধতি ব্যবহার করা যেতে পারে।

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

লোকেরা যদি বিশ্বব্যাপী এসিআইডি পদ্ধতির ব্যবহার করে তবে তারা এত খারাপ হবে না।

অন্যদিকে, আপনি যদি ডেটাবেসগুলি খারাপভাবে ডিজাইন করেন তবে সেগুলি দুঃস্বপ্ন হতে পারে।


3
স্ট্যাকওভারফ্লোতে সাধারণ শিক্ষার্থীর দাবি: আমাকে সাহায্য করুন! আমার কোড নিখুঁত, কিন্তু এটি ঠিক কাজ করছে না!
ডেভিড হামেন

"গ্লোবাল ভেরিয়েবলগুলিতে এসিডি পদ্ধতি" - ক্লোজুরে রেফগুলি দেখুন।
চার্লস ডাফি

@ ডেভিডহ্যামেন এবং আপনি কি মনে করেন পেশাদারদের তুলনায় শিক্ষার্থীদের মস্তিষ্ক আছে?
বিল্লাল বেগেরাদজ

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


5

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


3
উদাহরণস্বরূপ, errnoসি তে
ডেভিড হামেন

1
গ্লোবাল এবং ডাটাবেসগুলি কেন একই নয় তা এটি ব্যাখ্যা করে। অন্যান্য পার্থক্য থাকতে পারে তবে আপনার নির্দিষ্ট পোস্টটি ধারণাটিকে পুরোপুরি ধ্বংস করে দেয়। যদি আপনি একটি দ্রুত কোড উদাহরণ দেন তবে আমি নিশ্চিত যে আপনি প্রচুর পরিমাণে উপার্জন পাবেন। যেমন মাইফাঙ্ক () {x = গ্লোবাল ওয়ার * 5; // .... কিছু অন্যান্য প্রক্রিয়াজাতকরণ; y = গ্লোবালবার * 34; // ওফস, অন্য কিছু প্রসেসিং চলাকালীন অন্য কিছু থ্রেড গ্লোবালবার পরিবর্তন করতে পারে এবং x এবং y তাদের গণনায় গ্লোবালবারের জন্য বিভিন্ন মান ব্যবহার করছে যা প্রায় অবশ্যই পছন্দসই ফলাফল দেয় না।
ডঙ্ক

5

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

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

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

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


* এখানে ব্যতিক্রম শিক্ষার্থীরা। শিক্ষার্থীদের গ্লোবাল ভেরিয়েবল ব্যবহার করা থেকে বিরত রাখা বোধগম্য হয় যাতে বিকল্পগুলি কী তা তাদের শিখতে হবে।

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


2

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

তারা এখানে মূল পার্থক্য হ'ল দায়িত্ব গ্রহণের একটি।

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

একই ধারণা বিশ্বব্যাপী v / s ডাটাবেসের ক্ষেত্রে আরও বিস্তৃত স্তরে প্রযোজ্য। এছাড়াও, প্রোগ্রামিং ল্যাঙ্গুয়েজ / ইকোসিস্টেমটি বেসরকারী v / s এর সর্বজনীন উপর অ্যাক্সেস বিধিনিষেধের গ্যারান্টি দেয় it

যখন মাল্টিথ্রেডিং কার্যকর হয়, তখন বেসরকারী ভি / গুলি পাবলিক ভি / গুলি গ্লোবাল ভি / এস ডাটাবেসের ধারণাটি কেবল একটি বর্ণালীতে পার্থক্য।

static int global; // within process memory space
static int dbvar; // mirrors/caches data outside process memory space

class Cls {
    public: static int class_public; // essentially the same as global
    private: static int class_private; // but public to all methods in class

    private: static void method() {
        static int method_private; // but public to all scopes in method
        // ...
        {
            static int scope1_private; // mutex guarded
            int the_only_truly_private_data;
        }
        // ...
        {
            static int scope2_private; // mutex guarded
        }
    }
}

1

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

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


0

বিভিন্ন পার্থক্য রয়েছে:

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

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

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

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


0

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

উদাহরণস্বরূপ, এইচটিটিপি সার্ভারটি সার্ভারের নাম সংরক্ষণ করে বিবেচনা করুন।

আপনি যদি বিশ্বব্যাপী সার্ভারের নামটি সঞ্চয় করেন তবে প্রক্রিয়াটি একই সাথে দুটি পৃথক সার্ভার নামের জন্য যুক্তি চালাতে পারে না। সম্ভবত আসল নকশাটি একবারে একাধিক সার্ভারের দৌড়ের কথা ভাবেনি তবে আপনি যদি পরে সিদ্ধান্ত নেন আপনি এটি করতে চান তবে সার্ভারের নাম বিশ্বব্যাপী থাকলে আপনি কেবল তা করতে পারবেন না।

বিপরীতে, যদি সার্ভারের নামটি একটি ডাটাবেসে থাকে তবে কোনও সমস্যা নেই। আপনি কেবল HTTP সার্ভারের প্রতিটি উদাহরণের জন্য সেই ডাটাবেসের একটি উদাহরণ তৈরি করতে পারেন। যেহেতু সার্ভারের প্রতিটি উদাহরণের ডাটাবেসের নিজস্ব উদাহরণ রয়েছে, এটির নিজস্ব সার্ভারের নাম থাকতে পারে।

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


0

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

এর অন্য দিকটি ভাগ করা রাষ্ট্র। আমি নিশ্চিত নই যে বিশ্বজুড়ে ভাগ করা রাষ্ট্র এবং সাধারণভাবে ভাগ করা রাষ্ট্রের মধ্যে সত্যই স্পষ্ট পার্থক্য রয়েছে তবে ব্যয় এবং সুবিধাগুলি আরও অনেক বেশি প্রয়োজন। সহজভাবে বলতে গেলে এখানে असंख्य সফটওয়্যার সিস্টেম রয়েছে যার জন্য ভাগ করে নেওয়া রাষ্ট্রের প্রয়োজন require উদাহরণস্বরূপ, বিটকয়েন হ'ল বিশ্বব্যাপী (আক্ষরিক) একটি বিকেন্দ্রীভূত পদ্ধতিতে রাষ্ট্র ভাগ করে নেওয়ার একটি খুব চালাক। বিরাট বাধা তৈরি না করে সঠিকভাবে পরিবর্তনীয় স্থিতি ভাগ করে নেওয়া কঠিন তবে দরকারী useful সুতরাং আপনার যদি সত্যিই এটির প্রয়োজন না হয়, আপনি ভাগ করে নেওয়া পরিবর্তনীয় স্থিতি হ্রাস করে আপনার অ্যাপ্লিকেশনটিকে সহজতর করতে পারেন।

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


0

আমি এ সম্পর্কে কিছুটা আলাদাভাবে ভাবব: "গ্লোবাল ভেরিয়েবল" এর মতো আচরণ হ'ল দাম ডাটাবেস প্রশাসক (ডিবিএ) দ্বারা প্রদত্ত একটি মূল্য কারণ তাদের কাজটি করা একটি প্রয়োজনীয় মন্দ।

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

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

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

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

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

আপনি কি বরং ভাঙা কাচের উপর ঘুরে বেড়াবেন, বা সুন্দরভাবে বয়ে যাওয়া ফুটপাতগুলিতে, অন্য সমস্ত জিনিস সমান হলে? হ্যাঁ, আপনি ভাঙা কাঁচের উপর হাঁটতে পারেন। হ্যাঁ, কিছু লোক এমনকি এটি করে জীবিকা নির্বাহ করে। তবে তবুও, তাদের কেবল ফুটপাতটি ঝাড়িয়ে এগিয়ে চলুন!


0

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

পার্থক্যটি পরিমাপ করা সহজ: আপনি কোডটিতে আক্রমণাত্মক পরিবর্তন না করেই কোনও প্রোগ্রাম / প্রসেসে নিজের প্রোগ্রামের লজিকের দুটি উদাহরণ চালিয়ে যেতে পারেন? যদি তা হয় তবে আপনার ডাটাবেসটি আসলে "গ্লোবাল স্টেট" নয়।


-2

গ্লোবালগুলি মন্দ নয়; তারা কেবল একটি সরঞ্জাম। অন্য কোনও প্রোগ্রামিং বৈশিষ্ট্যের অপব্যবহারের মতো গ্লোবালগুলির মিসস সমস্যাযুক্ত।

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


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

-2

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

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