Практический стандарт документирования в Space Station 14 для C#, SWSL, YAML и FTL: как писать `<summary>`, когда добавлять поясняющие комментарии, как документировать partial-системы и как избегать шумной документации. Используй при написании, рефакторинге и ревью документации в коде, прототипах и локализации.
Используй этот skill как строгий рабочий стандарт по документации в SS14 ✍️ Цель: оставлять только полезную документацию, которая ускоряет ревью и снижает риск неправильного расширения системы.
references/fresh-pattern-catalog.md.references/rejected-snippets.md.references/docs-context.md.docs обязательна к прочтению, но используется как вторичный слой (термины, intent, ограничения), потому что может отставать.server/shared/client, особенно необычные вызовы и нестандартные флаги.2024-02-20.TODO/HACK/FIXME, если они затрагивают саму документацию или показывают спорное поведение./// <summary> как основной формат документации в коде.summary.summary.if "ради комментарирования".</summary>, не </summarY>).Start/End-блоки без смысла для поведения).## и названием группы: ## Group Name.##bombs.server/shared/client.summary и коротких точечных комментариях "почему так".summary.summary на уровне метода.ClickableSystem и CheckClick(...) используют summary для контракта и точечные комментарии в местах со сложными преобразованиями координат.MimePowersSystem.OnInvisibleWall(...) документирован summary, а комментарии оставлены только на критичных проверках.AccessOverriderSystem публичные методы сочетают summary и remarks, когда нужно зафиксировать инвариант поведения.BaseContainer и SharedContainerSystem.Remove(...) показывают стабильный стиль API-документации: summary + remarks + описанные параметры.SharedScp096System логика декомпозирована на partial-части с отдельными блоками ответственности и зависимостей.Scp096PhotoSystem и ArtifactScp096MadnessSystem показывают, что документация должна учитывать нестандартные флаги вызова (TryAddTarget(..., true, true)), а не только default-путь.# Rank 2 / # Rank 3 делают большие списки читаемыми без перегруза.## Strings for the battery ... и не ломает парсинг.</summarY> и другие опечатки).TODO/HACK/FIXME как "документации поведения" вместо исправления или нормального пояснения.Sunrise-Start/End, Fire added start/end) вместо поведенческого описания.## (##bombs).##########), которые не помогают навигации.summary + точечные комментарии на сложной логике/// <summary>
/// Handles click detection for sprites.
/// </summary>
public sealed class ClickableSystem : EntitySystem
{
/// <summary>
/// Used to check whether a click worked.
/// </summary>
public bool CheckClick(...)
{
// First we get localPos, the clicked location in the sprite-coordinate frame.
...
// Next check each individual sprite layer using automatically computed click maps.
...
}
}
Комментарий: summary держит API-контракт, а inline-комментарии остаются только у неочевидных шагов.
/// <summary>
/// Creates an invisible wall in a free space after some checks.
/// </summary>
private void OnInvisibleWall(Entity<MimePowersComponent> ent, ref InvisibleWallActionEvent args)
{
// Get the tile in front of the mime
...
// Check if the tile is blocked by a wall or mob, and don't create the wall if so
...
// Make sure we set the invisible wall to despawn properly
...
}
Комментарий: комментарии не засоряют метод, а поясняют только проверки и последствия.
summary + remarks для инвариантов/// <summary>
/// Returns true if there is an ID in privileged slot and said ID satisfies access requirements.
/// </summary>
/// <remarks>
/// Other code relies on the fact this returns false if privileged Id is null.
/// </remarks>
private bool PrivilegedIdIsAuthorized(...)
{
...
}
Комментарий: remarks фиксирует инвариант, который иначе легко нарушить при рефакторе.
public abstract partial class SharedScp096System
{
/*
* Target-handling part of the system.
*/
[Dependency] private readonly SharedPopupSystem _popup = default!;
...
}
if (!_scp096.TryAddTarget((uid, scp096), args.Examiner, true, true))
continue;
Комментарий: для таких систем документируй не только "что делает часть", но и зачем callsite включает нестандартные флаги.
# Rank 2
- type: cargoProduct
id: CargoDoubleEmergencyTank
# Rank 3
- type: cargoProduct
id: CargoFulton
Комментарий: короткий разделитель ускоряет чтение и не превращается в дополнительный "документ внутри прототипа".
## Strings for the battery (SMES/substation) menu
battery-menu-out = OUT
##bombs
uplink-pizza-bomb-name = Nefarious Pizza bomb
Комментарий: первый заголовок корректный, второй - сломанный из-за отсутствия пробела после ##.
summary.## Group Name.Документируй так, чтобы следующий разработчик понял контракт без археологии кода 🙂