আমার এই দৃশ্যে রচনা বা উত্তরাধিকার পছন্দ করা উচিত?


11

একটি ইন্টারফেস বিবেচনা করুন:

interface IWaveGenerator
{
    SoundWave GenerateWave(double frequency, double lengthInSeconds);
}

এই ইন্টারফেসটি বিভিন্ন শ্রেণীর দ্বারা প্রয়োগ করা হয় যা বিভিন্ন আকারের তরঙ্গ উত্পন্ন করে (উদাহরণস্বরূপ, SineWaveGeneratorএবং SquareWaveGenerator)।

আমি এমন একটি ক্লাস বাস্তবায়ন করতে চাই যা SoundWaveসংগীত উপাত্তের উপর ভিত্তি করে উত্পন্ন করে, কাঁচা সাউন্ড ডেটা নয়। এটি একটি নোটের নাম এবং প্রহারের ক্ষেত্রে একটি দৈর্ঘ্য (সেকেন্ড নয়) পাবে এবং অভ্যন্তরীণভাবে সেই অনুযায়ী IWaveGeneratorতৈরি করতে কার্যকারিতাটি ব্যবহার করবে SoundWave

প্রশ্ন হচ্ছে, উচিত NoteGeneratorএকটি ধারণ IWaveGeneratorবা এটি একটি থেকে উত্তরাধিকারী উচিত IWaveGeneratorবাস্তবায়ন?

আমি দুটি কারণে রচনার দিকে ঝুঁকছি:

1- এটা আমার কোনো উদ্বুদ্ধ করতে পারবেন IWaveGeneratorকরার NoteGeneratorপরিবর্তনশীল। এছাড়াও, আমি শুধুমাত্র এক প্রয়োজন NoteGeneratorবর্গ, পরিবর্তে SineNoteGenerator, SquareNoteGeneratorইত্যাদি

2- NoteGeneratorদ্বারা সংজ্ঞায়িত নিম্ন-স্তরের ইন্টারফেসটি প্রকাশ করার দরকার নেই IWaveGenerator

তবে আমি এই সম্পর্কিত অন্যান্য মতামত শুনতে এই প্রশ্নটি পোস্ট করছি, সম্ভবত পয়েন্টগুলি যা আমি ভেবে দেখিনি।

BTW: আমি বলব NoteGenerator হয় ধারণার দিক থেকে একটি IWaveGeneratorকারণ তা উত্পন্ন SoundWaveগুলি।

উত্তর:


14

এটি আমাকে গতিশীলভাবে নোট জেনারেটরের কাছে কোনও আইওয়াওয়েজেনেটর ইনজেকশনের অনুমতি দেয়। এছাড়াও, আমার কেবল সাইননোটে জেনারেটর , স্কয়ার নোট জেনারেটর ইত্যাদির পরিবর্তে একটি নোট জেনারেটর ক্লাস প্রয়োজন

এটা একটা স্পষ্ট নিদর্শন তা এখানে ব্যবহার রচনার ভাল হবে, এবং থেকে উত্তরাধিকারী না SineGeneratorবা SquareGenerator(খারাপ) উভয় বা। তবুও, IWaveGeneratorআপনি যদি সামান্য কিছুটা পরিবর্তন করেন তবে সরাসরি কোনও নোট জেনারেটরের উত্তরাধিকারী হওয়ার অর্থটি হবে ।

এখানে আসল সমস্যাটি হ'ল এটির NoteGeneratorমতো পদ্ধতি থাকা সম্ভবত অর্থবহ

SoundWave GenerateWave(string noteName, double noOfBeats, IWaveGenerator waveGenerator);

তবে কোনও পদ্ধতিতে নয়

SoundWave GenerateWave(double frequency, double lengthInSeconds);

কারণ এই ইন্টারফেসটি খুব নির্দিষ্ট। যদি আপনি চান IWaveGeneratorবস্তু যা উৎপন্ন হতে গুলি SoundWaveগুলি, কিন্তু বর্তমানে আপনার ইন্টারফেস প্রকাশ IWaveGeneratorগুলি বস্তু যা উৎপন্ন হয় SoundWaveগুলি ফ্রিকোয়েন্সি এবং দৈর্ঘ্য একচেটিয়াভাবে থেকে । সুতরাং আরও ভাল যেমন একটি ইন্টারফেস ডিজাইন

interface IWaveGenerator
{
    SoundWave GenerateWave();
}

এবং প্যারামিটারগুলির মতো frequencyবা lengthInSeconds, অথবা একে SineWaveGenerator, ক SquareGenerator, বা অন্য যে কোনও জেনারেটর আপনি মনে রেখেছেন তার নির্মাতাদের মাধ্যমে পরামিতিগুলির সম্পূর্ণ সেট করুন pass এটি আপনাকে IWaveGeneratorসম্পূর্ণ ভিন্ন নির্মাণ পরামিতি সহ অন্যান্য ধরণের তৈরি করতে অনুমতি দেবে । হতে পারে আপনি একটি আয়তক্ষেত্র তরঙ্গ জেনারেটর যুক্ত করতে চান যার একটি ফ্রিকোয়েন্সি এবং দুটি দৈর্ঘ্যের পরামিতি প্রয়োজন, বা এর মতো কিছু হতে পারে, আপনি কমপক্ষে তিনটি পরামিতি সহ পরবর্তী একটি ত্রিভুজ তরঙ্গ জেনারেটর যুক্ত করতে চান। অথবা, একটি NoteGenerator, কন্সট্রাকটর পরামিতি সঙ্গে noteName, noOfBeatsএবং waveGenerator

সুতরাং সাধারণ সমাধান হ'ল আউটপুট ফাংশন থেকে ইনপুট পরামিতিগুলি দ্বিগুণ করা এবং ইন্টারফেসের কেবল আউটপুট ফাংশন অংশ করা।


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

2
@ অভিভকোহান: "কোডটি আসলে কী ধরণের এটি নিয়ে কাজ করছে তা জানতে হবে" - না, এটি একটি ভুল ধারণা। কোডের কেবলমাত্র সেই অংশ যা নির্দিষ্ট ধরণের জেনারেটর তৈরি করে (মাইবি একটি কারখানা), এবং এটি সর্বদা জানতে হবে যে এটি কোন ধরণের সাথে কাজ করে।
ডক ব্রাউন

... এবং যদি আপনাকে আপনার অবজেক্টগুলির নির্মাণ প্রক্রিয়াটি বহুরূপী করার প্রয়োজন হয় তবে আপনি "বিমূর্ত কারখানা" প্যাটার্নটি ব্যবহার করতে পারেন ( en.wikedia.org/wiki/Abstract_factory_pattern )
ডক ব্রাউন

এই সমাধান আমি নিতে হবে। ছোট, অপরিবর্তনীয় ক্লাসগুলি এখানে যাওয়ার সঠিক উপায়।
স্টিফেন

9

নোট জেনারেটর আইওয়াওয়েজেনেটর "ধারণাগতভাবে" কিনা তা বিবেচনা করে না।

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

দেখে মনে হচ্ছে আপনার নোট জেনারেটরের সিন্টেক্সিকভাবে একই ইন্টারফেস থাকতে পারে তবে এর শব্দার্থক শব্দগুলি (এই ক্ষেত্রে, এটি পরামিতিগুলির অর্থ গ্রহণ করে) খুব আলাদা হবে, সুতরাং এই ক্ষেত্রে উত্তরাধিকার ব্যবহার করা অত্যন্ত বিভ্রান্তিকর এবং সম্ভাব্য ত্রুটি-প্রবণ হবে। আপনি এখানে রচনা পছন্দ পছন্দ।


আসলে আমি বলতে চাইছি NoteGeneratorনা বাস্তবায়ন করবে GenerateWaveকিন্তু প্যারামিটারগুলি আলাদাভাবে ব্যাখ্যা করবে, হ্যাঁ আমি সম্মত হই যে এটি একটি ভয়ানক ধারণা হবে। আমি বোঝাতে চাইছিলাম নোট জেনারেটরটি তরঙ্গ জেনারেটরের এক বিশেষত্ব: এটি কেবলমাত্র কাঁচা সাউন্ড ডেটার পরিবর্তে 'উচ্চতর স্তর' ইনপুট ডেটা নিতে সক্ষম হয় (যেমন একটি ফ্রিকোয়েন্সিটির পরিবর্তে একটি নোটের নাম)। অর্থাৎ sineWaveGenerator.generate(440) == noteGenerator.generate("a4")। সুতরাং প্রশ্ন, রচনা বা উত্তরাধিকার আসে।
আভিভ কোহন

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

@ ইক্সেরেক: আসলে, সব ধরণের জেনারেটরের জন্য একটি একক ইন্টারফেস রাখা খুব কঠিন নয়, ওপি সম্ভবত দু'টিই করা উচিত, একটি নিম্ন স্তরের জেনারেটর ইনজেকশন দেওয়ার জন্য রচনাটি ব্যবহার করতে হবে এবং সরলীকৃত ইন্টারফেস থেকে উত্তরাধিকারী হওয়া উচিত (তবে একটি থেকে নোট জেনারেটরের উত্তরাধিকারী না নিম্ন স্তরের জেনারেটর বাস্তবায়ন) আমার উত্তর দেখুন।
ডক ব্রাউন

5

2- আইওয়াওগেনেটর দ্বারা নির্ধারিত নিম্ন-স্তরের ইন্টারফেসটি প্রকাশ করার জন্য নোট জেনারেটরের কোনও প্রয়োজন নেই।

মত শব্দগুলি NoteGeneratorএকটি নয় WaveGenerator, সুতরাং ইন্টারফেসটি প্রয়োগ করা উচিত নয়।

সংমিশ্রণ সঠিক পছন্দ।


আমি বলতে হবে NoteGenerator অর্থাৎ ধারণার দিক থেকে একটি IWaveGeneratorকারণ তা উত্পন্ন SoundWaveগুলি।
আভিভ কোহন

1
ওয়েল, যদি এটা প্রকাশ করার দরকার নেই GenerateWave, তাহলে এটি কোনো ব্যাপার IWaveGenerator। কিন্তু শোনাচ্ছে মত ব্যবহার একটি IWaveGenerator (হয়তো আরো?) রচনা, অত।
এরিক কিং

@ এরিকিং: প্রশ্নটিতে GenerateWaveযেমন লেখা আছে ততক্ষণ কারও কাছে আটকে থাকতে হবে এটি এটি সঠিক উত্তর । তবে উপরের মন্তব্য থেকে আমি অনুমান করি যে ওপি সত্যই মনে রাখেনি।
ডক ব্রাউন

3

আপনার রচনার জন্য একটি কঠিন মামলা রয়েছে। আপনি একটি মামলা করতে হতে পারে এছাড়াও উত্তরাধিকার যোগ করুন। বলার উপায় হ'ল কলিং কোডটি দেখে। যদি আপনি NoteGeneratorবিদ্যমান কলিং কোডটি একটি প্রত্যাশা করে যে কোনওটি ব্যবহার করতে সক্ষম হতে চান IWaveGenerator, তবে আপনাকে ইন্টারফেসটি প্রয়োগ করতে হবে। আপনি সাবস্টিটিউটেবিলিটির প্রয়োজন খুঁজছেন। এটি ধারণামূলকভাবে "এটি-এ" তরঙ্গ জেনারেটর বিন্দুর পাশে রয়েছে কিনা।


সেক্ষেত্রে, রচনা বাছাই করা, তবে পরিবর্তনের প্রয়োজনে সেই উত্তরাধিকারের প্রয়োজন থাকা সত্ত্বেও "উত্তরাধিকার" নামকরণ করা হবে IHasWaveGenerator, এবং সেই ইন্টারফেসের প্রাসঙ্গিক পদ্ধতিটি GetWaveGeneratorহ'ল যা একটি উদাহরণ দেয় IWaveGenerator। অবশ্যই নামকরণ পরিবর্তন করা যেতে পারে। (আমি কেবল আরও বিশদ জানার চেষ্টা করছি - আমার বিবরণগুলি ভুল কিনা তা আমাকে জানান))
রওয়ং

2

NoteGeneratorইন্টারফেস বাস্তবায়নের জন্য এটি ঠিক আছে , এবং NoteGeneratorঅভ্যন্তরীণ বাস্তবায়নও রয়েছে যা অন্যরকম উল্লেখ করে (রচনা অনুসারে) IWaveGenerator

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

উত্তরাধিকার আপনি যখন বিশেষায়িত বা কাস্টমাইজ করতে চান এমন একটি বাস্তবায়ন হয়ে থাকে তখন এটি আরও ভাল ব্যবহৃত হয়, যা এখানে ক্ষেত্রে বলে মনে হয় না: আপনার কেবল ইন্টারফেসটি ব্যবহার করা দরকার।


1
এটি NoteGeneratorপ্রয়োগ করা ঠিক হবে না IWaveGeneratorকারণ নোটগুলির জন্য বীট প্রয়োজন। সেকেন্ড না।
তুলাইনস কর্ডোভা

হ্যাঁ, অবশ্যই যদি ইন্টারফেসটির কোনও বুদ্ধিমান বাস্তবায়ন না হয়, তবে শ্রেণীর এটি প্রয়োগ করা উচিত নয়। যাইহোক, ওপিতে বলা হয়েছে যে "আমি বলব NoteGeneratorধারণাটি একটি IWaveGeneratorকারণ এটি উত্পন্ন করে SoundWave", এবং তিনি উত্তরাধিকার বিবেচনা করছেন, তাই আমি ইন্টারফেসটির কিছু বাস্তবায়ন হতে পারে এই সম্ভাবনার জন্য মানসিক অক্ষাংশ নিয়েছিলাম, যদিও অন্যটি রয়েছে ক্লাসের জন্য আরও ভাল ইন্টারফেস বা স্বাক্ষর।
এরিক tদ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.