সদস্য ফাংশন বনাম গণিত অপারেটরদের জন্য অ-সদস্য ফাংশন


12

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

আমি কৌতূহল ছিলাম যে এই ধরণের ফাংশনের জন্য "সেরা অনুশীলন" কী ... এটি কি আমার এই ফাংশনটিকে সদস্য ফাংশন, বা সদস্যহীন করা উচিত? (স্পষ্টতা / গ্রন্থাগার ব্যবহারের জন্য)

উদাহরণ:

//Member function way:
B = A.transpose();
C = A.inverse();

//Non-member function way:
B = linalg::transpose(A); //Non-member transpose function in linear algebra namespace
C = linalg::inverse(A);

এই ধরণের অপারেশন সম্পর্কে কিছু মান আছে? বা, কমপক্ষে, কোনও সাধারণ উপায়ে কি লোকেরা এটি করে? আমি প্রথম বিকল্পের দিকে ঝুঁকছি, তবে আমি এটির প্রস্তাবিত কিনা তা জানতে চাই।

উত্তর:


7

এটি কেবল স্টাইল এবং স্বাদের বিষয়। আমি বিভিন্ন লিনিয়ার বীজগণিত গ্রন্থাগার দেখেছি, হয়

  • সদস্য ফাংশনগুলি ব্যবহার করে একটি ওওপি শৈলীতে লেখা

  • কেবল নিখরচায় ফাংশন ব্যবহার করে অ-ওওপি শৈলীতে লেখা

  • উভয়ের সাথে একটি API সরবরাহ করে

এবং তাদের সবাই কাজ করছিল। কমপক্ষে, আপনার এপিআই সামঞ্জস্যপূর্ণ হওয়া উচিত, তাই আপনার পছন্দ চয়ন করুন এবং নিশ্চিত করুন যে আপনি এই শৈলীগুলিকে যথেচ্ছ মিশ্রিত করছেন না।


8

সদস্যপদ ফি এড়িয়ে চলুন: যেখানে সম্ভব, ফাংশন নন-মেমার ননফ্রেন্ড বানানো পছন্দ করুন।

ননমেম্বার ননফ্রেন্ড ফাংশন নির্ভরতা হ্রাস করে এনক্যাপসুলেশন উন্নত করে: ফাংশনের মূল অংশটি ক্লাসের অ-প্রজাতন্ত্র সদস্যের উপর নির্ভর করতে পারে না (আইটেম 11 দেখুন)। তারা পৃথকযোগ্য কার্যকারিতা মুক্ত করতে একচেটিয়া ক্লাসগুলিও ভেঙে দেয় এবং আরও সংযোজন হ্রাস করে (আইটেম 33 দেখুন)। তারা উদারতার উন্নতি করে, কারণ এমন টেমপ্লেটগুলি লেখা শক্ত যেগুলি কোনও নির্দিষ্ট ধরণের একটি অপারেশন সদস্য কিনা তা জানে না [...]

ভেষজ সুটার


1
শেষ পর্যন্ত একটি ভাল উত্তর: দেরী, তবে খুব বেশি দেরি হয়নি। : আরেকটি রেফারেন্স ;-) GotW # 84: Monoliths "তার-খোলা"
Deduplicator

1

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

তবে, মনে রাখবেন যে সময়ে সময়ে কম্পিউটার বিজ্ঞানীরা আপনার সত্যিকারের কাজটি সর্বদা না জেনে জটিল গণিত সূত্রটি প্রয়োগ করতে হবে। যখন আমাকে এটি করতে হবে, আমি অ-সদস্য ফাংশনগুলি পছন্দ করি যেহেতু "ভিজ্যুয়াল" ফলাফলটি মূল গণিতের সূত্রের আরও নিকটবর্তী হবে (যেহেতু গণিত সূত্রটি সাধারণত কার্যকরী শৈলী ব্যবহার করে)।

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


0

যদি আপনি আপনার সমস্যার বিবৃতিতে আরও গভীরভাবে ডুব দেন তবে এটি স্পষ্ট যে কোনও সময় আপনি কাস্টম ডেটা স্ট্রাকচার ব্যবহার করবেন যা নির্দিষ্ট গাণিতিক সত্তাকে উপস্থাপন করে। উদাহরণস্বরূপ, আপনি কোনও মেট্রিক্সকে একটি n- মাত্রিক অ্যারের উপস্থাপন করতে পারেন। আপনার উদাহরণটি বিস্তারিতভাবে জানাতে,

// C way
typedef struct {
    int data[MAX_LEN][MAX_LEN];
} MATRIX;

MATRIX B = transpose(A);

// C++ way
class Matrix; // Forward Declaration
class Matrix {
    int data[MAX_LEN][MAX_LEN];
    public:
        Matrix transpose();
};

Matrix B = A.transpose();

(সি ++ উদাহরণটি সরল করে দেওয়া হয়েছে, আপনি টেমপ্লেট এবং এগুলি ব্যবহার করতে পারেন))

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

এটিকে শেষ করতে, আপনি যদি সি ++ ব্যবহার করছেন তবে অবশ্যই কোনও অবজেক্ট অরিয়েন্টেড পদ্ধতির প্রস্তাব দেওয়া হচ্ছে।


5
দুঃখিত, আপনার যুক্তিতে খুব কম দৃ fact় সত্য নেই। আপনার দুটি transposeউদাহরণের মধ্যে ব্যবহারের স্বাচ্ছন্দ্যের কোনও পার্থক্য নেই । সি ++ অর্থাত্ সহজ কারণ হ'ল অনুলিপি এবং অ্যাসাইনমেন্ট শব্দার্থক প্রকৃতপক্ষে কাজ করে। A = Bসি তে সংকলন করতে পারে তবে সম্ভবত ভুল কাজ করে।
এমসাল্টাররা

অনুলিপি শব্দার্থবিজ্ঞানের জন্য +1 আমি যে পয়েন্টটি পেতে চেষ্টা করছিলাম সেটি হ'ল অবজেক্টগুলি ("উপস্থাপনাগুলির উপরে" এনক্যাপসুলেশনগুলি) ভি / গুলি আলগাভাবে কাঠামোগত সেট এবং সম্পর্কিত ফাংশনগুলি ব্যবহার করে।
dotbugfix
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.