博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异常、架构、框架、序列化、接口
阅读量:5224 次
发布时间:2019-06-14

本文共 9941 字,大约阅读时间需要 33 分钟。

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   finally16   {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:IMultiPrinter11     {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 : IMultiPrinter11     {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 : IMultiPrinter31     {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 Program51     {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     ///  3     /// 打印接口(产品原型) 4     ///  5     public interface IReport 6     { 7         void StartPrint(); 8     } 9 10 //实现接口的类1    11     public class ExcelReport:Factory.IReport12     {13         public void StartPrint()14         {15             System.Windows.Forms.MessageBox.Show("...正在调用Excel报表程序");16         }17     }18 19 //实现接口的类220     public class WordExport:Factory.IReport21     {22         public void StartPrint()23         {24             System.Windows.Forms.MessageBox.Show("...正在调用Word报表程序");25         }26     }27 28 //工厂类29     public class Factory30     {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 WordReport57             //根据工厂提供的具体产品来使用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 CalDll13 {14     public class Calculator : ICal.ICalculator15     {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

你可能感兴趣的文章
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
vue:axios二次封装,接口统一存放
查看>>
vue中router与route的区别
查看>>
js 时间对象方法
查看>>
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>