Skip to content

refactor: MixerDataを論理グループにネスト化するか検討する #87

Description

@9c5s

背景

PR #86 (issue #75) で MixerData 型を TCNet 仕様上の全 47 フィールドに拡張した。フラット構造のままでは可読性・保守性に懸念があり、下流クライアント (tcnet-viewer) 側のレビューでも「論理グループにネスト化するか、コメントでグループ化するか」の選択が議論された。

下流プロジェクト tcnet-viewer では暫定対応としてセクションコメントでのグループ化を採用したが、より良い構造化の案としてネスト化が挙がっている。ただしネスト化は破壊的変更になるため、プロトコル提供元 (本リポジトリ) で先に方針を決定し、下流が追従する方が整合性が保てる。

現状

// src/types.ts
export type MixerData = {
    mixerId: number;
    mixerType: number;
    mixerName: string;
    masterAudioLevel: number;
    masterFaderLevel: number;
    masterFilter: number;
    micEqHi: number;
    micEqLow: number;
    linkCueA: number;
    linkCueB: number;
    masterCueA: number;
    masterCueB: number;
    // ... 合計 47 フィールド (channels 除く)
    channels: MixerChannel[];
};

ネスト化案

export type MixerData = {
    id: { mixerId: number; mixerType: number; mixerName: string };
    master: { audioLevel: number; faderLevel: number; filter: number; cueA: number; cueB: number };
    mic: { eqHi: number; eqLow: number };
    link: { cueA: number; cueB: number };
    isolator: { on: boolean; hi: number; mid: number; low: number };
    filter: { hpf: number; lpf: number; resonance: number };
    sendFx: { effect: number; ext1: number; ext2: number; masterMix: number; sizeFeedback: number; time: number; hpf: number; level: number };
    sendReturn3: { source: number; type: number; on: number; level: number };
    crossFader: { curve: number; value: number; channelCurve: number };
    beatFx: { on: boolean; levelDepth: number; channelSelect: number; select: number; freqHi: number; freqMid: number; freqLow: number };
    headphones: { preEq: number; aLevel: number; aMix: number; bLevel: number; bMix: number };
    booth: { level: number; eqHi: number; eqLow: number };
    channels: MixerChannel[];
};

検討事項

1. ネスト化するメリット

  • 47 フィールドの型定義がグループ単位で俯瞰しやすくなる
  • ドメインモデル (Mic / Master / Send FX / Booth 等) が型で直接表現される
  • 将来フィールドが増えた場合もグループ内で追加可能で拡張性が高い
  • 下流クライアントで mixer.sendFx.level のように階層アクセスできる

2. ネスト化するデメリット

  • 破壊的変更: 全フィールドアクセスパスが変わる (tcnet-viewer で約 9 箇所の修正)
  • プロトコル仕様 (TCNet 公式 spec) はフラットなバイトレイアウトで定義されており、ネスト化は SDK レイヤー独自の構造化
  • parse 処理のネストオブジェクト生成が若干のオーバーヘッド (無視できる程度)
  • 既に下流に 47 フィールドフラット構造でリリース済み (v0.9.x)

3. フラット維持の正当性

  • TCNet プロトコル仕様と 1:1 対応のままで、バイトオフセットとフィールド名の対応が追跡しやすい
  • 破壊的変更を避けられる
  • 下流側で必要ならラッパー層でネスト化できる

判断ポイント

  • プロトコル SDK としての立ち位置: 「プロトコル仕様の忠実な移植」(フラット維持) vs 「TypeScript エコシステムで使いやすい形」(ネスト化)
  • ユーザー数/ユースケース: 現状 tcnet-viewer 以外の利用者は?
  • v1.0 リリース前後: v1.0 前なら破壊的変更のコストが低い

やること

参考

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions