সি এর মধ্যে নির্বিচারে ব্লক এর idiomatic ব্যবহার কি?


15

একটি ব্লক কার্যকর করা হবে বিবৃতি তালিকা। সিতে ব্লকগুলি কোথায় আসে তার উদাহরণগুলি কিছুক্ষণ বিবৃতি দেওয়ার পরে এবং যদি বিবৃতিগুলিতে হয়

while( boolean expression)
    statement OR block

if (boolean expression)
    statement OR block

সি কোনও ব্লকে কোনও ব্লকে বাসা বাঁধার অনুমতি দেয়। পরিবর্তনশীল নামগুলি পুনরায় ব্যবহার করতে আমি এটি ব্যবহার করতে পারি, ধরুন আমি সত্যিই 'এক্স' পছন্দ করি

int x = 0;
while (x < 10)
{
    {
        int x = 5;
        printf("%d",x)
    }
    x = x+1;
}

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


1
সত্য, আমি কেবল সি বাক্য গঠন বুঝতে চেষ্টা করছি, এবং কৌতূহলী।
জোনাথন গ্যালাগার

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

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

মজার সময়, একটি নন-সি প্রোগ্রামার হিসাবে আমি আজ সি কোডটিতে এই বাক্য গঠনটি পেরিয়ে হোঁচট খেয়েছি এবং কৌতূহল ছিল কী এর জন্য। আপনি খুশি আমি খুশি।
ব্র্যান্ডন

উত্তর:


8

ধারণাটি ভেরিয়েবলের নাম কম রাখার বা অন্যথায় নামের পুনরায় ব্যবহারকে উত্সাহিত করার নয়, বরং ভেরিয়েবলের পরিধি সীমাবদ্ধ করার জন্য। যদি তোমার থাকে:

int x = 0;
//...
{
    int y = 3;
    //...
}
//...

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


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

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

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

16

কারণ সি'র পুরানো দিনগুলিতে কেবলমাত্র একটি নতুন ব্লকে ঘোষিত হতে পারে declared

এইভাবে প্রোগ্রামাররা কোনও ফাংশনটির ফাঁকে ফাঁস না দিয়ে এবং স্ট্যাকের ব্যবহারকে হ্রাস না করে মাঝখানে নতুন ভেরিয়েবলগুলি প্রবর্তন করতে পারে।

আজকের অপ্টিমাইজারের সাহায্যে এটি অকেজো এবং এটি একটি চিহ্ন যা আপনাকে নিজের ফাংশনে ব্লকটি বের করার বিষয়ে বিবেচনা করতে হবে।

একটি স্যুইচ বিবৃতিতে, ডাবল ঘোষণা এড়াতে কেসগুলি তাদের নিজস্ব ব্লকগুলিতে সংযুক্ত করা কার্যকর।

সি ++ এ এটি উদাহরণস্বরূপ RAII লক প্রহরীদের জন্য কার্যকর এবং কার্যকরকারী সুযোগের বাইরে চলে গেলে এবং সমালোচনামূলক বিভাগের বাইরে অন্য জিনিসগুলি করার পরে ধ্বংসকারীরা মুক্তির লকটি চালানো নিশ্চিত করে।


2
আরআইআই লক প্রহরীদের জন্য +1। বলা হচ্ছে, এই একই ধারণাটি কি কোনও রুটিনের অংশগুলির মধ্যে বৃহত-ইস্ক স্ট্যাক বাফার অবনতির জন্য কার্যকর হতে পারে? আমি এটি কখনই করি নি, তবে এমন কিছু শোনায় যা অবশ্যই কিছু এম্বেডেড কোডে ঘটতে পারে ...
জে ট্রানা

2

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

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

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


1
দুর্ভাগ্যক্রমে আমি নিয়মিত একা দাঁড়িয়ে থাকি দেখি - প্রায় সব ক্ষেত্রেই কারণ ফাংশনটি অনেক বেশি করছে এবং / বা খুব দীর্ঘ।
mattnz

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

2

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

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

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


1

মধ্যস্থতাকারী ব্লকগুলি মধ্যবর্তী ভেরিয়েবলগুলি প্রবর্তন করতে দরকারী যা কেবলমাত্র একটি গণনার বিশেষ ক্ষেত্রে ব্যবহৃত হয়।

এটি বৈজ্ঞানিক কম্পিউটিংয়ের একটি সাধারণ প্যাটার্ন, যেখানে সংখ্যার পদ্ধতিগুলি সাধারণত:

  1. প্রচুর পরামিতি বা মধ্যস্থতাকারীর পরিমাণের উপর নির্ভর করুন;
  2. অনেক বিশেষ ক্ষেত্রে মোকাবেলা করতে হবে।

দ্বিতীয় দফার কারণে, এটি সীমাবদ্ধ সুযোগের অস্থায়ী পরিবর্তনশীলগুলি উপস্থাপন করতে দরকারী, যা একটি স্বেচ্ছাসেবক ব্লক ব্যবহার করে বা সহায়ক ফাংশন প্রবর্তন করে ঝাঁকুন অর্জন করে।

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

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

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

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

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


0

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

আমি দেখতে পেলাম যে ম্যাক্রো বিস্তারে নেস্টেড ব্লকগুলির ব্যবহার পরিবর্তনশীল নামকরণের সংঘর্ষ প্রতিরোধের জন্য কীভাবে কার্যকর হবে।


0

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

switch(foo) {
   case 1:
      {
         // bar
      }
   case 2:
   case 3:
      // baz
      break;
   case 4:
   case 5:
      // bang
      break;
}

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

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

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

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