অভ্যন্তরীণ স্কোপ ব্লকগুলির ব্যবহারটি কোনও ফাংশন খারাপ শৈলীর মধ্যে রয়েছে?


10

এমন কয়েকটি (বেশ বিরল) ঘটনা রয়েছে যেখানে এর ঝুঁকি রয়েছে:

  • একটি ভেরিয়েবল পুনরায় ব্যবহার করা যা পুনরায় ব্যবহারের উদ্দেশ্যে নয় (উদাহরণ 1 দেখুন),

  • বা অন্যটির পরিবর্তে কোনও ভেরিয়েবল ব্যবহার করে শব্দার্থগতভাবে বন্ধ করুন (উদাহরণ 2 দেখুন)।

উদাহরণ 1:

var data = this.InitializeData();
if (this.IsConsistent(data, this.state))
{
    this.ETL.Process(data); // Alters original data in a way it couldn't be used any longer.
}

// ...

foreach (var flow in data.Flows)
{
    // This shouldn't happen: given that ETL possibly altered the contents of `data`, it is
    // not longer reliable to use `data.Flows`.
}

উদাহরণ 2:

var userSettingsFile = SettingsFiles.LoadForUser();
var appSettingsFile = SettingsFiles.LoadForApp();

if (someCondition)
{
    userSettingsFile.Destroy();
}

userSettingsFile.ParseAndApply(); // There is a mistake here: `userSettingsFile` was maybe
                                  // destroyed. It's `appSettingsFile` which should have
                                  // been used instead.

একটি সুযোগ প্রবর্তন করে এই ঝুঁকি হ্রাস করা যেতে পারে:

উদাহরণ 1:

// There is no `foreach`, `if` or anything like this before `{`.

{
    var data = this.InitializeData();
    if (this.IsConsistent(data, this.state))
    {
        this.ETL.Process(data);
    }
}

// ...

// A few lines later, we can't use `data.Flows`, because it doesn't exist in this scope.

উদাহরণ 2:

{
    var userSettingsFile = SettingsFiles.LoadForUser();

    if (someCondition)
    {
        userSettingsFile.Destroy();
    }
}

{
    var appSettingsFile = SettingsFiles.LoadForApp();

    // `userSettingsFile` is out of scope. There is no risk to use it instead of
    // `appSettingsFile`.
}

এটি কি ভুল দেখাচ্ছে? আপনি কি এমন সিনট্যাক্স এড়াতে পারবেন? নতুনদের দ্বারা বুঝতে অসুবিধা হয়?


7
আপনি কি যুক্তি দিতে পারেন যে প্রতিটি স্বতন্ত্র "স্কোপ ব্লক" এর পরিবর্তে তার নিজস্ব পদ্ধতি বা ফাংশন হওয়া উচিত?
ড্যান পিচেলম্যান

আমি বলব "প্রায়শই" তেমন কার্যকরভাবে প্রয়োগ করা হয় নি (তবে সম্ভবত "নকশা" সমস্যা নয়)। কখনও কখনও ডিজাইন দ্বারা, এটি অনিবার্য (উদাহরণস্বরূপ ব্যতিক্রম / সংস্থান স্কোপিং)।
জাস্টিনসি

উত্তর:


35

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

কিছু ব্যক্তিগত অভিজ্ঞতার দ্বারা এটি ব্যাক আপ করার জন্য: কয়েক বছর আগে আমি of 150K কোডের কোড সহ একটি সি ++ লেগ্যাসি প্রকল্প উত্তরাধিকার সূত্রে পেয়েছি এবং এতে ঠিক এই কৌশলটি ব্যবহার করে কয়েকটি পদ্ধতি রয়েছে। এবং অনুমান করুন - এই সমস্ত পদ্ধতি খুব দীর্ঘ ছিল। যেহেতু আমরা বেশিরভাগ কোডটি রিফ্যাক্টর করেছিলাম, পদ্ধতিগুলি আরও ছোট এবং ছোট হয়ে গেছে, এবং আমি নিশ্চিত যে আমি "অভ্যন্তরীণ সুযোগ" বাকী আর কোনও অবশিষ্ট নেই; তাদের সহজভাবে প্রয়োজন হয় না।


4
তবে কেন খারাপ? অনেক নামকরণের কাজ করাও বিভ্রান্তিকর।
ক্রিস ভ্যান বায়েল

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

10
@ ক্রিসভ্যানবেল: "অনেক নামকরণের কাজ করাও বিভ্রান্তিকর" - যদি আপনি বর্ণনামূলক নাম ব্যবহার করেন তবে একেবারে বিপরীতটি সত্য। কীভাবে কোড বজায় রাখা শক্ত হয় এবং এমনকি কিছুটা শক্তও হয়ে যায় তার সর্বাধিক কারণ খুব বেশি কার্যকারিতা তৈরি করা।
ডক ব্রাউন

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

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

3

একজন শিক্ষানবিশ (এবং যে কোনও প্রোগ্রামার) এর জন্য এটি ভাবতে অনেক সহজ:

  • প্রাসঙ্গিক নয় এমন একটি চলক ব্যবহার না করা

ভাবার চেয়ে:

  • প্রাসঙ্গিক নয় এমন ভেরিয়েবল ব্যবহার না করা থেকে নিজেকে আটকাতে কোড স্ট্রাকচার যুক্ত করা।

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


2

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


0

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

সি # তে ওটিওএইচ-এর একটি নির্দিষ্ট দৃশ্য রয়েছে, যখন তারা পপআপের দিকে ঝোঁক দেয় - এটি যখন স্যুইচ-কেস কনস্ট্রাক্টস ব্যবহার করে। পরিস্থিতিটি খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে: সি # কোঁকড়ানো বন্ধনীগুলির সাথে / ছাড়াই বিবৃতি পরিবর্তন করুন… পার্থক্য কী?

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