ওওপিতে শূন্য আচরণের বিষয়গুলি - আমার ডিজাইনের দ্বিধা


94

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

এ পর্যন্ত সব ঠিকই.

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

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

মনে করুন আপনার কাছে একটি সাধারণ কার্ড গেম এপিআই রয়েছে। তোমার একটা ক্লাস আছে Card। এখন এই Cardশ্রেণীর খেলোয়াড়দের জন্য দৃশ্যমানতা নির্ধারণ করা দরকার।

ওয়ান ওয়ে আছে হয় boolean isVisible(Player p)উপর Cardবর্গ।

আরেকটি ক্লাসে থাকতে boolean isVisible(Card c)হবে Player

আমি বিশেষত প্রথম পদ্ধতির অপছন্দ করি কারণ এটি উচ্চ স্তরের Playerশ্রেণি সম্পর্কে নিম্ন স্তরের Cardশ্রেণিতে জ্ঞান দেয় ।

পরিবর্তে আমি তৃতীয় বিকল্পটি বেছে নিয়েছি যেখানে আমাদের Viewportক্লাস রয়েছে, যা দেওয়া আছে Playerএবং কার্ডের একটি তালিকা নির্ধারণ করে যে কোন কার্ডগুলি দৃশ্যমান।

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

এটি স্পষ্টতই ওওপির মূল ধারণার পরিপন্থী।

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

পিএস এখানে অন্য উদাহরণ:

ধরুন আপনার ক্লাস রয়েছে DocumentIdযা অপরিবর্তনীয়, কেবলমাত্র একজন BigDecimal idসদস্য এবং এই সদস্যের জন্য প্রাপ্তি রয়েছে। এখন আপনার কোথাও একটি পদ্ধতি থাকা দরকার যা একটি ডাটাবেস থেকে এই DocumentIdআইডিটির Documentজন্য একটি রিটার্ন দিয়েছে ।

আপনি কি:

  • ক্লাসে Document getDocument(SqlSession)পদ্ধতি যুক্ত করুন DocumentId, হঠাৎ করে আপনার অধ্যবসায়ের বিষয়ে জ্ঞান প্রবর্তন ( "we're using a database and this query is used to retrieve document by id"), ডিবি এবং অন্যান্যর মতো অ্যাক্সেস করতে ব্যবহৃত এপিআই। এছাড়াও এই শ্রেণীর এখন কেবল সংকলনের জন্য অধ্যবসায় JAR ফাইল দরকার file
  • ক্লাসটিকে মৃত হিসাবে Document getDocument(DocumentId id)রেখে DocumentId, কোনও আচরণ নয়, কাঠামোর মতো শ্রেণির পদ্ধতি সহ আরও কিছু শ্রেণি যুক্ত করুন।

21
আপনার এখানে কিছু প্রাঙ্গণ সম্পূর্ণ ভুল, যা অন্তর্নিহিত প্রশ্নের উত্তর দেওয়া খুব কঠিন করে তুলছে। আপনার প্রশ্নগুলিকে সংক্ষিপ্ত এবং মতামত মুক্ত রাখুন এবং আপনি আরও ভাল উত্তর পেতে পারবেন।
পিডিআর

31
"এটি স্পষ্টভাবে OOP এর মূল ধারণার বিরুদ্ধে" - না, এটি নয় তবে এটি একটি সাধারণ ভুল fal
ডক ব্রাউন

5
আমার ধারণা এই সমস্যাটি নিহিত রয়েছে যে অতীতে "অবজেক্ট ওরিয়েন্টেশন" এর জন্য বিভিন্ন স্কুল রয়েছে - এটি মূলত অ্যালান কেয়ের মতো লোকেরা বোঝাতে চেয়েছিল ( geewwithblogs.net/theArchitectsNapkin/archive/2013/09/08/ … ), এবং সেই উপায়টি OOA / OOD এর প্রসঙ্গে শিখিয়েছেন যুক্তিযুক্ত ( en.wikedia.org/wiki/Object- ওরিয়েন্টেড_অ্যানালাইসিস_আর_ ডিজাইন ) এর লোকেরা।
ডক ব্রাউন 13

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

5
কে বলে যে বিহিউরিওরলেস ক্লাসগুলি একটি অ্যান্টি-প্যাটার্ন?
জেমস অ্যান্ডারসন

উত্তর:


42

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

মানগুলির ব্যাগ থাকা সম্পর্কে কোনও ত্রুটি নেই, যতক্ষণ না তারা পুরো ল্যান্ডস্কেপকে বিশৃঙ্খলা না করে এবং নিজেরাই যে কাজটি করতে পারে তার জন্য গৃহস্থালি করার জন্য অন্যান্য বস্তুর উপর নির্ভর করে না ।

এটির অবশ্যই একটি গন্ধ হবে যদি আপনার বৈশিষ্ট্যগুলি পরিবর্তনের জন্য পৃথক শ্রেণি Cardথাকে - যদি এটি নিজের পক্ষ থেকে যথাযথভাবে যত্ন নেওয়া আশা করা যায়।

কিন্তু এটা সত্যিই একটি একটি কাজ Cardজানেন যা Playerএটি দেখতে পারছে?

এবং কেন বাস্তবায়ন Card.isVisibleTo(Player p), কিন্তু না Player.isVisibleTo(Card c)? অথবা উলটা?

হ্যাঁ, আপনি যেমনটি করেছিলেন তেমন কোনও নিয়ম নিয়ে আসার চেষ্টা করতে পারেন - যেমন (?) এর Playerচেয়ে বেশি উচ্চ স্তরের হওয়া Card- তবে এটি অনুমান করার মতো সোজা নয় এবং আমাকে একাধিক জায়গায় সন্ধান করতে হবে পদ্ধতি খুঁজে পেতে।

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

কার্ড ও খেলোয়াড়দের মিউচুয়াল দৃশ্যমানতা ভাল একটি প্রসঙ্গ বস্তু কিছু বাছাই দ্বারা নিয়ন্ত্রিত হবে না - এটি হতে Viewport, Dealবা Game

এটি বৈশ্বিক ফাংশনগুলি সমান নয়। সর্বোপরি, অনেকগুলি সমবর্তী গেম থাকতে পারে। নোট করুন যে একই কার্ডটি অনেক টেবিলগুলিতে একই সাথে ব্যবহার করা যেতে পারে। আমরা Cardকোদাল প্রতিটি টেক্কা জন্য অনেক দৃষ্টান্ত তৈরি করতে হবে ?

আমি এখনও বাস্তবায়ন হতে পারে isVisibleToউপর Card, কিন্তু এটা করার জন্য একটি প্রসঙ্গ বস্তু প্রেরণ এবং করতে Cardপ্রতিনিধি জিজ্ঞাস্য। উচ্চ মিলন এড়ানোর জন্য ইন্টারফেসে প্রোগ্রাম।

আপনার দ্বিতীয় উদাহরণ হিসাবে - ডকুমেন্ট আইডি যদি কেবল একটি নিয়ে থাকে তবে BigDecimalকেন এটির জন্য একটি মোড়ক ক্লাস তৈরি করবেন?

আমি বলব আপনার যা দরকার তা হ'ল এক DocumentRepository.getDocument(BigDecimal documentID);

যাইহোক, জাভা থেকে অনুপস্থিত থাকাকালীন, structসি # তে রয়েছে।

দেখা

রেফারেন্সের জন্য। এটি একটি উচ্চ অবজেক্ট-ভিত্তিক ভাষা, তবে কোনটিই এটিকে ছাড়িয়ে যায়।


1
সি # তে কাঠামো সম্পর্কে কেবল একটি নোট: এগুলি কোনও সাধারণ স্ট্রাক্ট নয়, যেমন আপনি সি তে তাদের জানেন know বাস্তবে, তারা উত্তরাধিকার, এনক্যাপসুলেশন এবং পলিমারফিজমে ওওপি সমর্থন করে। কিছু অদ্ভুততা ছাড়াও মূল পার্থক্যটি হ'ল রানটাইম যখন অন্যান্য বস্তুর কাছে চলে যায় তখন উদাহরণগুলি কীভাবে পরিচালনা করে: স্ট্রাকচারগুলি মান ধরণের এবং শ্রেণিগুলি রেফারেন্স ধরণের হয়!
Aschratt

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

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

@ সুপের্যাট এটি একটি পৃথক প্রশ্ন বা চ্যাট অধিবেশনটির উপযুক্ত, তবে আমি বর্তমানে কোনও বিষয়ে আগ্রহী নই :-( আপনি বলেন (সি # তে) "ইন্টারফেস প্রয়োগকারী স্ট্রাকচারগুলি একইভাবে শ্রেণিক বস্তু থেকে আলাদা আচরণ করে"। আমি সম্মত হই যে বিবেচনা করার মতো অন্যান্য আচরণগত পার্থক্য রয়েছে, তবে কোড অনুসরণে এএফএইচির Interface iObj = (Interface)obj;আচরণ বা এর অবস্থান বা অবস্থানের iObjদ্বারা প্রভাবিত হবে না (বাদে এটি যদি এই নিয়োগের ক্ষেত্রে বক্সযুক্ত অনুলিপি হয় তবে )structclassobjstruct
মার্ক হার্ড

150

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

ক্লাসগুলি ওওপিতে একটি মৌলিক ধারণা বলে ধরে নিয়ে আপনি সাধারণ ত্রুটি করছেন । ক্লাসগুলি এনক্যাপসুলেশন অর্জনের একটি বিশেষভাবে জনপ্রিয় উপায়। তবে আমরা এটিকে স্লাইড করার অনুমতি দিতে পারি।

মনে করুন আপনার কাছে একটি সাধারণ কার্ড গেম এপিআই রয়েছে। আপনার একটি ক্লাস কার্ড আছে। এখন এই কার্ড শ্রেণীর প্লেয়ারদের জন্য দৃশ্যমানতা নির্ধারণ করা দরকার।

ভাল স্বাস্থ্যগুলি কোন। আপনি যখন ব্রিজ খেলছেন তখন আপনি কি সাতটি হৃদয়কে জিজ্ঞাসা করবেন যখন ডামির হাতটি কেবল ডামির কাছে পরিচিত কোনও গোপনীয়তা থেকে সবার কাছে পরিচিত হওয়ার সময় বদলানোর সময় আসে? অবশ্যই না. এটি মোটেও উদ্বেগের বিষয় নয়।

একটি উপায় হ'ল কার্ড ক্লাসে বুলিয়ান isVisible (প্লেয়ার পি) রাখা। অন্যটি হ'ল প্লেয়ার ক্লাসে বুলিয়ান ইসভিজিবল (কার্ড সি) রাখা।

দুটোই ভয়াবহ; এগুলির কোনও একটিও করবেন না। প্লেয়ার বা কার্ড কেউই ব্রিজের বিধি বাস্তবায়নের জন্য দায়বদ্ধ নয়!

পরিবর্তে আমি তৃতীয় বিকল্পটি বেছে নিয়েছি যেখানে আমাদের কাছে ভিউপোর্ট ক্লাস রয়েছে যা কোনও প্লেয়ারকে দেওয়া হয়েছে এবং কার্ডের একটি তালিকা নির্ধারণ করে যে কোন কার্ডগুলি দৃশ্যমান।

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

তবে এই পদ্ধতির ফলে কোনও সম্ভাব্য সদস্য ফাংশনের কার্ড এবং প্লেয়ার উভয় শ্রেণিই ছিনিয়ে নেওয়া হয়েছে।

ভাল!

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

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

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

আমি এখানে আপনার সিস্টেমটি ডিজাইন করব।

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

এর পরে, একজন খেলোয়াড়ের প্রকৃতি কী? একজন খেলোয়াড় হ্রাস একটা ক্রম প্রোফাইল ক্রিয়া এবং উৎপন্ন একটি কর্ম

নিয়মের অবজেক্টটি হ'ল এই সমস্তগুলিকে সমন্বয় করে। নিয়মগুলি দৃশ্যমান ক্রিয়াকলাপগুলির ক্রম উত্পাদন করে এবং খেলোয়াড়দের অবহিত করে:

  • প্লেয়ার এক, অন্তরের দশটি আপনার কাছে তিনজন প্লেয়ার হাতে তুলে দিয়েছে।
  • প্লেয়ার টু, একটি কার্ড খেলোয়াড়ের হাতে তিনজন করে খেলোয়াড়ের হাতে দেওয়া হয়েছে।

এবং তারপরে প্লেয়ারকে একটি অ্যাকশনের জন্য জিজ্ঞাসা করে।

  • একজন খেলোয়াড়, আপনি কি করতে চান?
  • খেলোয়াড় এক বলেছেন: thep ত্রিবাল।
  • প্লেয়ার ওয়ান, এটি একটি অবৈধ ক্রিয়া কারণ ট্র্যাবলড আউটপুট একটি অনিবার্য গাম্বিট তৈরি করে।
  • একজন খেলোয়াড়, আপনি কি করতে চান?
  • খেলোয়াড় একজন বলেছেন: কোদালদের রানিকে ফেলে দিন।
  • প্লেয়ার দুই, প্লেয়ার এক কোদাল রাণী ফেলে দিয়েছে has

ইত্যাদি।

আপনার নীতিগুলি থেকে আপনার প্রক্রিয়া আলাদা করুন । খেলার নীতি encapsulated করা উচিত একটি নীতি বস্তু , না কার্ড । কার্ডগুলি কেবল একটি প্রক্রিয়া।


41
@ গ্যানাট: অ্যালান কে'র বিপরীত মতামতটি হ'ল "আসলে আমি" অবজেক্ট-ওরিয়েন্টেড "শব্দটি তৈরি করেছিলাম এবং আমি আপনাকে বলতে পারি যে আমার কাছে সি ++ ছিল না।" এখানে ওও ভাষা নেই যার কোন শ্রেণি নেই; জাভাস্ক্রিপ্ট মনে আসে।
এরিক লিপার্ট

19
@ গ্যানাট: আমি সম্মত হব যে জেএস আজ যেমন দাঁড়িয়ে আছে এটি কোনও ওওপি ভাষার কোনও দুর্দান্ত উদাহরণ নয় তবে এটি দেখায় যে কোনও শ্রেণি ছাড়াই কোনও সহজেই ওও ভাষা তৈরি করতে পারে। আমি সম্মত হই যে আইফেল এবং সি ++ উভয়ের ওও-নেসের মৌলিক ইউনিট বর্গ; যেখানে আমি একমত নই এই ধারণাটি যে ক্লাসগুলি OO এর সাইন কোও নয় । OO এর সাইন কো না হ'ল অবজেক্টস যা আচরণকে আবশ্যক করে এবং একটি সংজ্ঞায়িত পাবলিক ইন্টারফেসের মাধ্যমে একে অপরের সাথে যোগাযোগ করে।
এরিক লিপার্ট

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

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

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

29

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

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

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

  • কোনও অবজেক্ট ওরিয়েন্টেড পদ্ধতিতে ফিবোনাচি ক্রম গণনা করার বিষয়টি বিবেচনা করুন । আমি এটি করার একটি বুদ্ধিমান উপায় সম্পর্কে ভাবতে পারি না; সাধারণ কাঠামোগত প্রোগ্রামিং এই সমস্যার সর্বোত্তম সমাধান দেয়।

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

    static boolean isVisible(Card c, Player p);
    

    এবং সঙ্গে ভুল কিছুই নেই Cardতার পরেও কোন পদ্ধতি না থাকার rankএবং suitaccessors।


11
@ উমাদ হ্যাঁ, এটাই আমার বক্তব্য, এবং এতে কোনও ভুল নেই। কাজের জন্য সঠিক <ডেল> ভাষা </ del> দৃষ্টান্ত ব্যবহার করুন। (যাইহোক, স্মার্টটাক ছাড়াও বেশিরভাগ ভাষাগুলি খাঁটি অবজেক্ট-ভিত্তিক নয় Eg যেমন জাভা, সি # এবং সি ++ অপরিহার্য, কাঠামোগত, প্রক্রিয়াগত, মডুলার, ক্রিয়ামূলক এবং অবজেক্ট-ভিত্তিক প্রোগ্রামিং সমর্থন করে All সমস্ত অ-ও-প্যারাডিম কোনও কারণে উপলব্ধ available : আপনি তাদের ব্যবহার করতে পারেন যাতে)
আমন

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

2
@ শ্যাওয়ার্ন যদি কিছু Fibonacciঅ্যাবস্ট্রাক্ট শ্রেণীর সাবক্লাস হয় তবে Sequenceসিকোয়েন্সটি যে কোনও সংখ্যক সেট দ্বারা ব্যবহৃত হয় এবং বীজ, রাজ্য, ক্যাচিং এবং একটি পুনরুক্তি সংরক্ষণের জন্য দায়ী।
জর্জ রিথ

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

3
ফাইবোনাকিকে পূর্ণসংখ্যার একটি পদ্ধতি তৈরি করা নির্বোধ হবে, কেবল আপনি এটি ওওপি বলতে পারেন। এটি একটি ফাংশন এবং একটি ফাংশনের মতো আচরণ করা উচিত।
ইমিবিস

19

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

এটি একটি শক্ত প্রশ্ন কারণ এটি বেশ কয়েকটি ত্রুটিপূর্ণ প্রাঙ্গনে ভিত্তি করে:

  1. ওওপি কোডটি লেখার একমাত্র বৈধ উপায় The
  2. ওওপি একটি সু-সংজ্ঞায়িত ধারণা The এটি এমন একটি বাজে শব্দে পরিণত হয়েছে যে দু'জন লোককে খুঁজে পাওয়া শক্ত।
  3. ওওপি ডেটা এবং আচরণের বান্ডিল সম্পর্কে idea
  4. সমস্ত কিছু / ধারণা একটি বিমূর্ততা হওয়া উচিত।

আমি # 1-3- তে খুব বেশি স্পর্শ করব না, কারণ প্রত্যেকে তাদের নিজস্ব উত্তর স্প্যান করতে পারে এবং এটি প্রচুর মতামত-ভিত্তিক আলোচনার আমন্ত্রণ জানায়। তবে আমি "ওওপি সংযুক্ত ডেটা এবং আচরণ সম্পর্কে" ধারণাটি বিশেষত উদ্বেগজনক হতে পাই। এটি কেবল # 4 তে নেতৃত্ব দেয় না, এটি এমন ধারণাও বাড়ে যে সবকিছুই একটি পদ্ধতি হওয়া উচিত।

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

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

আপনি isVisibleএই Cardধরণের কোনও পদ্ধতি তৈরি করতে পারবেন না কারণ দৃশ্যমান হওয়া আপনার কার্ডের ধারণার পক্ষে অপরিহার্য নয় (যদি না আপনার কাছে খুব বিশেষ কার্ড থাকে যা ট্রান্সলুসেন্ট বা অস্বচ্ছ হয়ে উঠতে পারে ...)। এটি কি Playerধরণের কোনও পদ্ধতি হওয়া উচিত ? ভাল, এটি সম্ভবত খেলোয়াড়দের একটি সংজ্ঞায়িত মানের নয়। এটি কোনও Viewportধরণের অংশ হওয়া উচিত ? এটি আবার আপনার ভিউপোর্টকে কী হিসাবে সংজ্ঞায়িত করে এবং কার্ডের দৃশ্যমানতা পরীক্ষা করার ধারণাটি ভিউপোর্টকে সংজ্ঞায়িত করার জন্য অবিচ্ছেদ্য কিনা তার উপর নির্ভর করে।

এটি খুব সম্ভব isVisibleকেবল একটি বিনামূল্যে ফাংশন হওয়া উচিত।


1
বুদ্ধিহীন ড্রোনিংয়ের পরিবর্তে সাধারণ জ্ঞানের জন্য +1।
রাইটফোল্ড

আমি যে রেখাগুলি পড়েছি সেগুলি থেকে, আপনি যে লিখিত লিঙ্কটি যুক্ত করেছেন তার মতো দেখতে একটি শক্ত পঠন আমার কাছে কিছুক্ষণ হয়নি।
আর্থার হাভলিসেক

@ আর্থার হাভ্যালিসেক আপনি কোডের নমুনায় ব্যবহৃত ভাষা না বুঝতে পারলে এটি অনুসরণ করা আরও শক্ত, তবে আমি এটি বেশ আলোকিত করে দেখতে পেলাম।
ডোভাল

9

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

না, তারা না। সরল-পুরাতন-ডেটা অবজেক্টগুলি পুরোপুরি বৈধ প্যাটার্ন এবং আমি এমন কোনও প্রোগ্রামে তাদের কাছে প্রত্যাশা করব যা আপনার প্রোগ্রামের স্বতন্ত্র ক্ষেত্রগুলির মধ্যে অব্যাহত রাখা বা যোগাযোগের প্রয়োজন এমন ডেটা নিয়ে কাজ করে।

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

টাইপ করা বা টাইপযুক্ত, ডেটা অবজেক্টগুলির ব্যবহার আপনার প্রোগ্রামে বোধগম্য নয়, তবে এটি তাদের একটি অ্যান্টি-প্যাটার্ন হিসাবে তৈরি করে না। যদি তারা বোঝায়, তাদের ব্যবহার করুন এবং যদি তা না করেন তবে তা ব্যবহার করবেন না।


5
আপনি যা বলেছেন তার সাথে দ্বিমত পোষণ করবেন না, তবে এটি প্রশ্নের কোনও উত্তর দেয় না। বলেছিল, আমি প্রশ্নের উত্তর চেয়ে বেশি দোষী।
পিডিআর

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

1
Plain-Old-Data objects are a perfectly valid pattern আমি বলিনি যে তারা ছিল না, আমি বলছি ভুল হয়েছে যখন তারা অ্যাপ্লিকেশনটির পুরো নীচের অর্ধেকটি জনপস করে।
রকএল

8

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

তবে আমার গেমটিতে আমার কাছে ভিউপোর্টের ধারণা না থাকলে এবং এটি আমার মনে হয় যা আমার প্রয়োজন কারণ অন্যথায় কোডটি "ভুল অনুভব করে"। আমি এটিকে আমার ডোমেন মডেল যুক্ত করার বিষয়ে দু'বার ভাবি।

মডেল শব্দের অর্থ আপনি কোনও কিছুর উপস্থাপনা তৈরি করছেন। আমি এমন একটি শ্রেণি স্থাপনের বিরুদ্ধে সতর্ক করছি যা আপনার প্রতিনিধিত্ব করছেন এমন বিষয় ছাড়িয়ে কিছু বিমূর্তকে উপস্থাপন করে।

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


উপরে লিপার্টের উত্তর এই ধারণার আরও ভাল উদাহরণ।
রিবল্ড এডি

5

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

এটি কীভাবে সমস্যাযুক্ত Card- Playerসমস্যা: ViewPortআপনি যদি দুটি স্বতন্ত্র গ্রন্থাগার হিসাবে বিবেচনা করেন Cardএবং Player(যা বোঝায় Playerকখনও কখনও ব্যবহার না করা হয় Card) তবে বিমূর্ততা তৈরি করা অর্থবোধ করে । যাইহোক, আমি একটি ভাবতে আনত আছি Playerঝুলিতে Cardsএবং প্রদান করা উচিত Collection<Card> getVisibleCards ()তাদের অ্যাকসেসর। এই সমাধানগুলি ( ViewPortএবং খনি) উভয়ই বোধগম্য কোড সম্পর্ক তৈরির ক্ষেত্রে isVisibleএকটি পদ্ধতি হিসাবে Cardবা সরবরাহের চেয়ে ভাল Player

ক্লাসের বাইরে একটি সমাধান অনেকের পক্ষে অনেক ভাল DocumentId। কোনও জটিল ডাটাবেস লাইব্রেরির উপর নির্ভর করে (মূলত একটি পূর্ণসংখ্যা) তৈরি করার জন্য কিছুটা অনুপ্রেরণা নেই।


আমি আপনার ব্লগ পছন্দ করি।
রকএল

3

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

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

আমি মনে করি বিষয়টি বনাম প্লেয়ারে কার্ডের উপর নির্ভরযোগ্য হবে কিনা তা নিয়ে কিছুটা স্পর্শকাতর হয়ে উঠেছে; এটি নিখুঁত উদাহরণস্বরূপ উদাহরণস্বরূপ, নিখুঁত was

আমি হাতের কাছে সমস্যাটি দেখার জন্য এখানে অভিজ্ঞদের ধাক্কা দিয়েছিলাম। আমি মনে করি যে ইউ ম্যাড একটি উত্তম প্রশ্ন রেখেছেন। আমি বুঝতে পারি যে আপনি বিধিগুলি এবং সম্পর্কিত যুক্তিকে তার নিজস্ব কোনও বস্তুর দিকে ঠেলে দেবেন; তবে আমি বুঝতে পারি প্রশ্নটি

  1. সরল ডেটা হোল্ডার কনস্ট্রাক্টস (ক্লাস / স্ট্রাক্টস; তারা এই প্রশ্নটির মডেল কী সে সম্পর্কে আমি কিছুই চিন্তা করি না) ঠিক আছে যা সত্যিকার অর্থে খুব কার্যকারিতা দেয় না?
  2. যদি হ্যাঁ, তাদের মডেল করার সর্বোত্তম বা পছন্দের উপায় কী?
  3. যদি না হয়, আমরা কীভাবে এই ডেটা কাউন্টার অংশগুলিকে উচ্চতর API শ্রেণিতে (আচরণ সহ) অন্তর্ভুক্ত করব

আমার মতে:

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


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

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

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

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

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

2

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

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

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


0

তবে এই পদ্ধতির ফলে কোনও সম্ভাব্য সদস্য ফাংশনের কার্ড এবং প্লেয়ার উভয় শ্রেণিই ছিনিয়ে নেওয়া হয়েছে।

এবং কীভাবে খারাপ / খারাপ পরামর্শ দেওয়া হয়?

আপনার কার্ডের উদাহরণের সাথে অনুরূপ উপমা ব্যবহার করতে, ক Car, ক বিবেচনা করুন Driverএবং আপনাকে এটি নির্ধারণ করতে হবে যে এটি Driverড্রাইভ করতে পারে কিনা Car

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

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

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