সংখ্যার অ্যালগোরিদমকে encapsulate করতে ক্লাস ব্যবহারের অন্তর্নিহিত সুবিধা এবং অসুবিধাগুলি কী কী?


13

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

এটি সুপারিশ করে যে কোনও ফাংশন, শ্রেণি নয়, বৈজ্ঞানিক কম্পিউটিংয়ের ক্ষেত্রে দেখা বেশিরভাগ অ্যালগরিদমের প্রাকৃতিক ইন্টারফেস। তবুও এই যুক্তি জটিল, বহু-অংশীত অ্যালগরিদমগুলি কীভাবে পরিচালনা করা উচিত সে সম্পর্কে সামান্য অন্তর্দৃষ্টি দেয়।

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

class multigrid {
    private:
        x_, b_
        [grid structure]

        restrict(...)
        interpolate(...)
        relax(...)
    public:
        multigrid(x,b) : x_(x), b_(b) { }
        run()
}

multigrid::run() {
     [call restrict, interpolate, relax, etc.]
}

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


2
যখন আপনার শ্রেণীর নাম বিশেষ্য না হয়ে বিশেষণ হয় তখন এটি সর্বদা একটি খারাপ চিহ্ন sign
ডেভিড কেচসন

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

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

উত্তর:


13

15 বছর ধরে সংখ্যাসূচক সফটওয়্যারটি করার পরে, আমি নির্বিঘ্নে নিম্নলিখিতটি জানাতে পারি:

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

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

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

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


16

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

ইন্টারফেস ভাল। একটি বাস্তবায়নের উপর নির্ভর করে খারাপ। আপনি সি ++ ক্লাস, সি অবজেক্টস, হাস্কেল টাইপচ্লাছস বা অন্য কোনও ভাষার বৈশিষ্ট্য ব্যবহার করে এটি অর্জন করেছেন কিনা তা অসম্পূর্ণ। একটি ইন্টারফেসের ক্ষমতা, দৃust়তা এবং এক্সটেনসিবিলিটি বৈজ্ঞানিক লাইব্রেরিতে গুরুত্বপূর্ণ।


8

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

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

solve(ddt(U) + div(phi, U)  == rho*g + ...);

পরিবহনের মডেল, টার্বুলেন্স মডেল, ডিফারেন্সিং স্কিম, গ্রেডিয়েন্ট স্কিম, সীমানা শর্ত ইত্যাদির স্তরক্রমগুলি সি ++ শ্রেণির (আবার, টেনসর পরিমাণে জেনেরিক) পদে প্রয়োগ করা হয়।

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

শ্রেণিবদ্ধ কাঠামো ==> শ্রেণি

পদ্ধতিগত, ফ্লো চার্ট ==> অ্যালগরিদম


5

যদিও এটি একটি পুরানো প্রশ্ন, আমি মনে করি এটি জুলিয়ার বিশেষ সমাধানটি উল্লেখ করার মতো । এই ভাষাটি যা করে "ক্লাস-লিস্ট ওওপি": মূল নির্মানগুলি হ'ল structসি, যেমন যৌগিক ডেটা অবজেক্টস যা উত্তরাধিকারের সম্পর্ককে সংজ্ঞায়িত করা হয়। প্রকারগুলিতে "সদস্য ফাংশন" থাকে না, তবে প্রতিটি ফাংশনের স্বাক্ষর রয়েছে এবং উপ-টাইপ গ্রহণ করে। উদাহরণস্বরূপ, আপনি একটি বিমূর্ত হতে পারে Matrixধরন এবং উপশাখাকে DenseMatrix, SparseMatrixএবং একটি জেনেরিক পদ্ধতি আছে do_something(a::Matrix, b::Matrix)বিশেষজ্ঞতা সঙ্গে do_something(a::SparseMatrix, b::SparseMatrix)। কল করার জন্য সবচেয়ে উপযুক্ত সংস্করণ নির্বাচন করতে একাধিক প্রেরণ ব্যবহৃত হয়।

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

প্রধান পার্থক্য হ'ল পদ্ধতিগুলি ক্লাসের অন্তর্গত নয় তবে এগুলি পৃথক সত্তা হিসাবে উপস্থিত রয়েছে এবং উত্তরাধিকার সমস্ত পরামিতিগুলিতে ঘটতে পারে।

কিছু উল্লেখ:

http://docs.julialang.org/en/release-0.4/manual/methods/

http://assoc.tumblr.com/post/71454527084/cool-things-you-can-do-in-julia

https://thenewphalls.wordpress.com/2014/03/06/understanding-object-oriented-programming-in-julia-inheritance-part-2/


1

ওও পদ্ধতির দুটি সুবিধা হতে পারে:

  • βαcalculate_alpha()αcalculate_beta()calculate_alpha()α

  • calculate_f()f(x,y,z)zset_z()zcalculate_f()z

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