异常、架构、框架、序列化、接口

1.异常

2.常用的异常

  2.1与参数有关的异常类:派生自SystemException,用于方法成员传递参数时发生异常

    ArgumentException类:用于处理参数无效的异常。ArgumentNullException类:参数为空。

    FormatException类:用于处理参数格式错误的异常。

  2.2与数组有关的异常:继承自SystemException

    IndexOutOfException类:用于处理下标超出了数组长度所引发的异常。

    ArrayTypeMismatchException类:用于处理在数组中存储了数据类型不正确的元素所引发的异常。

  2.3与IO有关的异常:继承自SystemException

    IOException类:用于处理进行文件输入输出操作时所引发的异常。

  2.4内存溢出有关的异常

    OverFlowException类:用于处理程序逻辑错误造成的死循环异常。

  2.5与算术有关的异常

    ArithmeticException类:用于处理与算术有关的异常,比如0做除数。DivideByZeroException类。

  2.6数据库操作异常类

    DbException类:用于处理所有数据源操作异常类的基类。

    SqlException类:用于处理针对sql数据源的异常,比如数据库链接错误。

3.异常处理

  3.1“底层方法”将第一次捕获的异常传递给上级调用者进一步详细处理

 1 public static int Update(string sql)
 2 {
 3   SqlConnection conn = new SqlConnection(connString);
 4   SqlCommand cmd= new SqlCommand(sql,conn);
 5   try
 6   {
 7     conn.Open();
 8     return cmd.ExecuteNonQuery();
 9   }       
10   catch(Exception ex)
11   {
12     //此处可以添加日志
13     throw ex;
14   }
15   finally
16   {
17     conn.Close();
18   }
19 }    
20 
21 try catch throw finally
try catch throw finally

 3.2"中层调用者"可以使用多路捕获异常并封装详细异常信息

  添加具体异常对象,通过判断错误号决定异常的类型。

    1.多路捕获异常不是必须的,只有需要的时候才使用。

    2.可以添加多个catch块。

    3.一定要把Exception类放在最后。

    ex.Number的使用,throw new Exception("********"+ex.Message);

    throw ex;这种未经包装

    throw new Exception("******"+ex.Message);这种稍微包装了一下

    异常一般刚在业务逻辑里面,不需要放在界面里面,这样界面捕获后就直接显示。

 4.系统功能较多并且业务复杂时,可以使用三层架构设计项目

  表示UI:界面层

  业务逻辑层BLL:将界面层或数据访问层的部分职责(逻辑代码)分离出来

  数据访问层DAL:主要负责连接读写数据库

  表示层UI、业务逻辑层BLL、数据访问层都需要访问实体层(Models)。

   

 5.项目命名的一般规范

  解决方案      项目名称+Pro

  用户界面层  项目名称

  业务逻辑层  项目名称+BLL  业务逻辑类:实体类名+Manager

  数据访问层  项目名称+DAL  数据访问类:实体类名+Service

  实体对象     一般和数据库实体相同 

6.理解框架

  作用:支撑、主导

7.典型两层架构设计原理

  分表示层和数据访问层,表示层由前台开发人员夫负责,主要是和用户交互的界面;数据访问层由后台开发人员负责,主要完成数据库的操作。表示层和数据访问层由实体层连接,分层与实体类无必然联系,实体类只是数据传递的载体,什么时候都可以使用。

8.关于类库项目

  类库项目专门提供软件的功能模块

  类库项目最终生成的是一个dll文件

  通过封装,类库项目能够很好的与外界协作,安全性高

9.两层架构项目之间的引用

  数据访问层DAL需引用实体层Models,表示层From需引用数据访问层DAL和实体层Models。

10.实体对象的可序列化

  10.1实体对象在程序中不断的被传递

    表示层(UI)<——>实体对象Models<——>数据访问层DAL

  10.2序列化与反序列

    序列化:将对象状态转换为可保持或传输的格式的过程,在序列化过程中,对象的公有字段和私有字段以及类的名称(包括包含该类的程序集)都被转化为字节流,然后写入数据流。

    反序列化:将流转化为对象,与序列化结合可轻松地存储和传输数据。

  10.3对象序列化的意义

    10.3.1将对的状态保持在存储媒体中,以便可以在以后重新创建精确的副本。

    10.3.2将对象从一个应用程序域发送到另一个应用程序域,对象序列化以后保证数据传输的稳定和安全。

    实体类Models的前面加   [Serializable]

11.接口  

  接口又叫接口类,接口也是类

  使用关键字interface定义,接口类名称通常使用I开头

  接口中的属性、方法等,只是做一个声明,没有任何实现

  接口中的属性、方法等,默认都是public。

  方法声明类似于抽象方法

  11.1接口具有强制性,实现接口的类必须是西安接口的所有成员

  11.2一个类既可以实现多个接口,也可以同时继承其他类

    通常把父类写在接口的前面,继承了一个类,实现了一个接口

  class Student:Person,IStudent,IComparable{...}

 1 //定义接口
 2     interface IMultiPrinter
 3     {
 4         void Print(string content);
 5         void Copy(string content);
 6         bool Fax(string content);
 7     }
 8 
 9 //类实现接口
10     class HPMultiPrinter:IMultiPrinter
11     {
12         public void Print(string content)
13         {
14             Console.WriteLine("惠普打印机正在打印..." + content);
15         }
16 
17         public void Copy(string content)
18         {
19             Console.WriteLine("惠普打印机正在复印..." + content);
20         }
21 
22         public bool Fax(string content)
23         {
24             Console.WriteLine("惠普打印机正在传真..." + content);
25             return true;
26         }
27     }
28 
29 //调用接口
30         static void Main(string[] args)
31         {
32             //使用接口定义,类实现该对象
33             IMultiPrinter objPrinter = new HPMultiPrinter();
34             objPrinter.Print("学生成绩表");
35             objPrinter.Copy("学生信息表");
36             objPrinter.Fax("老师信息表");
37             Console.ReadKey();
38         }
接口的简单应用实例

12.接口的实践

  12.1提高团队成员并行开发项目的效率

    接口使用者只关心接口的应用功能,不必关心接口的内部实现

    接口实现者只关心如何实现接口的内部实现,不关系谁使用

  12.2提高系统的可维护性

    当用户的需求改变时,只需要修改接口的实现,系统即可更新

13.接口总结

  接口的应用场合

    如果某一个功能点需求变化较多,应使用接口保证系统的可扩展性

    如果想实现团队成员的并行开发,可以使用接口来规范对象的使用

  接口编写规范

    接口成员只能是一个声明

    实现接口的类必须全部实现接口中规定的属性、方法

  特别说明

    接口的使用不是必须的,要根据用户的需求来决定

14.继承多态

  多态的应用大大提高了程序的可扩展性

  继承多态实现的条件:1、父类中必须有抽象方法和虚方法

            2、子类必须重写父类中的抽象方法或虚方法

            3、子类对象必须转换成父类类型去使用

  父类类型作为方法的参数类型,调用时实际传递的是子类的对象

15.接口多态

  实现接口多态的条件:1、一个接口必须被两个或两个以上类实现

            2、接口实现类必须转换成接口类型去使用

  接口作为方法参数类型,调用时实际传递的是接口实现类的对象

  接口多态在实践中应用最广泛

  通俗来说,同样一个方法(方法声明的是接口类对象),因为传递的对象(传递的是接口的派生类)不一样,执行的过程和结果也不一样,这就是接口多态

 1 //定义接口
 2     interface IMultiPrinter
 3     {
 4         void Print(string content);
 5         void Copy(string content);
 6         bool Fax(string content);
 7     }
 8 
 9 //惠普类
10     class HPMultiPrinter : IMultiPrinter
11     {
12         public void Print(string content)
13         {
14             Console.WriteLine("惠普打印机正在打印..." + content);
15         }
16 
17         public void Copy(string content)
18         {
19             Console.WriteLine("惠普打印机正在复印..." + content);
20         }
21 
22         public bool Fax(string content)
23         {
24             Console.WriteLine("惠普打印机正在传真..." + content);
25             return true;
26         }
27     }
28 
29 //佳能类
30     class JNMultiPrinter : IMultiPrinter
31     {
32         public void Print(string content)
33         {
34             Console.WriteLine("佳能打印机正在打印..." + content);
35         }
36 
37         public void Copy(string content)
38         {
39             Console.WriteLine("佳能打印机正在复印..." + content);
40         }
41 
42         public bool Fax(string content)
43         {
44             Console.WriteLine("佳能打印机正在传真..." + content);
45             return true;
46         }
47     }
48 
49 //实现多态
50     class Program
51     {
52         static void Main(string[] args)
53         {
54             Print(new HPMultiPrinter());
55             Print(new JNMultiPrinter());
56             Console.ReadLine();
57         }
58 
59         static void Print(IMultiPrinter objPrinter)
60         {
61             objPrinter.Print("学生成绩表");
62             objPrinter.Copy("学生信息表");
63             objPrinter.Fax("老师信息表");
64         }
65     }
接口多态的简单应用

16.接口与抽象类

 抽象类接口
不同点用abstract定义用interface定义
只能继承一个类可以实现多个接口
非抽象派生类必须实现抽象方法实现接口的类必须实现所有成员
需要override实现抽象方法直接实现
相似点都不能直接实例化
都包含未实现的方法
子类或“接口实现类”必须实现未实现的方法

 17.设计模式与简单工厂

  简单工厂是设计模式中的一种。

   什么是设计模式?设计模式是人们在开发中遇到的共性问题而提出的一个解决方案

           程序开发中的设计模式只是一种参考,而不是一成不变的

  简单工厂:典型应用是解决单一对象创建的扩展问题

  抽象工厂:典型应用是解决多种类型数据库访问问题或不同业务逻辑

  单例模式:典型应用是在开发中设计购物车的时候需使用

18.简单工厂

  

  实现原理:工厂通过“选择”的方法来指定应该创建哪个“接口实现类的对象”

       “工厂”其实就是一个对象创建的方法,让对象“延迟创建”

  简单工厂创建步骤:

    1、添加接口。

    2、添加需要实现接口的类并实现接口。

    3、添加工厂(建议使用静态类)。
      <1>定义接口变量。
      <2>读取配置文件。
      <3>使用反射创建接口实现类的对象。
      <4>返回接口变量(实际返回的是一个接口实现类的对象)

    4、添加配置文件并配置相应的节点。

    5、调用工厂方法并实现功能。

 1 //接口
 2     /// <summary>
 3     /// 打印接口(产品原型)
 4     /// </summary>
 5     public interface IReport
 6     {
 7         void StartPrint();
 8     }
 9 
10 //实现接口的类1    
11     public class ExcelReport:Factory.IReport
12     {
13         public void StartPrint()
14         {
15             System.Windows.Forms.MessageBox.Show("...正在调用Excel报表程序");
16         }
17     }
18 
19 //实现接口的类2
20     public class WordExport:Factory.IReport
21     {
22         public void StartPrint()
23         {
24             System.Windows.Forms.MessageBox.Show("...正在调用Word报表程序");
25         }
26     }
27 
28 //工厂类
29     public class Factory
30     {
31         //【1】定义接口变量
32         static IReport objReport = null;
33         //【2】读取配置文件
34         static string reportType = ConfigurationManager.AppSettings["ReportType"].ToString();
35         //【3】根据配置文件初始化接口变量
36         public static IReport Choose()
37         {
38             switch (reportType)
39             {
40                 case "ExcelReport":
41                     objReport = new ExcelReport();
42                     break;
43                 case "WordReport":
44                     objReport = new WordExport();
45                     break;
46                 default:
47                     break;
48             }
49             return objReport;
50         }
51     }
52 
53 //实现调用代码
54         private void btn_Print_Click(object sender, EventArgs e)
55         {
56             //IReport objReport = new ExcelReport();//new WordReport
57             //根据工厂提供的具体产品来使用
58             //这种设计方法,使得调用者和后台实现方法完全脱离,大大增加了系统的可扩展性
59             IReport objReport = Factory.Factory.Choose();
60             objReport.StartPrint();
61         }
简单工厂的应用

19.反射 Reflection

  反射的概念

    反射是.NET中的一个重要技术。通过反射,可以在运行时获得某个类型的各种信息,包括方法、属性、事件、及构造函数等,还可以获得每个成员的名称等信息。

  反射的特点

    在程序运行时,动态创建对象、调用方法、设置属性和激励事件,而不是在编译的时候完成。

  反射的应用

    在VS中的智能提示、使用MSIL反汇编工具查看IL代码用的都是反射技术。

    Java开发工具Eclipse中的插件使用,也是用反射技术。

  开发中的应用

    系统需要基于插件开发的时候,必须要用反射。

    在简单工厂和抽象工厂设计模式中将使用反射技术。

    使用反射一般都要配合接口使用。

    反射技术是的系统性能一定程度降低,除非必要情况,反射不宜过多使用。

 1 //1、创建接口类
 2 namespace ICal
 3 {
 4     public interface ICalculator
 5     {
 6         int Add(int a, int b);
 7         int Sub(int a, int b);
 8     }
 9 }
10 
11 //2、创建计算器类实现接口
12 namespace CalDll
13 {
14     public class Calculator : ICal.ICalculator
15     {
16         public int Add(int a, int b)
17         {
18             return a + b;
19         }
20 
21         public int Sub(int a, int b)
22         {
23             return a - b;
24         }
25     }
26 }
27 
28 //3、使用反射技术应用接口
29 using System.Reflection;//【1】引入反射命名空间
30 using ICal;//【2】引入接口类库
31 
32         private void btn_Cal_Click(object sender, EventArgs e)
33         {
34             //动态加载程序集并创建对象
35             ICalculator objCal = (ICalculator)Assembly.LoadFrom("CalDll.dll").CreateInstance("CalDll.Calculator");
36             //通过接口完成运算
37             int result = objCal.Add(Convert.ToInt16(this.tb_Num1.Text.Trim()), Convert.ToInt16(this.tb_Num2.Text.Trim()));
38             this.lbl_Result.Text = result.ToString();
39         }
用反射技术写了一个计算器应用程序

 20.基于接口设计三层架构

  开发团队协作的保障——指定项目开发规范

    项目命名、模块命名、类编写规范、注释要求...

    数据库设计规范:表的命名、实体属性命名、约束...

    项目开发中协作的形式:垂直分工、并行开发

  垂直分工协作

    任务分工:按功能模块

    技术要求:要求开发人员必须熟悉项目各模块(DAL、BLL、UI)编写方法

    应用场合:中小型项目,且开发团队力量较小

    现实比较:类似于小企业的“作坊式”生产

    人员特点:开发人员的工作贯穿整个项目

  并行开发协作

    任务分工:按层(BLL、DAL、UI)划分

    技术要求:只要求开发人员熟悉项目其中一层(BLL、DAL、UI)的业务和编写方法

    应用场合:大中型项目,且开发团队力量强

    现实比较:类似于大企业的“专业化、流水线”生产

    人员特点:熟悉系统业务的开发人员设计BLL业务层

         熟悉数据库开发的人员设计DAL数据层

         善于设计用户界面的开发人员设计UI

 

 

  

    

  

 

转载于:https://www.cnblogs.com/yangmengke2018/p/10877199.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值