কাস্টম ব্লক: স্টাইল গাইড

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

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

1. শর্তাবলী বনাম লুপ

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

সুপারিশ: শর্তসাপেক্ষ এবং লুপ আলাদা রাখুন।

2. এক-ভিত্তিক তালিকা

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

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

সুপারিশ: এক হল প্রথম সংখ্যা।

3. ব্যবহারকারীর ইনপুট

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

সুপারিশ: আপনার ব্যবহারকারীদের জন্য উপযুক্ত একটি ইনপুট পদ্ধতি চয়ন করুন।

4. লাইভ ব্লক ইমেজ

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

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

প্রস্তাবনা: আপনি যদি একাধিক ভাষা সমর্থন করেন তবে শুধুমাত্র পঠন মোড ব্যবহার করুন।

5. আপনার অন্য বাম

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

সুপারিশ: যেখানে সম্ভব ইউনিকোড আইকন সহ পাঠ্যের পরিপূরক।

6. উচ্চ-স্তরের ব্লক

যেখানেই সম্ভব একটি উচ্চ-স্তরের পন্থা অবলম্বন করা উচিত, এমনকি যদি এটি কার্যকরী কর্মক্ষমতা বা নমনীয়তা হ্রাস করে। এই অ্যাপস স্ক্রিপ্ট এক্সপ্রেশন বিবেচনা করুন:

SpreadsheetApp.getActiveSheet().getDataRange().getValues()

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

সুপারিশ: অন্ধভাবে আপনার সম্পূর্ণ API কে ব্লকে রূপান্তর করবেন না।

7. ঐচ্ছিক রিটার্ন মান

পাঠ্য-ভিত্তিক প্রোগ্রামিং-এ অনেক ফাংশন একটি ক্রিয়া সম্পাদন করে, তারপর একটি মান প্রদান করে। এই রিটার্ন মান ব্যবহার করা যেতে পারে বা নাও হতে পারে। একটি উদাহরণ হল একটি স্ট্যাকের pop() ফাংশন। শেষ উপাদানটি পেতে এবং অপসারণ করতে পপকে কল করা হতে পারে, অথবা রিটার্ন মান উপেক্ষা করে শেষ উপাদানটি সরাতে বলা হতে পারে।

var last = stack.pop();  // Get and remove last element.
stack.pop();  // Just remove last element.

ব্লক-ভিত্তিক ভাষাগুলি সাধারণত একটি রিটার্ন মান উপেক্ষা করার জন্য ভাল নয়। একটি মান ব্লককে এমন কিছুতে প্লাগ করতে হবে যা মানটি গ্রহণ করে। এই সমস্যাটি মোকাবেলা করার জন্য বেশ কয়েকটি কৌশল রয়েছে।

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

খ) দুটি ব্লক প্রদান করুন। যদি টুলবক্সে স্থান একটি সমস্যা না হয়, একটি সহজ সমাধান হল এই ধরনের প্রতিটি ব্লকের দুটি প্রদান করা, একটি রিটার্ন মান ছাড়াই। নেতিবাচক দিক হল যে এটি প্রায় অভিন্ন ব্লকের সাথে একটি বিভ্রান্তিকর টুলবক্সের দিকে নিয়ে যেতে পারে।

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

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

প্রস্তাবনা: প্রতিটি কৌশলের সুবিধা এবং অসুবিধা রয়েছে, আপনার ব্যবহারকারীদের জন্য কী সঠিক তা বেছে নিন।

8. ক্রমবর্ধমান ব্লক

কিছু ব্লকের জন্য পরিবর্তনশীল সংখ্যক ইনপুট প্রয়োজন হতে পারে। উদাহরণ হল একটি সংযোজন ব্লক যেটি সংখ্যার একটি নির্বিচারে সেট, অথবা একটি if/elseif/else ব্লকের সাথে elseif ক্লজের একটি নির্বিচারে সেট, অথবা একটি তালিকা কনস্ট্রাক্টর যার ইচ্ছামত সংখ্যার প্রাথমিক উপাদান রয়েছে। বেশ কয়েকটি কৌশল রয়েছে, যার প্রত্যেকটির সুবিধা এবং অসুবিধা রয়েছে।

ক) সহজ পদ্ধতি হল ব্যবহারকারীকে ছোট ব্লক থেকে ব্লক রচনা করা। একটি উদাহরণ হল দুটি দুই-সংখ্যার সংযোজন ব্লক বাসা বাঁধার মাধ্যমে তিনটি সংখ্যা যোগ করা হবে। আরেকটি উদাহরণ হল শুধুমাত্র if/else ব্লক প্রদান করা এবং ব্যবহারকারীকে elseif শর্ত তৈরি করার জন্য নেস্ট করা।

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

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

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

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

এই কৌশলটি প্রতি ব্লকে মাত্র দুটি বোতাম থেকে শুরু করে সারিতে চারটি বোতাম পর্যন্ত বিকল্পের একটি বর্ণালী। এক প্রান্তে এমন বিপদ যে ব্যবহারকারীরা তাদের প্রয়োজনীয় ক্রিয়া সম্পাদন করতে সক্ষম হয় না, অন্য প্রান্তে UI বোতামে এতটাই পূর্ণ যে এটি স্টারশিপ এন্টারপ্রাইজের সেতুর মতো দেখায়।

ঘ) সবচেয়ে নমনীয় পদ্ধতি হল ব্লকে একটি মিউটেটর বুদবুদ যোগ করা। এটি একটি একক বোতাম হিসাবে উপস্থাপন করা হয় যা সেই ব্লকের জন্য একটি কনফিগারেশন ডায়ালগ খোলে। উপাদান যোগ করা যেতে পারে, মুছে ফেলা, বা ইচ্ছামত পুনর্বিন্যাস.

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

প্রস্তাবনা: প্রতিটি কৌশলের সুবিধা এবং অসুবিধা রয়েছে, আপনার ব্যবহারকারীদের জন্য কী সঠিক তা বেছে নিন।

9. ক্লিন কোড জেনারেশন

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

প্রস্তাবনা: আপনার জেনারেট করা কোড নিয়ে গর্বিত হোন। এটি ব্যবহারকারীকে দেখান।

10. ভাষা নির্ভরতা

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

প্রস্তাবনা: ব্লকলি একটি ভাষা নয়, বিদ্যমান ভাষাকে আচরণকে প্রভাবিত করার অনুমতি দিন।