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