শ্রেণি যা কোনও কিছুর প্রতিনিধিত্ব করে না - এটি কি সঠিক?


42

আমি কেবল আমার অ্যাপ্লিকেশনটি ডিজাইন করছি এবং আমি নিশ্চিত না যে আমি সলিড এবং ওওপি সঠিকভাবে বুঝতে পারি কিনা। ক্লাসগুলির 1 টি কাজ করা উচিত এবং এটি ভালভাবে করা উচিত কিন্তু অন্যদিকে তাদের উচিত আমাদের সাথে কাজ করা আসল বস্তুর প্রতিনিধিত্ব করা উচিত।

আমার ক্ষেত্রে আমি একটি ডেটাসেটে একটি বৈশিষ্ট্য নিষ্কাশন করি এবং তারপরে আমি একটি মেশিন লার্নিং বিশ্লেষণ করি। আমি ধরে নিই যে আমি তিনটি ক্লাস তৈরি করতে পারি

  1. FeatureExtractor
  2. ডেটা সেটটি
  3. বিশ্লেষক

তবে ফিচারএক্ট্র্যাক্টর শ্রেণি কোনও কিছুর প্রতিনিধিত্ব করে না, এটি এমন কিছু করে যা এটি ক্লাসের চেয়ে একটি রুটিনকে আরও বেশি করে তোলে। এটিতে কেবল একটি ফাংশন থাকবে যা ব্যবহার করা হবে: extract_features ()

এমন একটি ক্লাস তৈরি করা কি সঠিক যা একটি জিনিস প্রতিনিধিত্ব করে না তবে একটি জিনিস করে?

সম্পাদনা: এটি গুরুত্বপূর্ণ কিনা তা নিশ্চিত নয় তবে আমি পাইথন ব্যবহার করছি

এবং যদি extract_features () এর মতো দেখতে পাওয়া যায়: এই পদ্ধতিটি ধরে রাখতে কোনও বিশেষ শ্রেণি তৈরি করা কি মূল্য?

def extract_features(df):
    extr = PhrasesExtractor()
    extr.build_vocabulary(df["Text"].tolist())

    sent = SentimentAnalyser()
    sent.load()

    df = add_features(df, extr.features)
    df = mark_features(df, extr.extract_features)
    df = drop_infrequent_features(df)
    df = another_processing1(df)
    df = another_processing2(df)
    df = another_processing3(df)
    df = set_sentiment(df, sent.get_sentiment)
    return df

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

31
অজানা থাকুন যে পাইথনের নন-ওও পদ্ধতির ব্যবহারটি বেশ সাধারণ এবং গ্রহণযোগ্য।
jpmc26

13
আপনি ডোমেন চালিত ডিজাইনে আগ্রহী হতে পারেন। "ক্লাসগুলি প্রকৃত বিশ্ব থেকে বস্তুর প্রতিনিধিত্ব করা উচিত" আসলে মিথ্যা ... তাদের ডোমেনে বস্তুর প্রতিনিধিত্ব করা উচিত । ডোমেনটি প্রায়শই বাস্তব বিশ্বের সাথে দৃ strongly়ভাবে সংযুক্ত থাকে তবে অ্যাপ্লিকেশনটির উপর নির্ভর করে কিছু জিনিস অবজেক্ট হিসাবে বিবেচিত হতে পারে বা নাও বিবেচনা করতে পারে বা "বাস্তবে" পৃথক কিছু জিনিস অ্যাপ্লিকেশনটির ডোমেনের অভ্যন্তরে লিঙ্কযুক্ত বা অভিন্ন হতে পারে।
বাকুরিউ

1
আপনি ওওপি-র সাথে আরও পরিচিত হওয়ার সাথে সাথে আমার মনে হয় আপনি ক্লাসগুলি খুব কমই বাস্তব-বিশ্বের সত্তার সাথে এক-সাথে-একের সাথে মিল রাখছেন। উদাহরণস্বরূপ, এখানে একটি প্রবন্ধ এখানে যুক্তিযুক্ত যে একটি একক শ্রেণীর মধ্যে একটি বাস্তব-জগত সত্তার সাথে সম্পর্কিত সমস্ত কার্যকারিতা খুব ঘন ঘন একটি বিরোধী নিদর্শন: প্রোগ্রামার
৯৯.ththings.oreilly.com/wiki/index.php/…

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

উত্তর:


96

শ্রেণীর 1 টি কাজ করা উচিত এবং এটি ভালভাবে করা উচিত

হ্যাঁ, এটি সাধারণত একটি ভাল পদ্ধতির।

তবে অন্যদিকে তাদের আসল বস্তুর প্রতিনিধিত্ব করা উচিত যা আমরা কাজ করি।

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

যাইহোক, আপনি এই সঙ্গে থামানো উচিত নয় !

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

পার্শ্ব দ্রষ্টব্য: পাইথনের মতো ভাষাগুলি যা পৃথক মডিউল ধারণাকে সমর্থন করে তারা এর জন্য একটি মডিউলও ব্যবহার করতে পারে FeatureExtractorতবে এই প্রশ্নের প্রসঙ্গে এটি আইএএমএইচও একটি নগণ্য পার্থক্য।

তদুপরি, একটি "বৈশিষ্ট্য নিষ্কাশনকারী" "ব্যক্তি বা বট যা বৈশিষ্ট্যগুলি বের করে" হিসাবে কল্পনা করা যায়। এটি একটি বিমূর্ত "জিনিস", সম্ভবত আপনি আসল বিশ্বে খুঁজে পাবেন এমন কোনও জিনিস নয়, তবে নামটি নিজেই একটি দরকারী বিমূর্ততা, যা প্রত্যেককে এই শ্রেণীর দায়িত্ব কী তা একটি ধারণা দেয়। সুতরাং আমি একমত নই যে এই শ্রেণিটি "কোনও কিছুর প্রতিনিধিত্ব করে না"।


33
আমি বিশেষ করে পছন্দ করি যে আপনি অভ্যন্তরীণ রাষ্ট্রের বিষয়টি উল্লেখ করেছেন। আমি প্রায়শই পাই যে পাইথনে আমি কোনও কিছু ক্লাস করি বা ফাংশন করি কিনা এর জন্য সিদ্ধান্তের কারণ।
ডেভিড জেড

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

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

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

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

44

ডক ব্রাউন স্পট-অন: ক্লাসগুলিতে রিয়েল-ওয়ার্ল্ড অবজেক্টের প্রতিনিধিত্ব করার দরকার নেই। তাদের কেবল দরকারী হতে হবে । ক্লাস মৌলিকভাবে নিছক অতিরিক্ত ধরনের হয়, এবং কি করে intবা stringমিলা বাস্তব জগতে কিভাবে? এগুলি বিমূর্ত বর্ণনা, কংক্রিট, স্পষ্ট জিনিস নয়।

বলেছিল, তোমার কেস বিশেষ। আপনার বিবরণ অনুযায়ী:

এবং যদি extract_features () এর মতো দেখতে পাওয়া যায়: এই পদ্ধতিটি ধরে রাখতে কোনও বিশেষ শ্রেণি তৈরি করা কি মূল্য?

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

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

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

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


এটি যুক্ত করে দরকারী হবে যে উদাহরণে ডাকা ফাংশনগুলি যদি প্রকৃতপক্ষে ব্যক্তিগত ফাংশন হয় তবে মডিউল বা শ্রেণিতে সেগুলি আবদ্ধ করা পুরোপুরি উপযুক্ত। অন্যথায়, আমি সম্পূর্ণ একমত।
Leliel

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

3
এছাড়াও "ক্লাস বনাম ফ্রি-স্ট্যান্ডিং ফাংশন" সম্পর্কিত বিষয়: eev.ee/blog/2013/03/03/…
জোকার_ভিডি

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

1
@ জিমি জেমস রাইট পুরো বিষয়টি হ'ল তারা নির্দিষ্ট উদ্দেশ্যে একই কার্যকারিতা সরবরাহ করে তবে ব্যবহার করা সহজ।
কনরাড রুডল্ফ

36

আমি কেবল আমার অ্যাপ্লিকেশনটি ডিজাইন করছি এবং আমি নিশ্চিত না যে আমি সলিড এবং ওওপি সঠিকভাবে বুঝতে পারি কিনা।

এই 20 বছরেরও বেশি সময় ধরে এসেছি এবং আমিও নিশ্চিত নই।

শ্রেণীর 1 টি কাজ করা উচিত এবং এটি ভালভাবে করা উচিত

এখানে ভুল করা কঠিন।

তাদের সাথে কাজ করা প্রকৃত বস্তুর প্রতিনিধিত্ব করা উচিত।

ওহ সত্যিই? আমাকে সব সময় একক সবচেয়ে জনপ্রিয় এবং সফল বর্গ সাথে আপনাকে পরিচয় করিয়ে যাক: String। আমরা এটি পাঠ্যের জন্য ব্যবহার করি। এবং এটি প্রতিনিধিত্ব করে আসল বিশ্বের অবজেক্টটি হ'ল:

ফিশারম্যান কর্ডের স্ট্রিং থেকে 10 টি মাছ স্থগিত করেছে

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

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

এখন নিশ্চিত, আপনি এটি সম্পর্কে এটি ভাবতে পারেন:

একটি স্ট্রিং থেকে উত্সবযুক্ত চিঠিগুলি স্থিত করে "লেটস ডু থিংস!"

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


1
ছবিগুলির একটি দুর্দান্ত স্ট্রিং ...
জেভ স্পিটজ

এই মুহুর্তে আমি নিশ্চিত নই যে "স্ট্রিং" এমনকি রূপক is এটি শুধু একটি নির্দিষ্ট প্রোগ্রামিং ডোমেইনে অর্থ আছে, মত শব্দ না classএবং tableএবং column...
Kyralessa

@ ক্যারলেস আপনি নতুনকে রূপকটি শিখিয়েছেন বা আপনি তাদের কাছে যাদু হতে দিন। যাদুতে বিশ্বাসী কোডারদের থেকে দয়া করে আমাকে বাঁচান।
candied_orange

6

সতর্ক থাকুন! কোথাও সলিড বলে না যে কোনও শ্রেণীর কেবল "একটি জিনিস করা উচিত"। যদি এটি হয় তবে ক্লাসগুলির কেবলমাত্র একটি পদ্ধতি থাকত এবং ক্লাস এবং ফাংশনগুলির মধ্যে সত্যই কোনও পার্থক্য থাকত না।

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

এর মুল বক্তব্যটি - যদি প্রয়োজনীয়তার কোনও পরিবর্তন হয় তবে আপনাকে আদর্শভাবে কেবল একটি একক শ্রেণিটি পরিবর্তন করতে হবে। এটি কেবল কোডটি বোঝার জন্য সহজ করে তোলে, সংশোধন করা সহজ করে এবং ঝুঁকি হ্রাস করে।

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

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


"যদি আপনি কোনও ফাংশন দিয়ে এটি সমাধান করতে পারেন তবে ক্লাস করার দরকার নেই" এর জন্য +1। কখনও কখনও কারও কাছে সত্য কথা বলা দরকার।
tchrist

5

এমন একটি ক্লাস তৈরি করা কি সঠিক যা একটি জিনিস প্রতিনিধিত্ব করে না তবে একটি জিনিস করে?

সাধারণভাবে এটি ঠিক আছে।

একটু বেশি নির্দিষ্ট বিবরণ ছাড়াই FeatureExtractorক্লাসটি ঠিক কী করা উচিত তা বলা মুশকিল।

যাইহোক, এমনকি যদি FeatureExtractorকেবল কোনও প্রকাশ্য extract_features()ক্রিয়াকলাপ উদ্ঘাটিত হয় তবে আমি এটিকে কোনও Strategyশ্রেণীর সাথে কনফিগার করার কথা ভাবতে পারি , যা নির্ধারণ কীভাবে করা উচিত তা নির্ধারণ করে।

আরেকটি উদাহরণ একটি সঙ্গে একটি ক্লাস হয় টেমপ্লেট ফাংশন

এবং আরও আচরণগত ডিজাইন প্যাটার্ন রয়েছে , যা শ্রেণি মডেলগুলির উপর ভিত্তি করে।


আপনি স্পষ্টতার জন্য কিছু কোড যুক্ত হিসাবে।

এবং যদি extract_features () এর মতো দেখতে পাওয়া যায়: এই পদ্ধতিটি ধরে রাখতে কোনও বিশেষ শ্রেণি তৈরি করা কি মূল্য?

লাইন

 sent = SentimentAnalyser()

আমি কী বোঝাতে চাইছিলাম তা হুবহু অন্তর্ভুক্ত যা আপনি কোনও কৌশল সহ কোনও শ্রেণি কনফিগার করতে পারেন ।

আপনার যদি সেই SentimentAnalyserশ্রেণীর জন্য একটি ইন্টারফেস থাকে , তবে আপনি FeatureExtractorআপনার ফাংশনে সেই নির্দিষ্ট প্রয়োগের সাথে সরাসরি মিলিত না হয়ে, এটি নির্মাণের পর্যায়ে শ্রেণিতে পাস করতে পারেন ।


2
আমি FeatureExtractorআরও জটিলতা ( SentimentAnalyserশ্রেণীর জন্য একটি ইন্টারফেস) প্রবর্তনের জন্য জটিলতা (একটি শ্রেণি) যুক্ত করার কারণ দেখছি না । যদি ডিকোপলিংয়ে কাম্য হয় তবে ফাংশনটি একটি আর্গুমেন্ট হিসাবে extract_featuresগ্রহণ করতে get_sentimentপারে ( loadকলটি ফাংশন থেকে স্বতন্ত্র বলে মনে হয় এবং কেবল এটির প্রভাবের জন্য ডাকা হয়েছিল)। এছাড়াও লক্ষ করুন যে পাইথনের ইন্টারফেসগুলি / উত্সাহিত করে না।
ওয়ারবো

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

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

0

প্যাটার্নস এবং সমস্ত অভিনব ভাষা / ধারণাগুলি একপাশে: আপনি যেটি হোঁচট খেয়েছেন তা হ'ল একটি চাকরী বা ব্যাচ প্রক্রিয়া

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

এমন একটি ক্লাস তৈরি করা কি সঠিক যা একটি জিনিস প্রতিনিধিত্ব করে না তবে একটি জিনিস করে?

আপনার শ্রেণি এমন একটি সত্তাকে প্রতিনিধিত্ব করে যা কিছু করে এবং অন্য কিছুকে অর্কেস্টেট করে। আপনি এর নাম রাখতে পারেন কন্ট্রোলার , জব , মেইন বা যা কিছু মনে আসে।

এবং যদি extract_features () এর মতো দেখতে পাওয়া যায়: এই পদ্ধতিটি ধরে রাখতে কোনও বিশেষ শ্রেণি তৈরি করা কি মূল্য?

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


3
নোট করুন যে এর মতো পরিস্থিতিতে, স্বতন্ত্র পদ্ধতিতে "পদ্ধতি" কল করা বিভ্রান্তিকর হতে পারে। পাইথন সহ বেশিরভাগ ভাষা তাদের "ফাংশন" বলে। "পদ্ধতি" হ'ল ফাংশন / পদ্ধতি যা কোনও শ্রেণীর নির্দিষ্ট উদাহরণের সাথে আবদ্ধ, যা আপনার শব্দটির ব্যবহারের বিপরীত :)
ওয়ারবো

যথেষ্ট, @ ওয়ারবো। অথবা আমরা তাদের প্রক্রিয়া বলতে পারি বা ডিফন বা সাব বা ... বা; এবং সেগুলি ক্লাস পদ্ধতি হতে পারে (উদাহরণস্বরূপ) উদাহরণের সাথে সম্পর্কিত নয়। আমি আশা করি সৌম্য পাঠক নির্ধারিত অর্থটি বিমূর্ত করতে সক্ষম হবেন। :)
AnoE

@ ওয়ার্বো এটা জানা ভাল! বেশিরভাগ শিক্ষণ সামগ্রীর মধ্যে আমি এসেছি যে পদগুলি ফাংশন এবং পদ্ধতিটি বিনিময়যোগ্য এবং এটি কেবল একটি ভাষা-নির্ভর পছন্দ।
ডোম

@ ডোম সাধারণভাবে একটি ("খাঁটি") "ফাংশন" হ'ল ইনপুট মানগুলি থেকে আউটপুট মানগুলিতে ম্যাপিং; একটি "পদ্ধতি" একটি ফাংশন যা প্রভাবও তৈরি করতে পারে (যেমন কোনও ফাইল মুছে ফেলা); উভয়ই স্থিতিশীলভাবে প্রেরণ করা হয় (অর্থাত্ ল্যাজিকাল স্কোপে দেখানো হয়)। একটি "পদ্ধতি" একটি ফাংশন বা (সাধারণত) পদ্ধতি যা গতিশীলভাবে একটি মান (একটি "অবজেক্ট" বলা হয়) থেকে প্রেরণ করা হয় (দেখায়), যা স্বয়ংক্রিয়ভাবে পদ্ধতির একটি (অন্তর্নিহিত thisবা স্পষ্ট self) যুক্তিতে আবদ্ধ । কোনও অবজেক্টের পদ্ধতিগুলি পারস্পরিকভাবে "খোলামেলাভাবে" পুনরাবৃত্ত হয়, সুতরাং প্রতিস্থাপনের fooফলে সমস্ত self.fooকলগুলি এই প্রতিস্থাপনটি ব্যবহার করে।
ওয়ারবো

0

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

যদি আমাদের কাঙ্ক্ষিত সিস্টেমটি একবারে সমস্ত মডেল করার জন্য জটিল হয় তবে আমরা এটিকে ছোট ছোট টুকরো টুকরো টুকরো টুকরো করে কেটে ফেলতে পারি ("সমস্যাটি ডোমেন"), যা আরও ভেঙে জড়িত থাকতে পারে, এবং যতক্ষণ না আমাদের আচরণের সাথে টুকরো টুকরো হয়ে যায় until (আরও বা কম) কিছু অন্তর্নির্মিত ভাষা অবজেক্টের মতো একটি সংখ্যা, একটি স্ট্রিং, একটি তালিকা ইত্যাদি

আমাদের যখন এই সাধারণ টুকরাগুলি হয়ে যায়, তখন আমরা বৃহত টুকরোগুলির আচরণ বর্ণনা করতে তাদের একত্রিত করতে পারি, যা আমরা একসাথে আরও বড় টুকরোতে একত্রিত করতে পারি, এবং যতক্ষণ না আমরা সম্পূর্ণরূপে প্রয়োজনীয় ডোমেনের সমস্ত উপাদান বর্ণনা করতে পারি পদ্ধতি.

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

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

আমাদের ডোমেন মডেলটি একবার হয়ে গেলে, আমরা সেই টুকরোগুলির কয়েকটি নির্দিষ্ট উদাহরণ নিতে পারি এবং সেই মডেলটি নির্দিষ্ট করতে চাই এমন একটি সিস্টেমের "সিমুলেশন" তৈরি করতে পারি (উদাহরণস্বরূপ "মেশিন লার্নিং সিস্টেম ...")।

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


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


এই ধরণের ধারণাগুলি সম্পর্কে শিখার সময় একটি জিনিস মনে রাখবেন যে বিভিন্ন ভাষা বিভিন্ন অন্তর্নির্মিত বৈশিষ্ট্য এবং অবজেক্ট সরবরাহ করতে পারে (এবং, অবশ্যই কিছু "অবজেক্ট" এর মতো পরিভাষাও ব্যবহার করে না!)। সুতরাং যে সমাধানগুলি একটি ভাষায় বোঝায় সেগুলি অন্য ভাষায় কম কার্যকর হতে পারে (এটি এমনকি একই ভাষার বিভিন্ন সংস্করণে প্রযোজ্য হতে পারে!)।

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

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

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


0

ব্যবহারিকভাবে বলতে গেলে, যখন আমার একটি "বিবিধ জিনিস রয়েছে যা গুরুত্বপূর্ণ কিছু করে এবং পৃথক হওয়া উচিত", এবং এর কোনও পরিষ্কার বাড়ি নেই, আমি এটিকে একটি Utilitiesবিভাগে রেখেছি এবং এটি আমার নামকরণ কনভেনশন হিসাবে ব্যবহার করি। অর্থাত। FeatureExtractionUtility

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

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