শ্রেণীর সাথে প্রকারের কোডটি প্রতিস্থাপন করুন (রিফ্যাক্টরিং [ফওলার] থেকে)


9

এই কৌশলটির মধ্যে এর পছন্দগুলি প্রতিস্থাপন জড়িত:

public class Politician
{
    public const int Infidelity = 0;
    public const int Embezzlement = 1;
    public const int FlipFlopping = 2;
    public const int Murder = 3;
    public const int BabyKissing = 4;

    public int MostNotableGrievance { get; set; }
}

সঙ্গে:

public class Politician
{
    public MostNotableGrievance MostNotableGrievance { get; set; }
}

public class MostNotableGrievance
{
    public static readonly MostNotableGrievance Infidelity = new MostNotableGrievance(0);
    public static readonly MostNotableGrievance Embezzlement = new MostNotableGrievance(1);
    public static readonly MostNotableGrievance FlipFlopping = new MostNotableGrievance(2);
    public static readonly MostNotableGrievance Murder = new MostNotableGrievance(3);
    public static readonly MostNotableGrievance BabyKissing = new MostNotableGrievance(4);

    public int Code { get; private set; }

    private MostNotableGrievance(int code)
    {
        Code = code;
    }
}

এই ধরণের একটি গণনা করা ঠিক কেন এটি পছন্দনীয়:

public class Politician
{
    public MostNotableGrievance MostNotableGrievance { get; set; }
}

public enum MostNotableGrievance
{
    Infidelity = 0,
    Embezzlement = 1,
    FlipFlopping = 2,
    Murder = 3,
    BabyKissing = 4
}

প্রকারের সাথে সম্পর্কিত কোনও আচরণ নেই এবং যদি আপনি থাকতেন তবে আপনি যেভাবেই কোনও ভিন্ন ধরণের রিফ্যাক্টরিং ব্যবহার করছেন, উদাহরণস্বরূপ, 'সাবক্লাসের সাথে টাইপ কোডটি প্রতিস্থাপন করুন' + 'পলিমারফিজমের সাথে শর্তসাপেক্ষ প্রতিস্থাপন করুন'।

তবে লেখক ব্যাখ্যা করেছেন যে কেন তিনি এই পদ্ধতিতে (জাভাতে)?

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

তবে এই বিবৃতিটি সি # তে প্রয়োগ করার চেষ্টা করার সময়, এই বিবৃতিটি সত্য বলে মনে হচ্ছে না: এটি একটি সংখ্যা গ্রহণ করবে না কারণ একটি গণনা আসলে একটি শ্রেণি হিসাবে বিবেচিত। সুতরাং নিম্নলিখিত কোড:

public class Test
{
    public void Do()
    {
        var temp = new Politician { MostNotableGrievance = 1 };
    }
}

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


var temp = new Politician { MostNotableGrievance = MostNotableGrievance.Embezzlement };
রবার্ট হার্ভে

উত্তর:


6

আমি মনে করি আপনি সেখানে নিজের প্রশ্নের প্রায় উত্তর দিয়েছেন।

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

MostNotableGrievance grievance = Fish.Haddock;

এবং সংকলক পাত্তা দেবে না। যদি ফিশ.হ্যাডডক = 2 তবে উপরেরটি ঠিক সমান হবে

MostNotableGrievance grievance = MostNotableGrievance.FlipFlopping;

তবে স্পষ্টতই তত্ক্ষণাত পাঠযোগ্য নয়।

গণনাগুলি প্রায়শই এর চেয়ে ভাল হয় না কারণ হ'ল এবং অন্তর্নিহিত থেকে অন্তর্নিহিত রূপান্তর আপনাকে একই একই সমস্যাটি থেকে যায়।

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


5

যদি মানটির সাথে কোনও আচরণ সম্পর্কিত না হয় এবং অতিরিক্ত কোনও তথ্য নেই যা আপনার পাশাপাশি রাখতে হবে এবং ভাষাটি পূর্ণসংখ্যায় অন্তর্ভুক্ত রূপান্তরকে সমর্থন করে না, আমি একটি এনাম ব্যবহার করব; এটাই তারা সেখানে আছে।


1

আর একটি উদাহরণ যা আপনাকে কার্যকর জাভাতে খুঁজে পেতে পারে (আইটেম 30, আপনি যদি এটি সন্ধান করতে চান)। এটি সি # এর জন্যও বৈধ।

ধরুন আপনি বিভিন্ন প্রাণীকে মডেল করতে ইনট কনস্ট্যান্ট ব্যবহার করেন, সাপ এবং কুকুর বলুন।

int SNAKE_PYTHON=0;
int SNAKE_RATTLE=1;
int SNAKE_COBRA=2;

int DOG_TERRIER=0;
int DOG_PITBULL=1;

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

snake.setType(DOG_TERRIER);

স্পষ্টতই, এটি একটি ত্রুটি। সংকলক অভিযোগ করবে না এবং কোডটি কার্যকর করবে। তবে আপনার সাপ কুকুরের মধ্যে পরিণত হবে না। কারণ কেবল সংকলকটি দেখে:

snake.setType(0);

আপনার সাপটি আসলে একটি অজগর (এবং কোনও টেরিয়ার নয়)। এই বৈশিষ্ট্যটিকে টাইপ সুরক্ষা বলা হয় এবং এটি হ'ল কারণ আপনি উদাহরণের কোড

var temp = new Politician { MostNotableGrievance = 1 };

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

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