অবজেক্ট ইনিশিয়ালাইজারগুলির সাথে বিল্ডার এবং তরল ইন্টারফেসগুলি ব্যবহার করার কোনও অর্থ আছে কি?


10

জাভা এবং সি # তে, আপনি বৈশিষ্ট্যগুলির সাথে একটি অবজেক্ট তৈরি করতে পারেন যা পরামিতিগুলির সাথে কনস্ট্রাক্টর সংজ্ঞায়িত করে, অবজেক্টটি তৈরির পরে প্রতিটি সম্পত্তি সংজ্ঞায়িত করে বা বিল্ডার / ফ্লুয়েড ইন্টারফেস প্যাটার্ন ব্যবহার করে সেট করা যেতে পারে। যাইহোক, সি # 3 প্রবর্তিত অবজেক্ট এবং সংগ্রহের সূচনাকারীদের বোঝায়, যার অর্থ বিল্ডার প্যাটার্নটি মূলত অকেজো। ইনিশিয়ালার্সহীন ভাষায় কোনও বিল্ডার বাস্তবায়ন করতে পারে তারপরে এটি ব্যবহার করতে পারে:

Vehicle v = new Vehicle.Builder()
                    .manufacturer("Toyota")
                    .model("Camry")
                    .year(1997)
                    .colour(CarColours.Red)
                    .addSpecialFeature(new Feature.CDPlayer())
                    .addSpecialFeature(new Feature.SeatWarmer(4))
                    .build();

বিপরীতে, সি # তে একটি লিখতে পারে:

var vehicle = new Vehicle {
                Manufacturer = "Toyota",
                Model = "Camry",
                Year = 1997,
                Colour = CarColours.Red,
                SpecialFeatures = new List<SpecialFeature> {
                    new Feature.CDPlayer(),
                    new Feature.SeatWarmer { Seats = 4 }
                }
              }

... পূর্ববর্তী উদাহরণে যেমন দেখা গেছে তেমন কোনও বিল্ডারের প্রয়োজনীয়তা অপসারণ।

এই উদাহরণগুলির উপর ভিত্তি করে, বিল্ডাররা কি এখনও সি # তে কার্যকর, বা প্রাথমিকভাবে তারা পুরোপুরি ছাড়িয়ে গেছে?


are builders usefulআমি এই ধরণের প্রশ্ন কেন দেখছি? একজন নির্মাতা একটি ডিজাইনের ধরণ - অবশ্যই, এটি কোনও ভাষা বৈশিষ্ট্য হিসাবে প্রকাশিত হতে পারে তবে দিনের শেষে এটি কেবল একটি নকশার ধরণ। একটি ডিজাইনের ধরণ "ভুল" হতে পারে না । এটি আপনার ব্যবহারের ক্ষেত্রে পরিপূর্ণ হতে পারে বা না পারে তবে এটি পুরো প্রয়োগটি ভুল করে না, কেবল এটির প্রয়োগ। মনে রাখবেন যে দিনের শেষে নকশার ধরণগুলি নির্দিষ্ট সমস্যাগুলি সমাধান করে - যদি আপনি সমস্যার মুখোমুখি না হন তবে আপনি কেন এটি সমাধান করার চেষ্টা করবেন?
VLAZ

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

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

5
@ ভ্লাজ আমি আপনার উদ্বেগ বুঝতে পারি না। "আপনি বলছিলেন যে কোনও নকশার প্যাটার্নটি কার্যকর নয়" - না, জো জিজ্ঞেস করছিল কোনও ডিজাইনের প্যাটার্নটি কার্যকর কিনা। এটি কীভাবে খারাপ, ভুল, বা ভুল প্রশ্ন? আপনি কি উত্তরটি সুস্পষ্ট বলে মনে করেন? আমি উত্তরটি সুস্পষ্ট বলে মনে করি না; এটি আমার কাছে একটি ভাল প্রশ্ন বলে মনে হচ্ছে।
ট্যানার সোয়েট

2
@ ভ্লাজ, সিঙ্গেলটন এবং পরিষেবা লোকেটারের ধরণগুলি ভুল। এরগো ডিজাইনের ধরণগুলি ভুল হতে পারে।
ডেভিড আরনো

উত্তর:


12

@ ব্যবহারকারী 248215 দ্বারা স্পর্শ হিসাবে আসল ইস্যু হ'ল অপরিবর্তনীয়তা। আপনি সি # তে একজন বিল্ডার ব্যবহার করার কারণটি হ'ল স্থাবর সম্পত্তি প্রকাশ না করেই কোনও প্রাথমিককরণের ব্যাখ্যাটি বজায় রাখা। এটি এনক্যাপসুলেশন সম্পর্কিত প্রশ্ন নয় যার কারণে আমি আমার নিজের উত্তর লিখেছি। এনক্যাপসুলেশন মোটামুটি অরথোগোনাল হিসাবে সেটারকে আহ্বান জানানো সেটারটি আসলে কী করে তা বোঝায় না বা আপনাকে এর বাস্তবায়নে বাঁধে।

সি #, 8.0 এর পরবর্তী সংস্করণে সম্ভবত এমন একটি withকীওয়ার্ড প্রবর্তিত হবে যা অপরিবর্তনীয় বস্তুগুলির নির্মাতাদের লেখার প্রয়োজন ছাড়াই পরিষ্কার এবং সংক্ষিপ্তভাবে আরম্ভ করার অনুমতি দেবে।

আরম্ভের বিপরীতে বিল্ডারদের সাথে আপনি আরও একটি আকর্ষণীয় কাজ করতে পারেন, এটি হ'ল পদ্ধতিগুলির ক্রম অনুসারে বিভিন্ন ধরণের অবজেক্ট তৈরি করতে পারে।

উদাহরণ স্বরূপ

value.Match()
    .Case((DateTime d) => Console.WriteLine($"{d: yyyy-mm-dd}"))
    .Case((double d) => Console.WriteLine(Math.Round(d, 4));
    // void

var str = value.Match()
    .Case((DateTime d) => $"{d: yyyy-mm-dd}")
    .Case((double d) => Math.Round(d, 4).ToString())
    .ResultOrDefault(string.Empty);
    // string

কেবল উপরের উদাহরণটি স্পষ্ট করার জন্য, এটি একটি প্যাটার্ন ম্যাচিং লাইব্রেরি যা কেস নির্দিষ্ট করে "ম্যাচ" তৈরি করতে বিল্ডার প্যাটার্নটি ব্যবহার করে। কেসগুলি Caseপদ্ধতিটিকে পাস করে একটি ফাংশন বলার মাধ্যমে সংযুক্ত করা হয় । যদি valueফাংশনটির প্যারামিটার ধরণের ক্ষেত্রে অ্যাসাইনযোগ্য হয় তবে তা অনুরোধ করা হবে। আপনি গিটহাবের সম্পূর্ণ উত্স কোডটি খুঁজে পেতে পারেন এবং যেহেতু এক্সএমএল মন্তব্যগুলি সরল পাঠ্যে পড়া শক্ত, তাই এখানে স্যান্ডকাস্টল নির্মিত ডকুমেন্টেশনের লিঙ্ক ( মন্তব্যগুলি বিভাগটি দেখুন)


কোনও IEnumerable<Func<T, TResult>>সদস্যকে ব্যবহার করে কীভাবে এটি কোনও অবজেক্ট ইনিশিয়ালাইজারটি করা যায় না তা আমি দেখছি না ।
কালেথ

@ ক্যালাথ এটি আসলে এমন কিছু যা আমি পরীক্ষিত হয়েছিল কিন্তু সেই পদ্ধতির সাথে কিছু সমস্যা রয়েছে। এটি শর্তযুক্ত দফার জন্য অনুমতি দেয় না (লিঙ্কযুক্ত ডকুমেন্টেশনে প্রদর্শিত নয় তবে ব্যবহৃত এবং প্রদর্শিত হয়েছে) এবং এটি প্রকারের অনুক্রমের জন্য অনুমতি দেয় না TResult। শেষ পর্যন্ত টাইপ-ইনফারেন্স এর সাথে অনেক কিছু করার ছিল। আমি এটিকে একটি নিয়ন্ত্রণ কাঠামোর মতো "চেহারা" দিতে চেয়েছিলাম। এছাড়াও আমি কোনও ইনিশিয়ালাইজার ব্যবহার করতে চাইনি যেহেতু এটি রূপান্তরকে অনুমতি দেবে।
আলুয়ান হাদাদ

12

অবজেক্ট ইনিশিয়ালাইজারগুলির প্রয়োজন যে বৈশিষ্ট্যগুলি অবশ্যই কলিং কোডের মাধ্যমে অ্যাক্সেসযোগ্য। নেস্টেড বিল্ডাররা ক্লাসের ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারে।

আপনি যদি পরিবর্তনীয় Vehicle(সমস্ত সেটটারগুলিকে ব্যক্তিগত করার মাধ্যমে) করতে চান, তবে নেস্টেড বিল্ডারটি ব্যক্তিগত ভেরিয়েবলগুলি সেট করতে ব্যবহার করা যেতে পারে।


0

তারা সব বিভিন্ন উদ্দেশ্যে পরিবেশন !!!

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

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

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

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