অনেকগুলি ছোট পলিমারফিক ক্লাসের জন্য নমনীয় বিকল্প (সম্পত্তি বা বার্তা বা ইভেন্ট হিসাবে ব্যবহারের জন্য) সি ++


9

আমার গেমটিতে দুটি ক্লাস রয়েছে যা সত্যিই দরকারী তবে ধীরে ধীরে ব্যথা হয়ে উঠছে। বার্তা এবং সম্পত্তি (সম্পত্তি মূলত একটি উপাদান)।

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

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

এটি চারপাশে বাজানো এবং নতুন ধারণাগুলি একটি আসল কাজকর্ম পরীক্ষা করতে শুরু করে। আমি যখন আমি একটি নতুন বার্তা বা সম্পত্তির ধরণ তৈরি করতে চাই তখন আমি ঠিক এর মতো কিছু টাইপ করতে সক্ষম হতে চাই wish

ShootableProperty:  int gunType, float shotspeed;

ItemCollectedMessage:  int itemType;

একটি শিরোনাম এবং সিপিপি ফাইল তৈরির পরিবর্তে পিতামাতা বর্গ সহ একটি নির্মাণকারী লিখুন, ইত্যাদি etc.

এটি প্রায় 20 - 40 টি লাইনের মধ্যে রয়েছে (প্রহরী এবং সমস্ত কিছু অন্তর্ভুক্ত) কেবলমাত্র মনের মধ্যে 1 বা 2 লাইন যা যুক্তিযুক্ত তা করার জন্য।

এই কাছাকাছি পেতে কিছু প্রোগ্রামিং প্যাটার্ন আছে?

স্ক্রিপ্টিং সম্পর্কে (যা আমি কিছুই জানি না) ... এমন কি ক্লাসগুলির প্রায় একরকম সংজ্ঞা দেওয়ার কোনও উপায় আছে?


এখানে এক শ্রেণীর দেখতে ঠিক কেমন দেখাচ্ছে:

// Velocity.h

#ifndef VELOCITY_H_
#define VELOCITY_H_

#include "Properties.h"

#include <SFML/System/Vector2.hpp>

namespace LaB
{
namespace P
{

class Velocity: public LaB::Property
{
public:
    static const PropertyID id;

    Velocity(float vx = 0.0, float vy = 0.0)
    : velocity(vx,vy) {}
    Velocity(sf::Vector2f v) : velocity(v) {};

    sf::Vector2f velocity;
};

} /* namespace P */
} /* namespace LaB */
#endif /* LaB::P_VELOCITY_H_ */



// Velocity.cpp

#include "Properties/Velocity.h"

namespace LaB
{
namespace P
{

const PropertyID Velocity::id = Property::registerID();

} /* namespace P */
} /* namespace LaB */

এগুলি কেবলমাত্র একটি 2 ডি ভেক্টর এবং একটি আইডি বলে যা 2D ভেক্টর আশা করে। (অনুমোদিত, কিছু বৈশিষ্ট্যে আরও জটিল উপাদান রয়েছে তবে এটি একই ধারণা)


3
এটি একবার দেখুন, এটি আপনাকে সাহায্য করতে পারে। গেমপ্রোগ্রামিংপটার্নস

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

আপনি কি তৃতীয় পক্ষের লাইব্রেরি পেয়েছেন যা এটি প্রয়োগ করে?
বরিস

উত্তর:


1

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

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

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

  1. সি ++ টেম্পলেট ব্যবহার করুন । টেমপ্লেটগুলি আপনার জন্য সংকলককে "লিখন কোড" দেওয়ার এক দুর্দান্ত উপায়। এটি সি ++ বিশ্বে আরও বিশিষ্ট হয়ে উঠছে, যেহেতু ভাষা তাদের আরও ভালভাবে সমর্থন করার জন্য বিকশিত হয়েছে (উদাহরণস্বরূপ আপনি এখন টেমপ্লেটের প্যারামিটারগুলির একটি সংখ্যা ব্যবহার করতে পারেন )। টেমপ্লেটগুলির মাধ্যমে কোডের স্বয়ংক্রিয় প্রজন্মকে উত্সর্গীকৃত একটি সম্পূর্ণ শৃঙ্খলা রয়েছে: টেমপ্লেট মেটাপ্রোগ্রামিং । সমস্যা হ'ল: শক্ত। আপনি যদি এই জাতীয় প্রযুক্তি ব্যবহারের পরিকল্পনা করেন তবে নন-প্রোগ্রামাররা নিজেরাই নতুন বৈশিষ্ট্য যুক্ত করতে সক্ষম হবে এমন আশা করবেন না।

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

  3. অন্য বিকল্পটি হল আপনার জন্য কোড উত্পন্ন করতে বাহ্যিক সরঞ্জাম ব্যবহার করা। এটি ইতিমধ্যে পূর্ববর্তী উত্তরে উল্লেখ করা হয়েছে যাতে আমি এর উপরে প্রসারিত করব না।

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

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


0

আপনাকে সহায়তা করার জন্য একটি কোড তৈরির সরঞ্জাম সম্পর্কে কীভাবে?

উদাহরণস্বরূপ, আপনি একটি ছোট পাঠ্য ফাইলে আপনার বার্তার প্রকার এবং সদস্যদের সংজ্ঞায়িত করতে এবং কোড জেন সরঞ্জামটি পার্স করতে এবং সমস্ত বয়লারপ্লেট সি ++ ফাইলগুলি প্রাক-বিল্ড পদক্ষেপ হিসাবে লিখতে পারেন।

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


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

0

আমি আপনাকে গুগলের প্রোটোকল বাফার ( http://code.google.com/p/protobuf/ ) সম্পর্কে গবেষণা করার পরামর্শ দিচ্ছি । এগুলি জেনেরিক বার্তাগুলি হ্যান্ডেল করার খুব চালাক উপায়। আপনাকে কেবল স্ট্রাক্ট-লাইক প্যাটার্নে বৈশিষ্ট্যগুলি নির্দিষ্ট করতে হবে এবং একটি কোড জেনারেটর আপনার জন্য ক্লাস তৈরির সমস্ত কাজ করে (জাভা, সি ++ বা সি #)। সমস্ত উত্পন্ন শ্রেণীর পাঠ্য এবং বাইনারি পার্সার রয়েছে, যা এগুলি পাঠ্য-ভিত্তিক বার্তা প্রারম্ভিককরণ এবং সিরিয়ালাইজেশন উভয়ের জন্যই ভাল করে তোলে।


আমার মেসেজিং সেন্ট্রাল আমার প্রোগ্রামটি হ'ল - আপনি কি জানেন যে প্রোটোকল বাফারগুলি কোনও বড় ওভারহেডে প্রবেশ করে?
ব্রায়ান

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