পদ্ধতি কল বা নিজেই পদ্ধতিটি রক্ষা করা ভাল?


12

আমি একটি আবেদন লিখছি এবং আমি এই মুহুর্তে পৌঁছেছি:

private void SomeMethod()
{
    if (Settings.GiveApples)
    {
        GiveApples();
    }

    if (Settings.GiveBananas)
    {
        GiveBananas();
    }
}

private void GiveApples()
{
    ...
}

private void GiveBananas()
{
    ...
}

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

private void SomeMethod()
{
    GiveApples();
    GiveBananas();
}

private void GiveApples()
{
    if (!Settings.GiveApples)
    {
        return;
    }

    ...
}

private void GiveBananas()
{
    if (!Settings.GiveBananas)
    {
        return;
    }

    ...
}

দ্বিতীয় ক্ষেত্রে, পদ্ধতিগুলির প্রত্যেকটিই নিজেকে রক্ষা করে, সুতরাং সেগুলির মধ্যে যে কোনও একটি পদ্ধতি GiveApplesবা GiveBananasবাইরে থেকে ডাকা SomeMethodহলেও, সেটিংগুলিতে সঠিক পতাকা থাকলেই কেবল তাদের কার্যকর করা হবে।

এটি কি এমন কিছু যা আসলে আমার একটি সমস্যা হিসাবে বিবেচনা করা উচিত?

আমার বর্তমান প্রেক্ষাপটে, এই পদ্ধতির বাইরে থেকে এই দুটি পদ্ধতি আহ্বান করা খুব সম্ভব নয়, তবে কেউ এর গ্যারান্টি দিতে পারে না।


5
এটি আপনাকে প্রথমে পরীক্ষা না করে গিভ অ্যাপলস বা গিভবানানস কল করার প্রয়োজন হতে পারে তার উপর নির্ভর করে। যেহেতু প্রহরীটি এই পদ্ধতির সাথে সম্পর্কিত, এটি সম্ভবত পদ্ধতিতে অন্তর্ভুক্ত।
রবার্ট হার্ভে

উত্তর:


13

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

যদি এটি হয় তবে অবশ্যই গার্ডটি পদ্ধতির অভ্যন্তরে অন্তর্ভুক্ত। এটি আপনাকে প্রহরীদের প্রথমে পরীক্ষা না করে দুর্ঘটনাক্রমে আপনার আবেদনের অন্য একটি বিন্দু থেকে কল করতে বাধা দেয়।

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


5

পদ্ধতি নিজেই গার্ড রাখুন। ভোক্তা GiveApples()বা GiveBananas()প্রহরীদেরকে পরিচালনার জন্য দায়ী করা উচিত হবে না GiveApples()

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

আপনার এই দৃশ্যে যা বিবেচনা করা উচিত তা হ'ল সেটিংস যখন আপনার অ্যাপ্লিকেশনটিকে ফল দেয় না তখন আপনার অ্যাপ্লিকেশনটির কীভাবে প্রতিক্রিয়া করা উচিত।


4

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

private void SomeMethod()
{
    GiveApplesIfActivated();
    GiveBananasIfActivated();
}

private void GiveApplesIfActivated()
{
    if (Settings.GiveApples)
    {
        GiveApples();
    }
}

private void GiveBananasIfActivated()
{
    if (Settings.GiveBananas)
    {
        GiveBananas();
    }
}

private void GiveApples()
{
    ...
}

private void GiveBananas()
{
    ...
}

এটি আপনাকে ক্লাসের কোনও নির্ভরতা ছাড়াই কোডের কোডটি GiveApplesএবং / অথবা GiveBananasএকটি পৃথক জায়গায় রিফ্যাক্ট করার আরও ভাল সুযোগ দেয় Settings। এটি স্পষ্টতই উপকারী যখন আপনি কোনও ইউনিট পরীক্ষায় এই পদ্ধতিগুলি কল করতে চান যা কোনওর জন্য যত্নশীল নয় Settings

যাইহোক, যদি আপনার প্রোগ্রামে সর্বদা ভুল থাকে, যে কোনও পরিস্থিতিতে, এমনকি পরীক্ষার প্রসঙ্গেও, প্রথমে যাচাই করা হয় এমন GiveApplesপ্রসঙ্গে বাইরের মতো কিছু কল Settings.GiveApplesকরা, এবং আপনি কেবল চেক GiveApplesছাড়াই কোনও ফাংশন সরবরাহ Settingsকরা ত্রুটি-প্রবণ , তারপরে সেই ভেরিয়েন্টটিতে আটকে থাকুন যেখানে আপনি Settings.GiveApplesভিতরে পরীক্ষা করেন GiveApples

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