আপনি কি "খালি" বিমূর্ত / শ্রেণি রাখতে পারেন?


10

অবশ্যই আপনি পারবেন, আমি কেবল ভাবছি যে এটি এমনভাবে ডিজাইন করা যুক্তিসঙ্গত।

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

গেমঅজেক্ট -> বেস ক্লাস (এক্স এবং ওয়াই অফসেটের মতো ডেটা সদস্য এবং এসডিএল_সার্ফেসের একটি ভেক্টর সমন্বিত *

মুভেবলঅবজেক্ট: গেমঅজেক্ট -> অ্যাবস্ট্রাক্ট ক্লাস + গেমওজেক্টের উত্পন্ন শ্রেণি (একটি পদ্ধতি অকার্যকর পদক্ষেপ () = 0;)

নন-মোভেবলঅবজেক্ট: গেমবজেক্ট -> খালি ক্লাস ... কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর ছাড়া অন্য কোনও পদ্ধতি বা ডেটা সদস্য নেই (কমপক্ষে এখনকার জন্য?)।

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

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

উত্তর:


2

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

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

1) এটি ইউনিট পরীক্ষাগুলি লিখতে আপনার পক্ষে সহজ করে তুলবে , যদি আপনি (যা আবার, আমি প্রস্তাব করব) বেছে নিই - কারণ আপনি গেমওজেক্ট এবং আপনার প্রতিটি রাজ্যের স্বাধীনভাবে পরীক্ষা করতে পারবেন।

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

3) সর্বাধিক গুরুত্বপূর্ণ: আপনি যখন টোকেনগুলির উপর ভিত্তি করে বল এবং / অথবা প্যাডেলগুলি কীভাবে গেমটি পরিবর্তন করতে শুরু করতে চান , আপনি কেবল তার গতিবিধির অবস্থার পরিবর্তন করতে থাকুন (ডায়াগোনালমোভমেন্টস্টেটটি ডায়াগোনাল উইথগ্রাভিটিমোভমেন্টস্টেট হয়ে যায়)।

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

$ 0.02


8

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

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


3

আপনি এটি ভেবে শেষ করেন না; আপনি ভাবছেন এবং এটি ভাল।

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

শ্রেণিবদ্ধকরণের জন্য কারও বেস ক্লাস ব্যবহার করা উচিত নয়। এটি চেকিং টাইপ জড়িত পারে। এটি একটি খারাপ ধারণা।

খাঁটি বিমূর্ততা লিখতে বিবেচনা করুন যা আপনার সামগ্রীর চুক্তিকে সংজ্ঞায়িত করে। আপনার সামগ্রীর চুক্তি বাহ্যিক মুখোমুখি ইন্টারফেস। এটির সার্বজনীন ইন্টারফেস। এর মানে কি.

নোট: এটি বোঝা এই হল গুরুত্বপূর্ণ না কোন ডেটা এটা আছে x, yকিন্তু কি এটা আছে move()

আপনার নকশা, আপনি একটি ক্লাস আছে GameObject। আপনি এর ডেটা এবং এটির কার্যকারিতা নয় এর জন্য এটির উপর নির্ভর করছেন। এটা তোলে মতানুযায়ী efficent এবং ভাগ করা কি সাধারণ ভাগ করা ডেটা মত মনে হয় আপনার ক্ষেত্রে জন্য উত্তরাধিকার ব্যবহার করতে সঠিক xএবং y

এটি উত্তরাধিকারের সঠিক ব্যবহার নয়। সর্বদা মনে রাখবেন, উত্তরাধিকার হ'ল সংযুক্তির সবচেয়ে সংক্ষিপ্ত রূপ যা আপনি সম্ভবত করতে পারেন এবং আপনার সর্বদা আলগা দম্পতির জন্য চেষ্টা করা উচিত।

এর দ্বারা প্রকৃতি নড়াচড়া NonMovableObjectকরে না। এটি xএবং yঅবশ্যই অবশ্যই ঘোষণা করা উচিত const। এর দ্বারা খুব প্রকৃতির MoveableObjectচলাচল করা দরকার। এটি এর xএবং এর yহিসাবে ঘোষণা করতে পারে না const। সুতরাং, এটি একই ডেটা নয় এবং এটি ভাগ করা যায় না।

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

সম্ভবত এখানে কিছু নেই NonMovableObject। একটি বিশুদ্ধ বিমূর্ততা GameObjectBaseযা কোনও move()পদ্ধতির সংজ্ঞা দেয় ? আপনার সিস্টেম GameObjectযা প্রয়োগ করে তা ইনস্ট্যান্ট করে move()এবং সিস্টেমটি কেবল সেইগুলি সরিয়ে দেয় যা সরানো দরকার।

এটা মাত্র শুরু; স্বাদ. খরগোশের গর্তটি আরও গভীর হয়। এখানে কোন চামচ নেই.


যদিও এটি সত্য যে উভয়ই একে অপরের কাছ থেকে উত্তরাধিকারী হতে পারে MovableObjectনা NonMovableObject, তাদের উভয়েরই অবস্থান রয়েছে; যেমন, তারা উভয়ই কোড দ্বারা উপভোগযোগ্য হওয়া উচিত যা উদাহরণস্বরূপ কোনও বস্তুর দিকে কোনও দৈত্যের লক্ষ্য নির্দেশ করতে চায় that বস্তুটি স্থানান্তরিত হতে পারে কিনা তা বিবেচনা ছাড়াই।
সুপারক্যাট

2

এটিতে এম # এম এর মতো সি # তে অ্যাপ্লিকেশন রয়েছে তবে সি ++ এ কেবলমাত্র অ্যাপ্লিকেশনটি যদি আপনি ননমোভেবলঅবজেক্ট পয়েন্টারগুলির একটি তালিকা রাখতে চান তবেই হবে।

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


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

হ্যাঁ এটি একটি ভাল পয়েন্ট।
দশ

1

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

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

বাস্তব জীবনে আমি দেখতে পেলাম যে যত তাড়াতাড়ি বা পরে আমি খালি বেস ক্লাস তৈরি করি না কেন কিছু কার্যকারিতা সেখানে শেষ হয়, তবে অবশ্যই এমন সময় আছে যখন সেগুলি উপস্থিত থাকে।


যদিও একটি প্রশ্ন জিজ্ঞাসা করতে হবে তা হল: প্রকারগুলির যদি কিছু মিল থাকে না তবে সেগুলি কেন একই সংকলনে অনুষ্ঠিত হচ্ছে? সংগ্রহের সমস্ত আইটেমের উপর আপনি কোন ক্রিয়াকলাপ করতে পারবেন না, যা এই জাতীয় সংগ্রহের উদ্দেশ্যকে ধরণ করে। এখন কিছু কৃত্রিম ক্রিয়াকলাপ হতে পারে যা আপনি উভয় যুক্তিকে সহজ করার জন্য যুক্ত করতে চান - যেমন দর্শনার্থীর নকশার প্যাটার্নটি প্রয়োগ করা - এটি আবার কার্যকর হতে পারে তবে এখন তাদের কিছু সাধারণ রয়েছে ...
জুলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.