ওওপি-র পেছনের মূল ধারণাটি হ'ল ডেটা এবং আচরণ (সেই ডেটার উপর) অবিচ্ছেদ্য এবং সেগুলি এক শ্রেণীর কোনও অবজেক্টের ধারণার সাথে মিলিত হয়। অবজেক্টের এমন ডেটা এবং পদ্ধতি রয়েছে যা সেই (এবং অন্যান্য ডেটা) সাথে কাজ করে। স্পষ্টতই ওওপি নীতিমালা দ্বারা, অবজেক্টগুলি কেবলমাত্র ডেটা (সি স্ট্রাক্টের মতো) একটি অ্যান্টি-প্যাটার্ন হিসাবে বিবেচিত হয়।
এ পর্যন্ত সব ঠিকই.
সমস্যাটি আমি লক্ষ্য করেছি যে আমার কোড ইদানীং এই অ্যান্টি-প্যাটার্নের দিকে আরও বেশি করে চলেছে বলে মনে হচ্ছে। আমার কাছে মনে হয় যে আমি ক্লাস এবং আলগা দম্পতির নকশাগুলির মধ্যে লুকিয়ে থাকা তথ্য অর্জনের জন্য যত বেশি চেষ্টা করি, তত বেশি আমার ক্লাসগুলি নির্ভুল ডেটা, কোনও আচরণের ক্লাস এবং সমস্ত আচরণের কোনও ডেটা ক্লাসের মিশ্রণ হতে পারে না।
আমি সাধারণত ক্লাসগুলি এমনভাবে ডিজাইন করি যা অন্য শ্রেণীর অস্তিত্ব সম্পর্কে তাদের সচেতনতা হ্রাস করে এবং অন্যান্য শ্রেণিগুলির ইন্টারফেসগুলি সম্পর্কে তাদের জ্ঞানকে হ্রাস করে। আমি বিশেষত এটি টপ-ডাউন ফ্যাশনে প্রয়োগ করি, নিম্ন স্তরের শ্রেণিগুলি উচ্চ স্তরের শ্রেণি সম্পর্কে জানে না। উদাহরণ:
মনে করুন আপনার কাছে একটি সাধারণ কার্ড গেম এপিআই রয়েছে। তোমার একটা ক্লাস আছে 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, কোনও আচরণ নয়, কাঠামোর মতো শ্রেণির পদ্ধতি সহ আরও কিছু শ্রেণি যুক্ত করুন।