- 删除 MarginAccount 整类、IMarginResolver 子树(MarginForm/CashMargin/CreditMargin/GuaranteeMargin)、MarginBalance 只读 struct:全仓零生产实例化,结构上无法适配 CalcMarginInterest 的盘中差分模型。 - 删除仅覆盖上述死代码的 MarginLegTest(不损失活代码覆盖率)。 - 保留被 CalcMarginInterest 实际使用的 MarginCalc/MarginModes 活代码。 - 同步修剪 ARCHITECTURE.md 树图与对账表,清理 AccrualContext.cs 过期注释。
30 lines
1.6 KiB
C#
30 lines
1.6 KiB
C#
namespace YLErp.Core.Interest;
|
||
|
||
/// <summary>
|
||
/// 计息执行上下文:把"与具体金额/利率无关"的横向参数(年化天数、精度、trace 收集器)
|
||
/// 打包成一个<b>只读值对象</b>,避免每个计息方法都重复携带这些参数。
|
||
///
|
||
/// <para><b>为何 trace 是"成员"而非散落参数</b>:利息纯函数(AccrueSimple / AccrueCompoundInArrears)
|
||
/// 的核心职责是算账,trace 只是可观测性的旁路。把 trace 作为上下文的成员传入,
|
||
/// 调用点只需传一个 ctx,签名更干净;同时 ctx 是只读值对象,不破坏纯函数
|
||
/// (无共享可变状态 → 线程安全、可重入、可测)。<b>切勿</b>把 trace 设成类的实例/静态字段,
|
||
/// 那会让并发的两笔交易共用同一 trace、并使函数带隐藏状态。</para>
|
||
///
|
||
/// <para>与 AccrualState(跨日滚动本金状态)/ AccrualPolicy(EOD 会计政策)正交:
|
||
/// 本上下文只描述"如何算 + 往哪记",不持有任何交易进度。</para>
|
||
/// </summary>
|
||
public readonly struct AccrualContext
|
||
{
|
||
/// <summary>年化天数(365 / 360)。</summary>
|
||
public int AnnualDays { get; }
|
||
|
||
/// <summary>舍入精度位数。默认 11(生产融资腿/保证金腿均显式传入 FundingLegPrecision=12)。</summary>
|
||
public int Precision { get; }
|
||
|
||
/// <summary>可选 trace 收集器;为 null 时不记录(纯计算场景直接传 null,与开关无关)。</summary>
|
||
public AccrualTrace? Trace { get; }
|
||
|
||
public AccrualContext(int annualDays, int precision = 11, AccrualTrace? trace = null)
|
||
=> (AnnualDays, Precision, Trace) = (annualDays, precision, trace);
|
||
}
|