এমন ক্লাস তৈরি করা কি খারাপ যাঁর একমাত্র উদ্দেশ্য নিখুঁতভাবে অন্য শ্রেণিতে রূপান্তর করা?


10

এমন একটি পরিস্থিতি কল্পনা করুন যেখানে আমরা একটি লাইব্রেরি ব্যবহার করছি যা আপনাকে Circleঅবজেক্ট তৈরি করতে দেয় , যেখানে আপনি এটির ব্যাসার্ধ এবং বৃত্তের কেন্দ্র নির্দিষ্ট করতে পারেন it তবে কোনও কারণে এটি প্রয়োজনীয় flavourপ্যারামিটারও নেয় । এখন বলা যাক আমাকে Circleআমার নিজের অ্যাপ্লিকেশনটিতে সত্যই ব্যবহার করা দরকার তবে আমার অ্যাপ্লিকেশনটির উদ্দেশ্যে আমি Flavours.Cardboardপ্রতি একক বারের স্বাদটি সেট করতে পারি ।

এই "সমাধান" করার জন্য, আমি আমার নিজের তৈরি Circleএকটি ভিন্ন নামস্থান, যা শুধুমাত্র লাগে ক্লাস radiusএবং centerপরামিতি হিসেবে কিন্তু বাহ্যিক লাইব্রেরির একটি অন্তর্নিহিত কনভার্টার রয়েছে Circleবর্গ যা শুধু একটি তৈরি করে Circle(this.radius, this.center, Flavours.Cardboard)অবজেক্ট। সুতরাং Circleযেখানেই আমার অন্য ধরণের প্রয়োজন , আমি স্বয়ংক্রিয় রূপান্তর ঘটতে দেব।

এ জাতীয় শ্রেণি তৈরির পরিণতি কী? এর চেয়ে আরও ভাল সমাধান আছে কি? অন্যান্য প্রোগ্রামারদের ব্যবহারের উদ্দেশ্যে যদি আমার অ্যাপ্লিকেশনটি এই বাহ্যিক লাইব্রেরির উপরে নির্মিত একটি এপিআই হয়ে থাকে তবে তাতে কি কোনও পার্থক্য হবে?


এটি অ্যাডাপ্টার প্যাটার্নের পরিবর্তনের মতো বলে মনে হচ্ছে , যদিও এটি এখানে সন্দেহজনক মান বলে মনে হচ্ছে (এটি কেবলমাত্র প্যারামিটার সেট করা এড়ানোর জন্য একটি সুবিধা) being
রবার্ট হার্ভে

5
কেন একটি MakeCircle ফাংশন তৈরি করবেন না ?
ব্যবহারকারী 253751

1
@ ইমিবিস থাই আমার প্রথম চিন্তা ছিল। আমি যখন গেমস তৈরি করছি, আমি প্রায়শই তার পংক্তির পাশাপাশি একটি ফাংশন তৈরি করব makePlayerযা কেবল প্লেয়ারকে রাখার জন্য স্থানাঙ্ক গ্রহণ করে, তবে আরও জটিল নির্মাতাকে প্রতিনিধি করে।
কারসিজেনিকেট

উত্তর:


13

এটি সর্বদা খারাপ না হলেও , এটি খুব বিরল যে অন্তর্নিহিত রূপান্তরগুলি আপনার সেরা বিকল্প।

সমস্যা আছে।

  1. অন্তর্নিহিত রূপান্তরগুলি খুব পাঠযোগ্য নয়।
  2. যেহেতু আপনি একটি নতুন অবজেক্ট তৈরি করছেন, মূল বস্তুতে যে কোনও পরিবর্তন আপনি যেটিকে রূপান্তর করছেন তাতে দেখা যাবে না, যা বাগের দিকে নিয়ে যাবে।
  3. আপনি যদি জিনিসটি দূরে ফেলে দিচ্ছেন তবে এটি পরিষ্কার করার জন্য অতিরিক্ত আবর্জনা।
  4. যদি কোনও সমস্যা হয়, রূপান্তরটি ঘটেছিল তখনই এটি ঘটবে, জিনিসটি তৈরি হওয়ার সময় নয়, ত্রুটিগুলি খুঁজে বের করা আরও শক্ত are

সাধারণভাবে, আরও ভাল সমাধান আছে।

  1. আপনার নিজের পাতলা মোড়ক তৈরি করুন যা অন্য শ্রেণি / কাঠামো অভ্যন্তরীণভাবে ব্যবহার করে।
  2. এমন একটি সহায়ক পদ্ধতি তৈরি করুন যা আপনি চান এমন কন্ডাক্টর আর্গুমেন্ট গ্রহণ করে এবং যা স্থির করে সেটিকে সরবরাহ করে, আপনার অযুহাত যুক্তিটি উল্লেখ না করে আসল বস্তুটি ফিরে আসবে।
  3. সমস্যা শ্রেণি থেকে উত্তরাধিকারী এবং আপনার নিজের, সুন্দর নির্মাতাকে সরবরাহ করুন।
  4. বুঝতে পারি যে অতিরিক্ত যুক্তিতে উত্তীর্ণ হওয়া আসলে কোনও চুক্তির মধ্যে বড় নয়।

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

অন্তর্নিহিত রূপান্তরটি একটি সর্বশেষ অবলম্বন এবং কেবলমাত্র যখন আমার সি ++ স্টাইল ফ্যান্টর তৈরির চেষ্টা করি তখনই আমার পক্ষে এটি মূল্যবান মনে হয় - কৌশল অবজেক্টগুলি আমি স্পষ্টতই ডেলিগেটের ধরণে রূপান্তর করি।


1

আপনি যে দৃশ্যের বর্ণনা দিচ্ছেন তা প্রদত্ত, আপনি আংশিক ফাংশন অ্যাপ্লিকেশনটির ক্ষেত্রে এটি ভাবতে পারেন।

কনস্ট্রাক্টর একটি ফাংশন (কমপক্ষে তত্ত্বে; সি # তে, আপনি একটি "ফ্যাক্টরি ফাংশন" তৈরি করতে পারেন যা কনস্ট্রাক্টরকে কল করে):

Func<double, Point, Flavour, Circle> MakeCircle = (r, p, f) => new Circle(r, p, f);

আংশিক প্রয়োগের জন্য, নিম্নলিখিতগুলি যথেষ্ট হবে:

public static Func<T1, T2, R> Partial<T1, T2, T3, R>(this Func<T1, T2, T3, R> func, T3 t3)
   => (t1, t2) => func(t1, t2, t3);

আপনি এখন আপনার কনস্ট্রাক্টর পেতে পারেন যা কেবলমাত্র 2 টি প্যারামিটারের প্রয়োজন:

Func<double, Point, Circle> MakeCardboardCircle = Circle.Partial(Flavours.Cardboard)

সুতরাং এখন আপনার পছন্দসই পরামিতিগুলির সাথে একটি কারখানা ফাংশন রয়েছে

Circle c = MakeCardboardCircle(1.0, new Point(0, 0)))

বিটিডব্লিউ, এটি কেবলমাত্র আরও কার্যকরী দৃষ্টিকোণ থেকে উপরের বিকল্প 2 এর সমানভাবে সমান।

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