এই ক্ষেত্রে, আমি বলতে হবে আদর্শ উত্তর যে কিভাবে এটি enums খাওয়া হয় উপর নির্ভর করে, কিন্তু যে অধিকাংশ পরিস্থিতিতে এটা সম্ভবত আলাদাভাবে সব enums সংজ্ঞায়িত করতে সেরা, কিন্তু যদি তাদের কোন ইতিমধ্যে নকশা মিলিত, আপনি একটি প্রদান করা উচিত পরিচয় করিয়ে দেওয়ার অর্থ যৌথভাবে মিলিত এনাম বলেছে। বাস্তবে, আপনার কাছে ইতিমধ্যে উপস্থিত ইচ্ছাকৃত কাপলিংয়ের পরিমাণ পর্যন্ত একটি সংমিশ্রণ সহনশীলতা রয়েছে তবে আরও কিছু নেই।
এটি বিবেচনা করে, সর্বাধিক নমনীয় সমাধানটি প্রতিটি এনামকে পৃথক ফাইলে সংজ্ঞায়িত করতে পারে তবে যুক্তিযুক্ত প্যাকেজগুলি সরবরাহ করা যখন এটি করা যুক্তিসঙ্গত হয় (জড়িত এনামগুলির উদ্দেশ্য অনুসারে নির্ধারিত হয়)।
আপনার সমস্ত গণনা একই ফাইলে সংযুক্ত করে তাদের একত্রে যুক্ত করে এবং এক্সটেনশনের মাধ্যমে কোডটি অন্য কোনও এনাম ব্যবহার করে কিনা তা নির্বিশেষে সমস্ত এনামের উপর নির্ভর করে যে এক বা একাধিক এনামের উপর নির্ভর করে code
#include "enumList.h"
// Draw map texture. Requires map_t.
// Not responsible for rendering entities, so doesn't require other enums.
// Introduces two unnecessary couplings.
void renderMap(map_t, mapIndex);
renderMap()
বরং এটি সম্পর্কে কেবল জানতে হবে map_t
, কারণ অন্যথায় অন্যের যে কোনও পরিবর্তনগুলি এটির প্রভাব ফেলবে যদিও এটি অন্যদের সাথে বাস্তবে যোগাযোগ করে না।
#include "mapEnum.h" // Theoretical file defining map_t.
void renderMap(map_t, mapIndex);
যাইহোক, ক্ষেত্রে যেখানে ইতিমধ্যে উপাদানগুলি একত্রে মিলিত হয়েছে, একক প্যাকেজে একাধিক এনাম সরবরাহ করা সহজেই অতিরিক্ত স্পষ্টতা এবং সরলতা সরবরাহ করতে পারে, তবে এনামগুলিকে একত্রে যুক্ত করার সুস্পষ্ট যৌক্তিক কারণ থাকতে পারে, সেই এনামগুলির ব্যবহারটিও মিলিত হয়, এবং তাদের সরবরাহের ফলে কোনও অতিরিক্ত কাপলিংয়েরও পরিচয় হয় না।
#include "entityEnum.h" // Theoretical file defining entity_t.
#include "materialsEnum.h" // Theoretical file defining materials_t.
// Can entity break the specified material?
bool canBreakMaterial(entity_t, materials_t);
এই ক্ষেত্রে, সত্তা টাইপ এবং উপাদান ধরণের মধ্যে কোন সরাসরি, যৌক্তিক সংযোগ নেই (ধরে নেওয়া যে সত্তা সংজ্ঞায়িত উপকরণগুলির একটিতে তৈরি নয়)। তবে, আমাদের যদি এমন কোনও ঘটনা ঘটে থাকে যেমন, উদাহরণস্বরূপ, একটি এনাম অন্যটির উপর স্পষ্টভাবে নির্ভরশীল, তবে সমস্ত মিলিত এনাম (সেইসাথে অন্য কোনও সংযুক্ত উপাদান) সমেত একটি একক প্যাকেজ সরবরাহ করা বুদ্ধিমান হয়ে যায়, যাতে মিলিত হওয়া যায় যে প্যাকেজটি যথাসম্ভব বিচ্ছিন্ন।
// File: "actionEnums.h"
enum action_t { ATTACK, DEFEND, SKILL, ITEM }; // Action type.
enum skill_t { DAMAGE, HEAL, BUFF, DEBUFF, INFLICT, NONE }; // Skill subtype.
// -----
#include "actionTypes.h" // Provides action_t & skill_t from "actionEnums.h", and class Action (which couples them).
#include "entityEnum.h" // Theoretical file defining entity_t.
// Assume ActFlags is or acts as a table of flags indicating what is and isn't allowable, based on entity_t and Action.
ImplementationDetail ActFlags;
// Indicate whether a given type of entity can perform the specified action type.
// Assume class Action provides members type() and subtype(), corresponding to action_t and skill_t respectively.
// Is only slightly aware of the coupling; knows type() and subtype() are coupled, but not how or why they're coupled.
bool canAct(entity_t e, const Action& act) {
return ActFlags[e][act.type()][act.subtype()];
}
তবে হায়রে ... এমনকি যখন দুটি এনাম একসাথে একত্রিত হয়, এমনকি যদি এটি "দ্বিতীয় এনাম প্রথম এনামের জন্য উপশ্রেণী সরবরাহ করে" এর মতো শক্ত কিছু হয়, তখনও এমন একটি সময় আসতে পারে যেখানে কেবল একটি এনামের প্রয়োজন হয়।
#include "actionEnums.h"
// Indicates whether a skill can be used from the menu screen, based on the skill's type.
// Isn't concerned with other action types, thus doesn't need to be coupled to them.
bool skillUsableOnMenu(skill_t);
// -----
// Or...
// -----
#include "actionEnums.h"
#include "gameModeEnum.h" // Defines enum gameMode_t, which includes MENU, CUTSCENE, FIELD, and BATTLE.
// Used to grey out blocked actions types, and render them unselectable.
// All actions are blocked in cutscene, or allowed in battle/on field.
// Skill and item usage is allowed in menu. Individual skills will be checked on attempted use.
// Isn't concerned with specific types of skills, only with broad categories.
bool actionBlockedByGameMode(gameMode_t mode, action_t act) {
if (mode == CUTSCENE) { return true; }
if (mode == MENU) { return (act == SKILL || act == ITEM); }
//assert(mode == BATTLE || mode == FIELD);
return false;
}
সুতরাং, যেহেতু আমরা উভয়ই জানি যে সবসময় এমন পরিস্থিতিতে থাকতে পারে যেখানে একক ফাইলে একাধিক গণনা সংজ্ঞায়িত করা অপ্রয়োজনীয় সংযোগ যুক্ত করতে পারে এবং একক প্যাকেজে মিলিত এনামগুলি সরবরাহের উদ্দেশ্যে ব্যবহারটি স্পষ্ট করতে পারে এবং আসল সংযুক্তকরণ কোডটি নিজেই আলাদা করতে দেয় allow যতটুকু সম্ভব, আদর্শ সমাধান হ'ল প্রতিটি সংখ্যা পৃথকভাবে সংজ্ঞায়িত করা এবং যে কোনও এনামের জন্য ঘন ঘন একসাথে ব্যবহারের উদ্দেশ্যে করা যৌথ প্যাকেজ সরবরাহ করা। একই ফাইলে সংজ্ঞায়িত কেবলমাত্র এনামগুলি সেগুলি হবে যা অন্তর্গতভাবে একসাথে যুক্ত রয়েছে, যেমন একটির ব্যবহারের সাথে অপরের ব্যবহারও প্রয়োজন।
// File: "materialsEnum.h"
enum materials_t { WOOD, STONE, ETC };
// -----
// File: "entityEnum.h"
enum entity_t { PLAYER, MONSTER };
// -----
// File: "mapEnum.h"
enum map_t { 2D, 3D };
// -----
// File: "actionTypesEnum.h"
enum action_t { ATTACK, DEFEND, SKILL, ITEM };
// -----
// File: "skillTypesEnum.h"
enum skill_t { DAMAGE, HEAL, BUFF, DEBUFF, INFLICT, NONE };
// -----
// File: "actionEnums.h"
#include "actionTypesEnum.h"
#include "skillTypesEnum.h"