Bu durumda, ben İdeal cevabım enums tüketilen nasıl bağlı olduğunu, ancak çoğu durumda bu kadar söyleyebilirim muhtemelen ayrı ayrı tüm Çeteleler tanımlamak için en iyi, ama bunların hiçbirini zaten tasarımdan birleştiğinde ise, bir sağlamalıdır adı geçen birleştirilmiş numaralandırmaların birlikte sunulması için araçlar. Aslında, zaten mevcut olan kasıtlı kuplaj miktarına kadar bir kuplaj toleransınız var, ancak artık yok.
Bunu göz önünde bulundurarak, en esnek çözümün her bir numaralandırmayı ayrı bir dosyada tanımlaması muhtemeldir, ancak bunun mantıklı olduğu durumlarda (ilgili numaralandırmaların amaçlanan kullanımına göre belirlendiği şekilde) birleştirilmiş paketler sağlar.
Tüm numaralandırmalarınızı aynı dosyada tanımlamak, onları bir araya getirir ve uzantı tarafından, kodun başka numaralandırmalar kullanıp kullanmadığına bakılmaksızın, bir veya daha fazla numaralandırmaya bağlı olan kodların tüm numaralandırmalara bağlı olmasına neden olur .
#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()
daha çok bilmek isterdim map_t
, çünkü aksi takdirde diğerleriyle herhangi bir değişiklik, aslında diğerleriyle etkileşime girmese bile onu etkileyecektir.
#include "mapEnum.h" // Theoretical file defining map_t.
void renderMap(map_t, mapIndex);
Bununla birlikte, bileşenlerin zaten bir araya getirildiği durumda, tek bir pakette birden fazla numaralandırma sağlamak, numaralandırmaların birleştirilmesi için açık bir mantıklı neden olması koşuluyla, bu numaralandırmaların kullanımının da bağlanması durumunda kolayca ek netlik ve basitlik sağlayabilir, ve bunları sağlamanın ek bir bağlantı da getirmediğini.
#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);
Bu durumda, varlık türü ile malzeme türü arasında doğrudan, mantıksal bir bağlantı yoktur (varlıkların tanımlanan malzemelerden birinden yapılmadığı varsayılarak). Bununla birlikte, örneğin bir enum'un açıkça diğerine bağımlı olduğu bir vakamız varsa, o zaman tüm bağlı numaralandırmaları (ve diğer herhangi bir bağlı bileşeni) içeren tek bir paket sağlamak mantıklıdır, böylece kaplin mümkün olduğu kadar bu pakete izole edilmiştir.
// 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()];
}
Ama ne yazık ki ... iki numara kendiliğinden birleştiğinde bile, "ikinci numaralandırma ilk numaralandırma için alt kategoriler sağlar" kadar güçlü bir şey olsa bile, sadece numaralardan sadece birinin gerekli olduğu bir zaman gelebilir.
#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;
}
Bu nedenle, her ikimizin de, her zaman tek bir dosyada birden çok numaralandırma tanımlamanın gereksiz bağlantı ekleyebileceği ve tekli pakette birleştirilmiş numaralandırmalar sağlamanın amaçlanan kullanımı netleştirebileceği ve gerçek bağlantı kodunun kendisini izole etmemize izin verebileceği durumlar olabileceğini biliyoruz. ideal çözüm, her bir numaralandırmayı ayrı ayrı tanımlamak ve sık sık birlikte kullanılması amaçlanan numaralandırmalar için ortak paketler sağlamaktır. Aynı dosyada tanımlanan tek numaralandırmalar, içsel olarak birbirine bağlı olanlar olacaktır, böylece birinin kullanımı diğerinin kullanımını da gerektirir.
// 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"