C#面向对象编程:钢筋测试数据类关系设计咨询
钢筋温度数据后处理的类结构优化方案
问题背景
我正在开展研究项目,预设一根6米长的钢筋,在0m、3m、6m位置安装了3个传感器。钢筋将接受A、B、C、D等多种测试工况,需编写数据后处理程序。
核心需求
- 确定最优数据类关系,现有两个候选方案:
- 方案1:
SteelBarHas-ABarCondition,BarConditionHas-ATemperature - 方案2:
SteelBarHas-ATemperature,TemperatureHas-ABarCondition
- 方案1:
- 需实现多工况温度数据组合,例如:
- Combination 1: BarConditionA + BarConditionB
- Combination 2: BarConditionC + BarConditionD
- Combination 3: 30% * BarConditionC + 40% BarConditionD
- 数据规模:预计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
相关产品推荐
相关产品推荐

