告警程序实例(c#实现)
1.  需求
设计一个简化版的告警程序。这是一个Windows应用程序,它能够根据用户的选择结果,给出不同级别的告警消息。用户根据信号的不同,判断当前的错误警告属于何种级别。
告警程序的功能如下:
(一)  根据用户的选择触发告警信息:
(二)  告警消息根据警告的严重情况分为Lower,MediumHigh三级;
(三)  不同级别的告警消息发出不同的声音;
2.通过需求识别对象
   告警程序的功能非常简单。我们可以利用识别系统的关键词来寻找需要定义的对象。毋庸置疑,告警消息是整个需求分析中反复强调的,它应该是我们的关重心。需求分析中还有两个名词:用户与声音,它们是否是我们需要识别的对象的?判断的标准是这些对象是否参与了系统的功能实现,并与程序模型密切相关。
   例如用户对象,它是否属于程序的一部分呢?虽然,功能需求中要求告警信号必须根据用户的选择而触发,然而,它代表的含义实际上是指用户通过交互界面,完成对告警信号的选择。因此,它仅仅属于信息交互中的一个操作者,程序并不要求用户执行相应的行为,也不需要获取用户的相关属性。如果排除某些特定的需求(例如标记接口),这种有行为与属性的对象在软件系统中是没有存在的必要的。
   声音对象无疑是存在的,以为我们需要调用播放声音的方法。如果声音是一个外部文件,则准确的对象识别应该是声音播放器,通过它播放声音文件,例如wav文件。实际上,.net framwork已经定义了声音播放对象System.Media.SoundPlayer,我们只需调用其Play方法即可。
在项目中添加资源文件的方法:
在项目上右键点击-添加-新建项-选择Resouse file类型-然后选择添加声音文件即可-在项目中会出项一个Resouse文件夹,添加的声音文件将被拷贝到此文件夹下
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

   现在,回过头来分析告警消息对象的属性与行为。通过需求,我们知道告警信号能够发出声音,这证实它的一种行为表现形式,我们可以将其定义为告警消息对象的方法。那么,告警消息对象是否具有特定的属性呢?从需求判断,告警消息根据警告的严重情况分为Lower,MediumHigh三级,这似乎可以作为对象的一个属性,通过该属性值判断当前对象的严重级别。此外,该属性值还将制约行为的实现方式。因此告警消息对象的定义与实现如下:
namespace AlarmManager

{

    class Alarm

    {

        private SoundPlayer m_player;//声明SoundPlayer对象

        private string m_seriousLevel;//严重级别

        public string SeriousLevel

        {

            get

            {

                return m_seriousLevel;

            }

            set

            {

                m_seriousLevel = value;

            }

        }

        public Alarm()

        {

            m_seriousLevel = "High";

        }

        public Alarm(string seriousLevel)

        {

            m_seriousLevel = seriousLevel;

        }

        public void knock()

        {

            switch (m_seriousLevel.ToUpper())

            {

                case "HIGH":

                    m_player = new SoundPlayer(AlarmManager.Resource1.ALARM1);

                    //AlarmManager为声音文件的名称

                    break;

                case "MEDIUM":

                    m_player = new SoundPlayer(AlarmManager.Resource1.ALARM2);

                    //Resource1为资源对象

                    break;

                default:

                    m_player = new SoundPlayer(AlarmManager.Resource1.ALARM3);

                    //ALARM3为声音文件名称

                    break;

            }

            m_player.Play();

 

        }

    }

}

 

如果我们现在要添加一个更高级别的告警,则需要修改knock方法,在switch中添加分支,并建立一个新的实例,并不能很好的适应需求的变化。

 
更好的解决方法,期待大家一起解决!共同探讨
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />