이 경우, 나는 이상적인 대답은 그것이 열거 소비 방식에 의존하지만, 대부분의 경우에이 있다고 말할 것입니다 아마 별도로 모든 열거 형을 정의하는 것이 가장 좋습니다,하지만 그 중 하나가 이미 설계에 의해 결합하는 경우, 당신은을 제공해야 상기 결합 된 열거 형을 집합 적으로 도입하는 수단. 실제로 의도적 인 커플 링 양까지 커플 링 공차가 있지만 더 이상 없습니다.
이를 고려할 때 가장 유연한 솔루션은 각 열거 형을 별도의 파일로 정의 할 수 있지만 합리적 인 경우 결합 된 패키지를 제공합니다 (관련 된 열거 형의 의도 된 사용에 의해 결정됨).
동일한 열거 형에서 모든 열거 형을 정의하면 이들을 함께 결합하고 확장에 의해 코드가 실제로 다른 열거 형을 사용 하는지 여부에 관계없이 하나 이상의 열거 형에 의존하는 코드가 모든 열거 형에 종속됩니다 .
#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;
}
따라서 단일 파일에 여러 열거를 정의하면 불필요한 커플 링이 추가 될 수있는 상황이 항상있을 수 있으며 단일 패키지에 커플 링 된 열거를 제공하면 의도 된 사용법을 명확하게하고 실제 커플 링 코드 자체를 분리 할 수 있습니다. 가능한 가장 이상적인 솔루션은 각 열거를 개별적으로 정의하고 자주 함께 사용되는 열거에 대한 공동 패키지를 제공하는 것입니다. 같은 파일에 정의 된 유일한 열거 형은 본질적으로 서로 연결된 것이므로 하나를 사용하면 다른 하나의 사용법도 필요합니다.
// 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"