ในกรณีนี้ฉันจะบอกว่าคำตอบในอุดมคติคือมันขึ้นอยู่กับวิธีการใช้ enums แต่ในกรณีส่วนใหญ่มันอาจจะเป็นการดีที่สุดที่จะกำหนด enums ทั้งหมดแยกต่างหาก แต่ถ้ามีการออกแบบใด ๆ ควบคู่กันไปด้วยคุณควรให้ หมายถึงการแนะนำคู่กล่าวว่ารวม enums โดยรวม ผลที่ตามมาคือคุณมีความอดทนต่อการมีเพศสัมพันธ์จนถึงจำนวนของการมีเพศสัมพันธ์โดยเจตนาที่มีอยู่แล้ว แต่ไม่มาก
เมื่อพิจารณาถึงสิ่งนี้โซลูชันที่มีความยืดหยุ่นมากที่สุดมีแนวโน้มที่จะกำหนดแต่ละ enum ในไฟล์แยกต่างหากแต่ให้แพคเกจคู่เมื่อมันมีเหตุผลที่จะทำเช่นนั้น (ตามที่กำหนดโดยการใช้ enums ที่เกี่ยวข้อง)
การระบุการแจกแจงทั้งหมดของคุณในไฟล์เดียวกันจะรวมเข้าด้วยกันและโดยส่วนขยายจะทำให้โค้ดใด ๆ ที่ขึ้นอยู่กับ enums หนึ่งอันหรือมากกว่านั้นขึ้นอยู่กับ enums ทั้งหมดโดยไม่คำนึงว่ารหัสนั้นใช้จริงๆ หรือไม่
#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);
อย่างไรก็ตามในกรณีที่ส่วนประกอบเชื่อมต่อกันอยู่แล้วการจัดให้มีหลาย enums ในแพ็คเกจเดียวสามารถให้ความชัดเจนและความเรียบง่ายเพิ่มเติมได้โดยง่ายหากมีเหตุผลที่ชัดเจนสำหรับการใช้งาน enums เหล่านั้น และการจัดหาสิ่งเหล่านี้ไม่ได้แนะนำข้อต่อเพิ่มเติมใด ๆ
#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);
ในกรณีนี้ไม่มีการเชื่อมต่อโดยตรงและตรรกะระหว่างประเภทเอนทิตีและประเภทวัสดุ (สมมติว่าเอนทิตีไม่ได้ทำจากวัสดุที่กำหนดอย่างใดอย่างหนึ่ง) อย่างไรก็ตามถ้าเรามีกรณีที่ตัวอย่างเช่น enum หนึ่งขึ้นอยู่กับอีกอย่างชัดเจนมันก็สมเหตุสมผลที่จะจัดทำแพ็คเกจเดี่ยวที่บรรจุ enums คู่ทั้งหมด (รวมถึงส่วนประกอบคู่อื่น ๆ ) เพื่อให้ข้อต่อสามารถ แยกไปยังแพ็คเกจนั้นมากที่สุดเท่าที่จะเป็นไปได้อย่างสมเหตุสมผล
// 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()];
}
แต่อนิจจา ... แม้ว่าสอง enums จะอยู่คู่กันภายในแม้ว่ามันจะมีความแข็งแกร่งพอ ๆ กับ "enum ที่สองให้หมวดหมู่ย่อยสำหรับ Enum แรก" อาจมีเวลาที่จำเป็นต้องใช้ enums เพียงตัวเดียว
#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;
}
ดังนั้นเนื่องจากเรารู้ว่าทั้งคู่อาจมีสถานการณ์ที่การระบุหลายค่าในไฟล์เดียวสามารถเพิ่มการเชื่อมต่อที่ไม่จำเป็นและการให้คู่ Enums ในแพ็คเกจเดียวสามารถชี้แจงการใช้งานที่ต้องการและช่วยให้เราสามารถแยกรหัส coupling จริง ๆ มากที่สุดเท่าที่จะทำได้ทางออกที่ดีที่สุดคือการกำหนดแต่ละการแจงนับแยกต่างหากและจัดทำแพคเกจร่วมสำหรับ enums ใด ๆ ที่มีวัตถุประสงค์เพื่อใช้บ่อยครั้งร่วมกัน enums ที่กำหนดไว้ในไฟล์เดียวกันจะเป็นอันที่เชื่อมโยงกันภายในเช่นการใช้งานของสิ่งหนึ่งจำเป็นต้องใช้งานของอื่น ๆ เช่นกัน
// 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"