Skip to main content
Version: Next

Best practices

Naming, modules, validation, and data organization when using Luban in production.

Naming

  • Table names: prefer TbXxxYyy to distinguish from plain beans
  • Field names: prefer xx_yy_zz; generation converts to Pascal/camel per language — see Code style

XML vs Excel definitions

  • Hand-written definitions: XML (one xml per module with a module name)
  • Designer-friendly: Excel for tables and structures
  • Mix both as needed

Modularization

Organize by module directory; use prefixes like item.TbItem, item.ItemInfo, not empty module.

Export format

Prefer json (or other text formats) during development to avoid frequent client/server redeploys when bin layout changes.

Complex Excel data

Combine multi-row records, multi-level column names, and sep (field sep and type sep); choose column constraint vs stream as needed. See Nested structures and sep and stream.

GamePlay data with OOP inheritance

Use polymorphic beans for skills, buffs, AI, dungeons, etc. Simple cases in Excel; editor-driven cases (e.g. skills) in json. Avoid legacy type + param1,param2,param3 combos.

Git hooks before commit

See githooks-demo.

Designers validate only

Without codeTarget/dataTarget, data is not loaded by default. Add -f (or -x forceLoadDatas=1) to validate only:

dotnet Luban.dll ^
-t all ^
-f ^
--conf luban.conf

Or -x outputSaver=null with no dataTarget to validate without writing files.

refgroup

When many fields ref the same tables, use refgroup — see Validators.

Editor-exported data

Save complex editor config as json one record per file + directory input; use generated load/save code, not hand-written serialization.

Tags for test data

Tag test/dev rows; filter with --excludeTag on release — do not delete rows by hand. See tags.

Tag unchecked

For temporary dirty batches where refs are not ready, add unchecked to skip ref warnings.

datetime and time zone

Use datetime for times; use CLI --timeZone when crossing zones.

When to use polymorphism

  • Variable GamePlay types: skills, AI, quests, dungeons
  • Simple structures in Excel; complex editor output in json

Handling polymorphism in code

For few types, is / switch (shape) works; for many types, prefer switch (shape.GetTypeId()):

switch (shape.GetTypeId())
{
case Circle::__ID__:
var c = (Circle)shape;
break;
case Triangle::__ID__:
var t = (Triangle)shape;
break;
}