You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#面向对象编程:钢筋测试数据类关系设计咨询

钢筋温度数据后处理的类结构优化方案

问题背景

我正在开展研究项目,预设一根6米长的钢筋,在0m、3m、6m位置安装了3个传感器。钢筋将接受A、B、C、D等多种测试工况,需编写数据后处理程序。

核心需求

  1. 确定最优数据类关系,现有两个候选方案:
    • 方案1:SteelBar Has-A BarCondition,BarCondition Has-A Temperature
    • 方案2:SteelBar Has-A Temperature,Temperature Has-A BarCondition
  2. 需实现多工况温度数据组合,例如:
    • Combination 1: BarConditionA + BarConditionB
    • Combination 2: BarConditionC + BarConditionD
    • Combination 3: 30% * BarConditionC + 40% BarConditionD
  3. 数据规模:预计500种工况、1000种组合、15+个传感器位置,后续还需扩展其他位置数据。

当前代码的问题

现有代码在数据组合、扩展性上存在明显缺陷,代码如下:

Temperature类

class Temperature
{
    private Dictionary<double, double> _temperatureData;
    public Dictionary<double, double> TemperatureData { get { return _temperatureData; } }
    public Temperature()
    {
        _temperatureData = new Dictionary<double, double>();
    }
    public void AddTemperature(double position, double temperatureinDegree)
    {
        _temperatureData.Add(position, temperatureinDegree);
    }
}

SteelBar类

class SteelBar
{
    private Temperature _BarTemperatureConditionA, _BarTemperatureConditionB;
    public SteelBar()
    {
        _BarTemperatureConditionA = new Temperature();
        _BarTemperatureConditionA.AddTemperature(0, 27);
        _BarTemperatureConditionA.AddTemperature(3, 39);
        _BarTemperatureConditionA.AddTemperature(6, 55);

        _BarTemperatureConditionB = new Temperature();
        _BarTemperatureConditionB.AddTemperature(0, 33);
        _BarTemperatureConditionB.AddTemperature(3, 99);
        _BarTemperatureConditionB.AddTemperature(6, 10);
    }
}

具体问题:

  • SteelBar硬编码固定工况,无法适配500种工况的扩展需求
  • Temperature仅存储单工况数据,无内置组合运算能力,实现加权/叠加逻辑需大量外部代码
  • 类关系混淆,未明确区分工况与温度数据的归属,后续扩展应力、应变等数据会更混乱

优化方案

1. 最优类关系选择:方案1扩展版

明确类的职责划分,构建可扩展、易维护的层级:

  • SteelBar:代表钢筋实体,管理所有测试工况的集合
  • BarCondition:代表单个测试工况(A/B/C/D...),包含该工况下的所有监测数据(温度、后续可扩展应力等)
  • TemperatureProfile:封装单工况下的位置-温度分布,内置组合运算逻辑

优化后的类结构代码:

// 封装温度分布及运算逻辑
public class TemperatureProfile
{
    // 只读对外暴露,防止外部篡改原始数据
    public IReadOnlyDictionary<double, double> PositionTemperatures { get; }
    private Dictionary<double, double> _internalData;

    public TemperatureProfile()
    {
        _internalData = new Dictionary<double, double>();
        PositionTemperatures = new ReadOnlyDictionary<double, double>(_internalData);
    }

    public void AddTemperature(double position, double temperature)
    {
        if (_internalData.ContainsKey(position))
            _internalData[position] = temperature;
        else
            _internalData.Add(position, temperature);
    }

    // 实现温度分布叠加运算
    public TemperatureProfile Add(TemperatureProfile other)
    {
        var result = new TemperatureProfile();
        var allPositions = PositionTemperatures.Keys.Union(other.PositionTemperatures.Keys);
        foreach (var pos in allPositions)
        {
            double temp1 = PositionTemperatures.TryGetValue(pos, out var t1) ? t1 : 0;
            double temp2 = other.PositionTemperatures.TryGetValue(pos, out var t2) ? t2 : 0;
            result.AddTemperature(pos, temp1 + temp2);
        }
        return result;
    }

    // 实现温度分布加权运算
    public TemperatureProfile Multiply(double factor)
    {
        var result = new TemperatureProfile();
        foreach (var kvp in PositionTemperatures)
        {
            result.AddTemperature(kvp.Key, kvp.Value * factor);
        }
        return result;
    }
}

// 单个测试工况,可扩展其他监测数据
public class BarCondition
{
    public string ConditionId { get; } // 工况唯一标识
    public TemperatureProfile Temperature { get; }

    public BarCondition(string conditionId)
    {
        ConditionId = conditionId;
        Temperature = new TemperatureProfile();
    }
}

// 钢筋实体,管理所有工况
public class SteelBar
{
    public IReadOnlyDictionary<string, BarCondition> Conditions { get; }
    private Dictionary<string, BarCondition> _conditions;

    public SteelBar()
    {
        _conditions = new Dictionary<string, BarCondition>();
        Conditions = new ReadOnlyDictionary<string, BarCondition>(_conditions);
    }

    public void AddCondition(BarCondition condition)
    {
        if (_conditions.ContainsKey(condition.ConditionId))
            throw new ArgumentException($"工况 {condition.ConditionId} 已存在");
        _conditions.Add(condition.ConditionId, condition);
    }

    // 快速获取指定工况的温度分布
    public TemperatureProfile GetTemperatureProfile(string conditionId)
    {
        if (!Conditions.TryGetValue(conditionId, out var condition))
            throw new KeyNotFoundException($"未找到工况 {conditionId}");
        return condition.Temperature;
    }
}

2. 数据组合实现示例

基于优化后的类结构,工况组合逻辑会非常简洁:

// 初始化钢筋及工况
var steelBar = new SteelBar();

// 添加工况A
var conditionA = new BarCondition("A");
conditionA.Temperature.AddTemperature(0, 27);
conditionA.Temperature.AddTemperature(3, 39);
conditionA.Temperature.AddTemperature(6, 55);
steelBar.AddCondition(conditionA);

// 添加工况C
var conditionC = new BarCondition("C");
conditionC.Temperature.AddTemperature(0, 40);
conditionC.Temperature.AddTemperature(3, 50);
conditionC.Temperature.AddTemperature(6, 60);
steelBar.AddCondition(conditionC);

// 添加工况D
var conditionD = new BarCondition("D");
conditionD.Temperature.AddTemperature(0, 20);
conditionD.Temperature.AddTemperature(3, 30);
conditionD.Temperature.AddTemperature(6, 40);
steelBar.AddCondition(conditionD);

// 组合1:A + B(假设B已添加)
var combo1 = steelBar.GetTemperatureProfile("A").Add(steelBar.GetTemperatureProfile("B"));

// 组合3:30%*C + 40%*D
var combo3 = steelBar.GetTemperatureProfile("C").Multiply(0.3).Add(steelBar.GetTemperatureProfile("D").Multiply(0.4));

3. 额外优化点

  • 使用IReadOnlyDictionary对外暴露数据,避免原始测试数据被意外篡改
  • 运算逻辑封装在TemperatureProfile内部,符合面向对象封装原则,后续修改规则只需调整该类
  • SteelBar通过工况ID动态管理所有工况,轻松适配500种工况的规模需求
  • 类结构扩展性强:后续需添加应力、应变等数据时,只需在BarCondition中新增对应的数据类(如StressProfile)即可

内容的提问来源于stack exchange,提问作者Komaludim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:31:26