কোনও পদ্ধতি মিথ্যা প্রত্যাবর্তন করে কিনা তা খতিয়ে দেখা হচ্ছে: অস্থায়ী পরিবর্তনশীলকে ফলাফল নির্ধারণ করুন, অথবা পদ্ধতি শর্তে সরাসরি অনুরোধ করুন?


9

যদি কোনও বিবৃতিতে সত্য বা মিথ্যা মানগুলি ফেরত দেয় এমন কোনও কল করা কি ভাল অনুশীলন?

এটার মতো কিছু:

private void VerifyAccount()
{
    if (!ValidateCredentials(txtUser.Text, txtPassword.Text))
    {
        MessageBox.Show("Invalid user name or password");
    }
}

private bool ValidateCredentials(string userName, string password)
{
    string existingPassword = GetUserPassword(userName);
    if (existingPassword == null)
        return false;

    var hasher = new Hasher { SaltSize = 16 };
    bool passwordsMatch = hasher.CompareStringToHash(password, existingPassword);

    return passwordsMatch;
}

অথবা এগুলিকে কোনও ভেরিয়েবলে সংরক্ষণ করা ভাল তবে এর চেয়ে অন্য মানগুলি ব্যবহার করে তাদের তুলনা করুন

bool validate = ValidateCredentials(txtUser.Text, txtPassword.Text);
if(validate == false){
    //Do something
}

আমি কেবল নেট নেটকেই উল্লেখ করছি না, আমি সমস্ত প্রোগ্রামিং ভাষায় প্রশ্নটি উল্লেখ করছি ঠিক তাই ঘটে যা হয় আমি একটি উদাহরণ হিসাবে নেট ব্যবহার করি N


3
আপনি যদি একটি অস্থায়ী পরিবর্তনশীল ব্যবহার করেন তবে if (!validate)তার চেয়ে লিখুন if (validate == false)
ফিলিপ

12
আমি ফাংশনটির নাম "শংসাপত্রগুলি আরিভালিড ()" এর মতো রাখব যাতে আপনি জানেন যে এটি একটি প্রত্যাবর্তন ফিরিয়ে নেওয়া উচিত তবে অন্যথায় হ্যাঁ এর ভাল অনুশীলন
জাকারি কে

3
IsValidCredentialsব্যাকরণগতভাবে বিশ্রী হলেও এটি বুলিয়ান রিটার্ন মানকে নির্দেশ করার জন্য একটি সাধারণ ফর্ম্যাট।
zzzzBov

@ ফিলিপ যদি (! বৈধকরণ) এবং এটি (বৈধকরণ) এর মধ্যে পার্থক্য কি ??
কিয়েলজেএমডি

!এটি "নট" অপারেটর, এটি কোনও বুলিয়ান এক্সপ্রেশনকে তুচ্ছ করে। তাই if (!validate)বিপরীত if (validate)। যদি validateসত্য না হয় তবে if স্টেটমেন্টটি প্রবেশ করানো হবে ।
ফিলিপ

উত্তর:


26

এই সমস্ত জিনিস যেমন এটি নির্ভর করে।

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

কোডটি পরিমাপযোগ্যভাবে কম কার্যকর হতে যাচ্ছে না।


1
এটা কি পাঠযোগ্য? আমি উপরে
যেমনটি করেছি

@ কাইলজেএমডি: এটি আপনি যে সংস্কৃতিতে প্রোগ্রামিং করছেন তার উপর নির্ভর করে the যে জায়গাগুলিতে আমি প্রোগ্রাম করেছি !ValidateCredentialsসেখানে আরও পাঠযোগ্য, কারণ এটি কোডে কী করছে তা স্পষ্টভাবে বলে। এটা খুব পরিষ্কার। আপনি যে ফাংশনটিতে কল করছেন তার যদি "স্ব-ডকুমেন্টিং" নাম না থাকে তবে ভেরিয়েবলটি দিয়ে যাওয়া আরও ভাল। যেমনটি দাঁড়িয়েছে, আমি ভেরিয়েবলটি বাদ দেওয়ার প্রস্তাব দিই এবং নিজের কাছে থাকা স্ব-ডকুমেন্টিং কোডের সাথে থাকব।
জোয়েল ইথারটন

ভ্যালিডেট ক্রেনডেনসিয়ালগুলি প্রথম স্থানে পাঠযোগ্য নয় - নামটি কীভাবে আপনাকে ফলাফলের অর্থ বলে? শংসাপত্রগুলিআরভালিড বা শংসাপত্রগুলিইরেইনডিয়াল এর চেয়ে অনেক ভাল।
gnasher729

9

অতিরিক্ত পরিবর্তনশীল কেন ব্যবহার করবেন? আমি প্রথম পদ্ধতির ব্যবহার পছন্দ করি, এটি আরও পাঠযোগ্য এবং সহজ simple


4

যদি কোনও বিবৃতিতে সত্য বা মিথ্যা মানগুলি ফেরত দেয় এমন কোনও কল করা কি ভাল অনুশীলন?

হ্যাঁ, শর্তসাপেক্ষে যদি ইনলাইন করার পক্ষে যথেষ্ট সহজ না হয় এবং এটি পড়তে পারা যায়।

অথবা এগুলিকে কোনও ভেরিয়েবলে সংরক্ষণ করা ভাল তবে এর চেয়ে অন্য মানগুলি ব্যবহার করে তাদের তুলনা করুন

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


2

চল দেখি...

এটি সমস্ত কিআইএসএস সম্পর্কিত কারণ , আপনি যখন এটি ব্যতীত করতে পারেন তখন অতিরিক্ত ভেরিয়েবল তৈরি করার দরকার নেই। এছাড়াও, আর টাইপ করার দরকার নেই ... যখন দরকার নেই।

তবে আপনি শুকনো কারণ , যদি আপনি পরে কল করে থাকেন ValidateCredentialsএবং নিজেকে টাইপিংয়ের সন্ধান করে থাকেন তবে ValidateCredentials(txtUser.Text, txtPassword.Text)আপনি জানেন যে অতিরিক্ত ভেরিয়েবল তৈরি করা উচিত ছিল।


2

হ্যাঁ, পরিস্থিতিগুলির মতো এমন পদ্ধতিগুলি ব্যবহার করা ভাল। এটি সহায়ক যদিও পদ্ধতির নামটি নির্দেশ করে যে পদ্ধতিটি একটি বিল ফিরিয়ে দেয়; উদাহরণস্বরূপ CanValidateCredentials। সি-স্টাইলের ভাষাগুলিতে এই পদ্ধতিটি প্রায়শই ইস এবং ক্যান উপসর্গ রূপে এবং রুবিতে '' দিয়ে থাকে? প্রত্যয়.


1
পদ্ধতির নাম সম্পর্কে ভাল বক্তব্য, তবে আমি "if" দিয়ে কোনও পদ্ধতির নাম শুরু করব না। তারপরে কোডটি "যদি তবে" পড়বে। "করতে পারেন" ঠিক আছে: if (cat.canOpenCanOfCatFood())
কেভিন cline

ধন্যবাদ, কেভিন আমি বলতে চাইছি 'ইস' নয় 'ইফ'। আমি উত্তরটি সম্পাদনা করেছি
ক্রিশ্চিয়ান হর্সডাল

1

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

প্রাক্তন # 1:

if(foo() && bar() && baz())
{
    quz();
}

প্রাক্তন # 2:

bool isFoo = foo();
bool isBar = bar();
bool isBaz = baz();
if(isFoo && isBar && isBaz)
{
    quz();
}

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

উদাহরণস্বরূপ এটি # 2 নয়। foo (), বার () এবং বাজ () সর্বদা মূল্যায়ন করা হয়। যদি আপনি বার () এবং বাজ () এর পার্শ্ব প্রতিক্রিয়া প্রদর্শনের প্রত্যাশা করে থাকেন তবে আপনার উদাহরণ # 1 নিয়ে সমস্যা হবে। উপরে # 1 উদাহরণটি আসলে এর সমতুল্য:

প্রাক্তন # 3:

if(foo())
{
    if(bar())
    {
        if(baz())
        {
            quz();
        }
    }
}

# 1 এবং # 2 উদাহরণগুলির মধ্যে নির্বাচন করার সময় আপনার কোডের এই পার্থক্যগুলি সম্পর্কে সচেতন হন।


1

পঠনযোগ্যতার ইস্যুতে কিছুটা প্রসারিত করা হচ্ছে ...

আমি একটি পরিবর্তনশীল মধ্যে ফলাফল সংরক্ষণ করার জন্য দুটি ভাল কারণ চিন্তা করতে পারি:

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

  2. যদি কোনও চলকটিতে এটি সংরক্ষণ করা হয় তবে শর্তটিকে এমন একটি নাম দিয়ে পাঠযোগ্যতা উন্নত করে যা ফাংশন কলে আপনি যা দেখেন তার চেয়ে বেশি অর্থবহ।

উদাহরণস্বরূপ, এটি:

bool foo_is_ok = is_ok(foo);
if (foo_is_ok) ...

পাঠযোগ্যতা সাহায্য করে না, কিন্তু এটি:

bool done_processing = feof(file1) && feof(file2);
if (done_processing) ...

সম্ভবত এটি ঘটে, যেহেতু এটি অবিলম্বে সুস্পষ্ট নয় তার feof(file1) && feof(file2)অর্থ আমরা প্রক্রিয়াজাত করেছি।

দ্য passwordsMatchপ্রশ্নে পরিবর্তনশীল সম্ভবত খনি চেয়ে ভাল উদাহরণ।

একক-ব্যবহারের ভেরিয়েবলগুলি কার্যকর হয় যদি তারা কিছু মানকে অর্থবোধক নাম দেয়। (এটি অবশ্যই মানব পাঠকের সুবিধার জন্য is)


আমার মনে হয়, আমি done_processingভেরিয়েবলটি প্রবর্তন করার পরিবর্তে একটি মন্তব্য ফেলে দেব । সর্বোপরি, নামটি done_processingএকটি মন্তব্যের ফাংশনটি সরবরাহ করে। এবং একটি বাস্তব মন্তব্য আমাকে এই প্রক্রিয়াটি কেন প্রক্রিয়াজাতকরণের সাথে সম্পন্ন করার ইঙ্গিত দেয় কেন সে সম্পর্কে দুটি বা দুটি শব্দ বলতে দেয় allows যদিও আমি একজন দুর্দান্ত
কমেন্টার

@ মাস্টার: মন্তব্যগুলির সাথে একটি সমস্যা হ'ল তারা খুব সহজেই কোডটির সাথে সিঙ্ক থেকে বেরিয়ে আসতে পারেন। একটি পরিবর্তনশীল নামটি done_processingঅভিপ্রায় প্রকাশের আরও টেকসই উপায়।
কিথ থম্পসন

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