আর্দুইনোতে কি বৈশ্বিক ভেরিয়েবলগুলি মন্দ?


24

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

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

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

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


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

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

11
@ লুকআল্টারনো: "আমি এড়াতে" এবং "আপনি পারবেন না" খুব আলাদা জিনিস।
মনিকার সাথে লাইটনেস রেস

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

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

উত্তর:


33

সেগুলি প্রতি সেজে মন্দ নয় , তবে তাদের ব্যবহার করার কোনও ভাল কারণ নেই সেখানে তারা অতিরিক্ত ব্যবহার করার প্রবণতা পোষণ করে।

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

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

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

সুতরাং না, তারা মন্দ নয় এবং একটি আরডিনোতে তাদের পিসির চেয়ে আরও ভাল এবং ভাল ব্যবহার রয়েছে uses


ঠিক আছে, যদি আমি এমন কিছু ব্যবহার করি যা কেবলমাত্র loop()(বা একাধিক ফাংশনে ডাকা হয় loop()) using শুরুতে এগুলি সংজ্ঞায়নের চেয়ে আলাদাভাবে সেট আপ করা কি ভাল?
এটি-এংজি

1
staticসেক্ষেত্রে আমি সম্ভবত তাদের লুপে সংজ্ঞায়িত করব () (সম্ভবত তাদের পুনরুক্তি জুড়ে তাদের মান বজায় রাখার জন্য আমার প্রয়োজন ছিল) এবং তাদেরকে কল শৃঙ্খলে নীচে ফাংশন পরামিতিগুলি দিয়ে যেতে হবে।
মাজেঙ্কো

2
এটি একটি উপায়, বা এটি রেফারেন্স হিসাবে পাস করুন: void foo(int &var) { var = 4; }এবং foo(n);- nএখন 4
মাজনকো

1
ক্লাসগুলি স্ট্যাক-বরাদ্দ করা যেতে পারে। স্বীকার করা, স্ট্যাকের উপর বড় উদাহরণ স্থাপন করা ভাল নয়, তবে এখনও।
জ্যাব

1
@ জ্যাব যে কোনও কিছু বরাদ্দ করা যেতে পারে।
মাজেঙ্কো

18

আপনার আসল কোডটি না দেখে একটি নির্দিষ্ট উত্তর দেওয়া খুব কঠিন।

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

আমার কাছে বর্তমানে [কোড] এর প্রায় 1100 লাইনের জন্য 46 টি গ্লোবাল রয়েছে। এটি কি ভাল অনুপাত [...]

সংখ্যা সম্পর্কে নয়। আপনার নিজের থেকে সঠিক প্রশ্নটি জিজ্ঞাসা করা উচিত, এই গ্লোবালগুলির প্রত্যেকের জন্য, এটি বিশ্বব্যাপী সুযোগে থাকার বিষয়টি কি বোধগম্য।

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


1
ঠিক আছে! আমি জানতাম না staticযে আমার একটি ভেরিয়েবল রয়েছে যা কেবলমাত্র একটি ফাংশনে ব্যবহৃত হয় তবে প্রতিবার কোনও ফাংশন বলা হওয়ার সাথে সাথে (যেমন var=millis()) নতুন মান পাওয়া যায় আমি কি এটি তৈরি করব static?
এটি-এংজি

3
নং staticকেবল তখনই যখন আপনার মানটি রাখা দরকার for আপনি যদি ফাংশনে প্রথম কাজটি করেন তবে চলকটির মান বর্তমান সময়ের সাথে সেট করা হয় তবে পুরানো মান রাখার দরকার নেই। স্থিতিশীল যে পরিস্থিতিটি যা করে তা স্মৃতিশক্তি নষ্ট করে।
অ্যান্ড্রু

এটি গ্লোবালগুলির পক্ষে এবং সংশয়বাদ উভয় পয়েন্টই প্রকাশ করে এটি একটি খুব সুস্পষ্ট উত্তর। +1
আন্ডারস্কোর_১

6

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

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

সি তে নেমস্পেসগুলি অনুকরণ করার একটি দরিদ্র উপায়:

static struct {
    int motor1, motor2;
    bool sensor;
} arm;

ইন্টেল বা আর্ম প্রসেসরে, গ্লোবাল ভেরিয়েবলের অ্যাক্সেস অন্যান্য ভেরিয়েবলগুলির চেয়ে ধীর। এটি সম্ভবত আরডুইনোর বিপরীতে।


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

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

5

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

  • কোনও গতিশীল মেমরির ব্যবহার নেই (একটি আরডুইনোর সীমাবদ্ধ হিপ স্পেসে ফাঁক তৈরি করে)
  • সর্বত্র উপলব্ধ, সুতরাং তাদের আর্গুমেন্ট হিসাবে পাস করার প্রয়োজন নেই (যার জন্য দামের স্ট্যাকের দাম)

এছাড়াও, কিছু ক্ষেত্রে, বিশেষত পারফরম্যান্স-ভিত্তিতে প্রয়োজনীয়তার সময় উপাদান তৈরি করার পরিবর্তে বৈশ্বিক চলকগুলি ব্যবহার করা ভাল:

  • গাদা স্থানে ফাঁক হ্রাস করতে
  • গতিশীলভাবে বরাদ্দ এবং / বা মেমরি মুক্ত করার ক্ষেত্রে যথেষ্ট সময় নিতে পারে
  • ভেরিয়েবলগুলি 'পুনঃব্যবহৃত' হতে পারে, বৈশ্বিক তালিকার উপাদানগুলির তালিকার মতো যা একাধিক কারণে ব্যবহৃত হয়, যেমন একবার এসডির জন্য বাফার হিসাবে এবং পরে অস্থায়ী স্ট্রিং বাফার হিসাবে।

5

সমস্ত কিছুর সাথে (গোটোস ছাড়া যা সত্যই মন্দ) গ্লোবালগুলির নিজস্ব জায়গা রয়েছে।

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

অন্যরা যেমন বলেছে 46 কেবল কোডের 1000 লাইনের বেশি মনে হয় তবে আপনি কী করছেন তার বিশদ না জেনেও আপনি এগুলি ব্যবহার করছেন বা না করছেন তা বলা শক্ত।

তবে প্রতিটি বিশ্বব্যাপী নিজেকে কিছু গুরুত্বপূর্ণ প্রশ্ন জিজ্ঞাসা করুন:

নামটি কি স্পষ্ট এবং সুনির্দিষ্ট যাতে আমি দুর্ঘটনাক্রমে অন্য কোথাও একই নামটি ব্যবহার করার চেষ্টা না করি? নাম পরিবর্তন না হলে।

এটি কি কখনও বদলাতে হবে? যদি তা না হয় তবে এটিকে কনস্ট করে তোলার কথা বিবেচনা করুন।

এটি কি সর্বত্র দৃশ্যমান হওয়া দরকার বা এটি কেবল বিশ্বব্যাপী যাতে ফাংশন কলগুলির মধ্যে মান বজায় থাকে? তাই কী এটি এটিকে স্থানীয়ভাবে তৈরি করা এবং কীওয়ার্ড স্ট্যাটিক ব্যবহারের বিষয়টি বিবেচনা করে।

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

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


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

আপনার যদি মনে gotoহয় এটি খারাপ, লিনাক্স কোডটি দেখুন। যুক্তিযুক্তভাবে, এগুলি try...catchযখন ব্যবহার করা হয় তখন ব্লকের মতোই দুষ্ট ।
দিমিত্রি গ্রিগরিয়েভ

5

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

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

নিম্নলিখিত চিত্র:

int main() {
  setup();

  while (true) {
    loop();
  }
  return 0;
}

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

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

int main() {
  int myVariable = 0;
  setup(&myVariable);

  while (true) {
    loop(&myVariable);
  }
  return 0;
}

নোট করুন যে এই ক্ষেত্রে আপনার উভয় ফাংশনের স্বাক্ষরও পরিবর্তন করতে হবে।

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

আমি যদি সঠিকভাবে স্মরণ করি তবে আপনি সি এর চেয়ে আরডুইনোর জন্য প্রোগ্রাম করার সময় সি ++ ব্যবহার করতে পারছেন তবে আপনি যদি ওওপি (অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং) বা সি ++ এর সাথে পরিচিত না হন তবে এটি কিছুটা অভ্যস্ত হয়ে যেতে পারে এবং কিছু পড়া চালিয়ে যান।

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

নিম্নলিখিত উদাহরণ প্রোগ্রাম বিবেচনা করুন:

class Program {
public:      
  Program();

  void setup();
  void loop();

private:
  int myFirstSampleVariable;
  int mySecondSampleVariable;
};

Program::Program() :
  myFirstSampleVariable(0),
  mySecondSampleVariable(0)
{

}

void Program::setup() {
  // your setup code goes here
}

void Program::loop() {
  // your loop code goes here
}

Program program; // your single global

void setup() {
  program.setup();
}

void loop() {
  program.loop();
}

ভাল, আমরা প্রায় সমস্ত গ্লোবাল থেকে নিজেকে মুক্তি পেয়েছি। ফাংশন যার মাধ্যমে আপনি আপনার আবেদন যুক্তিবিজ্ঞান যোগ হবে শুরু করবেন Program::setup()এবং Program::loop()ফাংশন। এই ফাংশনগুলির উদাহরণ নির্দিষ্ট সদস্য ভেরিয়েবলগুলিতে অ্যাক্সেস রয়েছে myFirstSampleVariableএবং mySecondSampleVariableপ্রথাগত setup()এবং loop()ফাংশনগুলিতে অ্যাক্সেস নেই কারণ এই ভেরিয়েবলগুলি শ্রেণি ব্যক্তিগত হিসাবে চিহ্নিত করা হয়েছে। এই ধারণাকে ডেটা এনক্যাপসুলেশন বা ডেটা লুকানো বলা হয়।

আপনাকে ওওপি এবং / অথবা সি ++ শেখানো এই প্রশ্নের উত্তরের সুযোগের বাইরে কিছুটা হলেও আমি এখানেই থামব।

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

সর্বাধিক গুরুত্বপূর্ণ আমি আশা করি আমার উত্তরটি আপনার জন্য কিছুটা কার্যকর হবে :)


আপনি যদি পছন্দ করেন তবে আপনার নিজের প্রধান () স্কেচে সংজ্ঞায়িত করতে পারেন। স্টকটি দেখতে একটিকে দেখতে দেখতে পাওয়া যায়: github.com/arduino/Ardino/blob/1.8.3/hardware/arduino/avr/…
1212

একটি সিঙ্গলটন কার্যকরভাবে একটি বিশ্বব্যাপী, কেবল একটি অতিরিক্ত বিভ্রান্তিকর উপায়ে সজ্জিত। এটি একই ডাউনসাইডস আছে।
প্যাটস্টি

@ প্যাটস্টিউ আপনার কীভাবে মনে হচ্ছে এটির একই উত্থানটি কেমন? আমার মতে এটি যেহেতু আপনি আপনার উপকারে ডেটা এনক্যাপসুলেশন ব্যবহার করতে সক্ষম হচ্ছেন না।
আরজেন

@ per1234 ধন্যবাদ! আমি অবশ্যই কোনও আরডিনো বিশেষজ্ঞ নই, তবে আমি মনে করি আমার প্রথম পরামর্শটি তখনও কার্যকর হতে পারে।
আরজেন

2
ঠিক আছে, এটি এখনও বিশ্বব্যাপী রাষ্ট্র যা প্রোগ্রামের যে কোনও জায়গায় অ্যাক্সেস করা যায়, আপনি কেবল এর Program::instance().setup()পরিবর্তে এটি অ্যাক্সেস করতে পারেন globalProgram.setup()। সম্পর্কিত গ্লোবাল ভেরিয়েবলগুলি একটি শ্রেণি / স্ট্রাক্ট / নেমস্পেসে স্থাপন করা উপকারী হতে পারে, বিশেষত যদি সেগুলি কেবলমাত্র কয়েকটি সম্পর্কিত ফাংশন দ্বারা প্রয়োজন হয় তবে সিঙ্গলটন প্যাটার্নটি কিছুই যোগ করে না। অন্য কথায় static Program p;বিশ্বব্যাপী স্টোরেজ রয়েছে এবং static Program& instance()এটির বিশ্বব্যাপী অ্যাক্সেস রয়েছে, যা সরল হিসাবে একই পরিমাণ Program globalProgram;
প্যাটস্টিউ

4

গ্লোবাল ভেরিয়েবল কখনও খারাপ হয় না । তাদের বিরুদ্ধে একটি সাধারণ নিয়ম আপনাকে আরও দীর্ঘকাল বেঁচে থাকার জন্য আরও ভাল সিদ্ধান্ত নেওয়ার অভিজ্ঞতা অর্জনের জন্য একটি ক্রাচ।

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

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

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

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

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


0

গ্লোবাল ভেরিয়েবলগুলি কি আরডুইনোতে খারাপ?

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

এছাড়াও গ্লোবালের সংখ্যা আরও কমাতে আমি কী অনুশীলনগুলিতে নিয়োগ করতে পারি?

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


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