初学C#求指导、求优化、求砖。
今天看了“张子阳”的《C#委托和事件》教程,学着做了一个探头监控报警程序。
使用了Observer模式,但里面还是有不少的if判断,求各路神仙指点。谢谢!!
- C# code
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Timers;namespace DetectorAlarm{ /// <summary> /// 温湿度报警程序 /// </summary> class Program { static void Main(string[] args) { Detector detector = new Detector(); SMSAlert sms = new SMSAlert(); DeviceAlert device = new DeviceAlert(); ServerAlert server = new ServerAlert(); detector.MonitorFaild += sms.SendSMS; detector.MonitorFaild += device.DoAlert; detector.MonitorFaild += server.DoAlert; detector.DoMonitor(); Console.ReadLine(); } } /// <summary> /// 枚举类型 /// </summary> enum DetectorEventType { Normal = 0, TemperatureHigh = 2, TemperatureLow = 4, HumidityHigh = 8, HumidityLow= 16 } /// <summary> /// 探头对象 /// </summary> class Detector { #region 内部成员 //探头参数:绑定的设备号,设备IP,通道号,楼层,所在地点 private int _detectorID = 0; private int _deviceNo; private string _deviceIP; private int _channel; private string _floor; private string _place; //内部参数:温/湿度当前值,报警上下限 private double _temperature; private double _humidity; private double _minTemperature; private double _maxTemperature; private double _minHumidity; private double _maxHumidity; #endregion #region 只读属性 public int DeviceNo { get { return _deviceNo; } } public string DeviceIP { get { return _deviceIP; } } public int Channel { get { return _channel; } } public double Temperature { get { return _temperature; } } public double Humidity { get { return _humidity; } } #endregion #region 事件与委托定义 //声明委托 public delegate void MonitorEventHandler(Object sender, MonitorEventArgs e); //声明事件 public event MonitorEventHandler MonitorFaild; /// <summary> /// MonitorEventArgs类,用于传递参数 /// </summary> public class MonitorEventArgs:EventArgs { public readonly double temperature; public readonly double humidity; public readonly int eventType; public MonitorEventArgs(int eventType, double temperature, double humidity) { this.eventType = eventType; this.temperature = temperature; this.humidity = humidity; } } #endregion #region 自定义事件 /// <summary> /// 温度过高 /// </summary> /// <param name="e"></param> protected virtual void OnMonitorFaild(MonitorEventArgs e) { if (MonitorFaild != null) { MonitorFaild(this, e); } } #endregion #region 公共方法 public void DoMonitor() { //从数据库读取探头信息 if(_detectorID==0) { GetDetectorInfo(); } System.Timers.Timer timer = new System.Timers.Timer(); timer.Interval = 6000; timer.Enabled = true; timer.Elapsed += new ElapsedEventHandler(GetDetectorInfoByID); timer.Start(); } #endregion #region 私有方法 /// <summary> /// 获取探头信息 /// </summary> private void GetDetectorInfo() { _detectorID = 1; _deviceIP = "192.168.1.195"; _deviceNo = 1; _floor = "一楼"; _channel = 1; _place = "实验室"; _temperature = 28.0; _humidity = 80.0; _minTemperature = 25.0; _maxTemperature = 30.0; _minHumidity = 60.0; _maxHumidity = 90.0; } /// <summary> /// 获取温湿度信息 /// </summary> private void GetDetectorInfoByID(object source, ElapsedEventArgs e) { Random random = new Random(); _temperature = random.Next(1,100); _humidity = random.Next(1,100); int detectorAlarmType = 0; //判断温湿度,触发对应事件 if(_temperature > _maxTemperature) { detectorAlarmType += (int)DetectorEventType.TemperatureHigh; } if(_temperature < _minTemperature) { detectorAlarmType += (int)DetectorEventType.TemperatureLow; } if(_humidity > _maxHumidity) { detectorAlarmType += (int)DetectorEventType.HumidityHigh; } if(_humidity < _minHumidity) { detectorAlarmType += (int)DetectorEventType.HumidityLow; } Console.WriteLine("当前温度{0}℃,湿度{1}%", _temperature, _humidity); MonitorEventArgs ev = new MonitorEventArgs(detectorAlarmType, _temperature, _humidity); OnMonitorFaild(ev); } #endregion } /// <summary> /// 短信报警 /// </summary> class SMSAlert { public void SendSMS(Object sender,Detector.MonitorEventArgs e) { Detector dt = (Detector) sender; Console.WriteLine("短信报警:设备IP:{0},警报代码:{1},警报内容:{2},当前温度{3}℃,湿度{4}%。", dt.DeviceIP,e.eventType, DeCode(e.eventType), e.temperature, e.humidity); } /// <summary> /// 警报代码解析 /// </summary> /// <param name="iCode"></param> /// <returns></returns> private string DeCode(int iCode) { string strCode = Convert.ToString(iCode, 2).PadLeft(8, '0'); string result = "温度正常"; if (strCode.Substring(6, 1) == "1") { result = "温度过高"; } else if (strCode.Substring(5, 1) == "1") { result = "温度过低"; } if (strCode.Substring(4, 1) == "1") { result += "、湿度过高"; } else if (strCode.Substring(3, 1) == "1") { result += "、湿度过低"; } else { result += "、湿度正常"; } return result; } } /// <summary> /// 设备上的警号报警 /// </summary> class DeviceAlert { public void DoAlert(Object sender, Detector.MonitorEventArgs e) { Detector dt = (Detector) sender; Console.WriteLine("设备呱呱叫了。"); } } /// <summary> /// 服务器上的警号报警 /// </summary> class ServerAlert { public void DoAlert(Object sender, Detector.MonitorEventArgs e) { Detector dt = (Detector)sender; Console.WriteLine("服务器哇哇叫了。"); Console.WriteLine(""); } }}
[解决办法]
怎么了,if判断怎么了,有什么疑问
[解决办法]
是啊,你完全可以用数组:
- C# code
string[] ErrMessage = { "温度正常", "温度过高", "温度过低", ... };string result = string.Join("、", Enumerable.Range(-1, 6).Select(x => iCode | (1 << x) == iCode ? ErrMessage[x - 1] : "").Where(x => x != ""));
[解决办法]
switch
case
效率高些
[解决办法]
private int GetDetectorAlarmTypeCode()
{
int detectorAlarmType = 0;
detectorAlarmType += CalcValue(_temperature, _maxTemperature, (int)DetectorEventType.TemperatureHigh);
detectorAlarmType += CalcValue(_minTemperature, _temperature, (int)DetectorEventType.TemperatureLow);
detectorAlarmType += CalcValue(_humidity, _maxHumidity, (int)DetectorEventType.HumidityHigh);
detectorAlarmType += CalcValue(_minHumidity, _humidity, (int)DetectorEventType.HumidityLow);
return detectorAlarmType;
}
====================================
我觉得方法应该尽量通用且有意义,
这个方法的返回值有什么意义呢?