কীভাবে রিয়েল নাম্বার এবং কমপ্লেক্স নাম্বার উত্তরাধিকারী বাস্তবায়ন করবেন?


11

আশা করি খুব বেশি একাডেমিক না ...

ধরা যাক আমার আমার এসডাব্লু লাইব্রেরিতে সত্যিকারের এবং জটিল সংখ্যা দরকার।

Is -a (বা এখানে ) সম্পর্কের ভিত্তিতে , আসল সংখ্যাটি একটি জটিল সংখ্যা, যেখানে জটিল সংখ্যার কাল্পনিক অংশে খালি 0 হয়।

অন্যদিকে, আমার বাস্তবায়নটি হবে, সেই শিশুটি পিতামাতাকে প্রসারিত করে, তাই পিতামাতার রিয়েল নাম্বারে আমার আসল অংশ থাকত এবং শিশু কমপ্লেক্স নাম্বারটি কল্পিত শিল্পকে যুক্ত করে।

এছাড়াও একটি মতামত আছে, যে উত্তরাধিকার মন্দ

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

আমার অভিজ্ঞতা হ'ল, আমরা প্রায়শই ডিআরওয়াই সমাধানের জন্য উত্তরাধিকার ব্যবহার করি, ফলস্বরূপ আমাদের প্রায়শই ক্রমবর্ধমান কৃত্রিম বিমূর্ত শ্রেণি রয়েছে (তারা প্রায়শই নামগুলি খুঁজে পেতে আমাদের সমস্যা হয় কারণ তারা সত্যিকারের বিশ্বের বস্তুগুলিকে প্রতিনিধিত্ব করে না)।


7
এটি পূর্ববর্তী প্রশ্নের কভার মত দেখাচ্ছে: আয়তক্ষেত্রটি কি বর্গাকার হতে উত্তরাধিকারী হওয়া উচিত?
জান্নাত

1
@ জাগ্রত ওহে মানুষ, আমি এটি ব্যবহার করতে চেয়েছিলাম এমন অন্য একটি উদাহরণ ... ধন্যবাদ!
বেটলিস্ট

7
... দ্রষ্টব্য যে গাণিতিক অর্থে বাক্যটি "আসল সংখ্যা একটি জটিল সংখ্যা" কেবলমাত্র অপরিবর্তনীয় সংখ্যার জন্য বৈধ , সুতরাং আপনি যদি অপরিবর্তনীয় বস্তু ব্যবহার করেন তবে আপনি এলএসপি লঙ্ঘন এড়াতে পারবেন (বর্গক্ষেত্র এবং আয়তক্ষেত্রের জন্যও এটি ধারণ করে, এটি দেখুন) এসও উত্তর )।
ডক ব্রাউন

5
... আরও জটিল নোটের জন্য নিখুঁত মান গণনা প্রকৃত সংখ্যাগুলির জন্যও কাজ করে নোট করুন, সুতরাং আপনার প্রফেসর কী বোঝাতে চেয়েছিলেন তা আমি নিশ্চিত নই। আপনি যদি একটি অপরিবর্তনীয় জটিল সংখ্যায় "Abs ()" পদ্ধতিটি সঠিকভাবে প্রয়োগ করেন এবং সেখান থেকে একটি "বাস্তব" পান, তবে Abs () পদ্ধতিটি এখনও সঠিক ফলাফল সরবরাহ করবে।
ডক ব্রাউন 15

উত্তর:


17

এমনকি গাণিতিক দিক থেকেও যদি আসল সংখ্যাটি একটি জটিল সংখ্যা হয় তবে জটিল থেকে বাস্তবটি পাওয়া ভাল ধারণা নয়। এটি লিসকভ সাবস্টিটিউশন নীতি লঙ্ঘন করে (অন্যান্য বিষয়গুলির মধ্যেও) যে উত্পন্ন শ্রেণীর কোনও বেস শ্রেণীর বৈশিষ্ট্য গোপন করা উচিত নয়।

এই ক্ষেত্রে একটি জটিল সংখ্যার কাল্পনিক অংশটি লুকিয়ে রাখতে হবে hide এটা পরিষ্কার যে আপনার যদি কেবল আসল অংশের প্রয়োজন হয় তবে কোনও লুকানো ভাসমান পয়েন্ট নম্বর (কল্পিত অংশ) সংরক্ষণ করার কোনও অর্থ হয় না।

এটি মূলত একটি মন্তব্যে উল্লিখিত আয়তক্ষেত্র / বর্গক্ষেত্রের সমান সমস্যা।


2
আজ আমি এই "লিস্কো সাবস্টিটিউশন নীতিমালা" বেশ কয়েকবার দেখেছি, আমাকে এটি সম্পর্কে আরও পড়তে হবে, কারণ আমি এটি জানি না।
বেটলিস্ট

7
বাস্তব সংখ্যাটির কল্পিত অংশটি শূন্য হিসাবে প্রতিবেদন করা পুরোপুরি ঠিক আছে, যেমন কেবল পঠনযোগ্য পদ্ধতির মাধ্যমে। একটি বাস্তব সংখ্যাটিকে জটিল সংখ্যা হিসাবে বাস্তবায়িত করার কোনও মানে হয় না যেখানে কল্পিত অংশটি শূন্যে সেট করা আছে। এটি হ'ল উত্তরাধিকার বিভ্রান্তিকর একটি ক্ষেত্রে: যদিও ইন্টারফেসের উত্তরাধিকারটি এখানে যুক্তিযুক্তভাবে ভাল হবে, বাস্তবায়নের উত্তরাধিকারের ফলে সমস্যাযুক্ত নকশা তৈরি হবে।
আমন

4
জটিল সংখ্যা থেকে প্রকৃত সংখ্যা উত্তরাধিকার সূত্রে প্রাপ্তি যথাযথ অর্থে তৈরি করে, যতক্ষণ না উভয় অক্ষর না হয়ে থাকে। এবং আপনি ওভারহেড কিছু মনে করবেন না।
উত্সাহীকারী

@ উত্সাহক: আকর্ষণীয় বিষয় অপরিচ্ছন্নতা অনেকগুলি সমস্যার সমাধান করে তবে আমি এখনও এই ক্ষেত্রে পুরোপুরি নিশ্চিত নই। এটি সম্পর্কে চিন্তা করতে হবে।
ফ্র্যাঙ্ক পাফার

3

এই দু'জনের নিরঙ্কুশ মান আলাদাভাবে গণনা করা হয় বলে উত্তরাধিকারের একটি উত্তম উদাহরণ নয়

এটি আসলে এখানে সমস্ত উত্তরাধিকারের বিরুদ্ধে বাধ্যতামূলক কারণ নয় , কেবল প্রস্তাবিত class RealNumber<-> class ComplexNumberমডেল।

আপনি যুক্তিসঙ্গতভাবে একটি ইন্টারফেস সংজ্ঞায়িত করতে পারেন Number, যা উভয়ই RealNumber এবং ComplexNumberপ্রয়োগ করে।

যে মত চেহারা হতে পারে

interface Number
{
    Number Add(Number rhs);
    Number Subtract(Number rhs);
    // ... etc
}

তবে তারপরে আপনি Numberএই অপারেশনগুলিতে অন্যান্য পরামিতিগুলি একই উত্পন্ন ধরণের হতে সীমাবদ্ধ করতে চান this, যার সাথে আপনি কাছে যেতে পারেন

interface Number<T>
{
    Number<T> Add(Number<T> rhs);
    Number<T> Subtract(Number<T> rhs);
    // ... etc
}

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

complex operator + (complex lhs, complex rhs);
complex operator - (complex lhs, complex rhs);
// ... etc

Number frobnicate<Number>(List<Number> foos, Number bar); // uses arithmetic operations

0

সমাধান: পাবলিক RealNumberক্লাস নেই

আমি এটি সম্পূর্ণরূপে ঠিক দেখতে পাই যদি ComplexNumberকোনও স্থিতিশীল কারখানার পদ্ধতি থাকে fromDouble(double)যা একটি জটিল নম্বরকে কাল্পনিক শূন্য সহ ফিরিয়ে দেয়। তারপরে আপনি RealNumberএই ComplexNumberদৃষ্টান্তে কোনও ক্রিয়াকলাপ ব্যবহার করতে পারেন ।

তবে কেন আপনার পাবলিক উত্তরাধিকার সূত্রে প্রাপ্ত RealNumberশ্রেণি প্রয়োজন / প্রয়োজন হবে তা দেখতে আমার সমস্যা হয় । সাধারণত উত্তরাধিকার এই কারণগুলির জন্য ব্যবহৃত হয় (আমার মাথার বাইরে, কিছু মিস করলে আমাকে সংশোধন করুন)

  • আচরণ প্রসারিত। RealNumbersকোনও জটিল অপারেশন জটিল নম্বর করতে পারে না, সুতরাং এটি করার কোনও মানে নেই।

  • নির্দিষ্ট প্রয়োগের সাথে বিমূর্ত আচরণ বাস্তবায়ন করা। যেহেতু ComplexNumberবিমূর্ত হওয়া উচিত নয় এটি প্রয়োগও হয় না।

  • কোড পুনরায় ব্যবহার। আপনি যদি কেবল ComplexNumberক্লাস ব্যবহার করেন তবে আপনার 100% কোড পুনরায় ব্যবহার করুন ।

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

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


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

0

একটি প্রকৃত সংখ্যা একটি জটিল সংখ্যা কম্পিউটার বিজ্ঞানের চেয়ে গণিতের, বিশেষত সেট থিউরির বেশি অর্থ বলে Say
গণিতে আমরা বলি:

  • একটি বাস্তব সংখ্যা একটি জটিল সংখ্যা কারণ জটিল সংখ্যার সেটটিতে আসল সংখ্যার সেট অন্তর্ভুক্ত থাকে।
  • একটি যুক্তিযুক্ত সংখ্যা একটি আসল সংখ্যা কারণ আসল সংখ্যার সেটে যুক্তি সংখ্যার সেট (এবং অযৌক্তিক সংখ্যার সেট) অন্তর্ভুক্ত থাকে।
  • একটি পূর্ণসংখ্যা একটি যৌক্তিক সংখ্যা কারণ যুক্তি সংখ্যার সেটটিতে পূর্ণসংখ্যার সেট অন্তর্ভুক্ত থাকে।

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

public class ComplexNumber {
    private RealNumber realPart;
    private RealNumber imaginaryPart;

    // Implementation details are for you to write
}

এটি আপনাকে রিয়েল নাম্বার শ্রেণিকে পুনরায় ব্যবহার করার ক্ষমতা জোশুয়া ব্লচের দ্বারা চিহ্নিত সমস্যাগুলি এড়িয়ে গিয়ে আপনার কোড ডিআরওয়াই রাখতে দেয়।


0

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

দ্বিতীয় সমস্যাটি হ'ল কন্টেইনারগুলির মধ্যে এমন একটি সম্পর্ক যা থেকে বিভিন্ন ধরণের অবজেক্টগুলি পড়তে পারে সেগুলি নিজেরাই বস্তুর মধ্যে সম্পর্কের মতোই আচরণ করে, যে পাত্রে বিভিন্ন ধরণের বস্তু স্থাপন করা যেতে পারে তাদের সামগ্রীর মধ্যে বিপরীত আচরণ করে । প্রতিটি খাঁচা যা একটি উদাহরণ ধরে রাখতে পরিচিত Catতা একটি খাঁচা হবে যা একটি দৃষ্টান্ত ধারণ করে Animalতবে এটি একটি খাঁচা হতে হবে না যা একটি দৃষ্টান্ত ধারণ করে SiameseCat। অন্যদিকে, প্রতিটি খাঁচা যা সমস্ত দৃষ্টান্ত ধরে রাখতে Catপারে তা একটি খাঁচা হবে যা সমস্ত দৃষ্টান্ত ধরে রাখতে SiameseCatপারে তবে এমন একটি খাঁচা হওয়া উচিত নয় যা সমস্ত দৃষ্টান্ত ধরে রাখতে পারে Animal। একমাত্র ধরণের খাঁচা যা সমস্ত দৃষ্টান্ত ধরে রাখতে Catপারে এবং গ্যারান্টিযুক্ত হতে পারে এটি উদাহরণ ছাড়া অন্য কিছু রাখে নাCat, এর একটি খাঁচা Cat। অন্য যে কোনও ধরণের খাঁচা হয় সেটিকে গ্রহণ করার মতো কয়েকটি Catদাবী গ্রহণ করতে অক্ষম হবে, বা এমন উদাহরণ স্বীকার করতে সক্ষম হবে যা উদাহরণস্বরূপ নয় Cat

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