基于对象职责明确原则优化程序

学习了如何编写通用数据访问类SQLHelper,在此基础上还可以继续优化程序,基于对象职责明确原则,将程序封装成学生数据信息访问类、班级信息访问类、成绩信息访问类等。

 1     /// <summary>
 2     /// 学员信息数据访问类
 3     /// </summary>
 4     class StudentService
 5     {
 6         public int AddStudent(string studentName, string gender, DateTime birthday,
 7             string stuIdNo, int age, string phoneNumber, string stuAddress, int classId)
 8         {
 9             string sql = "insert into Students(StudentName,Gender,Birthday,studentIdNo,Age,PhoneNumber,studentAddress, classId)";
10             sql += "values(‘{0}‘,‘{1}‘,‘{2}‘,{3},{4},‘{5}‘,‘{6}‘,{7})";
11             sql = string.Format(sql, studentName, gender, birthday, stuIdNo, age, phoneNumber, stuAddress, classId);
12             return SQLHelper.Update(sql);
13         }14      }
 1         static void Main(string[] args)
 2         {
 3             //获取用户输入
 4             Console.WriteLine("请输入学员姓名:");
 5             string stuName = Console.ReadLine();
 6             Console.WriteLine("请输入学员性别:");
 7             string gender = Console.ReadLine();
 8             Console.WriteLine("请输入学员出生日期:");
 9             DateTime birthday = Convert.ToDateTime(Console.ReadLine());
10             Console.WriteLine("请输入学员身份证号:");
11             string stuIdNo = Console.ReadLine();
12             Console.WriteLine("请输入学员年龄:");
13             int age = Convert.ToInt16(Console.ReadLine());
14             Console.WriteLine("请输入学员电话:");
15             string phoneNumber = Console.ReadLine();
16             Console.WriteLine("请输入学员身份地址:");
17             string stuAddress = Console.ReadLine();
18             Console.WriteLine("请输入学员班级编号:");
19             int classId = Convert.ToInt16(Console.ReadLine());
20
21             //调用数据访问方法
22             StudentService objstuService = new StudentService();
23             int result = objstuService.AddStudent(stuName, gender, birthday, stuIdNo, age, phoneNumber, stuAddress, classId);
24             //展示结果
25             Console.WriteLine(result);
26             Console.ReadLine();
27         }

但是以上代码存在缺点:方法参数多

1.定义和使用不方便,容易把参数写错

2.当对象是属性变化时,方法的参数必须改变

问题解学办法:使用实体类作为方法参数,稳定对外接口

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6
 7 namespace ASP.NETDemo
 8 {
 9     /// <summary>
10     /// 学生实体类
11     /// </summary>
12     class Student
13     {
14         public int StudentId { get; set; }
15         public string StudentName { get; set; }
16         public string Gender { get; set; }
17         public DateTime Birthday { get; set; }
18         public decimal StudentIdNo { get; set; }
19         public int Age { get; set; }
20         public string PhoneNumber { get; set; }
21         public string StudentAddress { get; set; }
22         public int ClassId { get; set; }
23     }
24 }

优化后

1        public int AddStudent(Student objStudent)
2         {
3             string sql = "insert into Students(StudentName,Gender,Birthday,studentIdNo,Age,PhoneNumber,studentAddress, classId)";
4             sql += "values(‘{0}‘,‘{1}‘,‘{2}‘,{3},{4},‘{5}‘,‘{6}‘,{7})";
5             sql = string.Format(sql,objStudent.StudentName,objStudent.Gender,objStudent.Birthday,objStudent.StudentIdNo,objStudent.Age,objStudent.PhoneNumber,objStudent.StudentAddress, objStudent.ClassId);
6             return SQLHelper.Update(sql);
7         }
 1        static void Main(string[] args)
 2         {
 3             //创建学员对象
 4             Student objStu = new Student();
 5
 6             //获取用户输入,封装学员对象
 7             Console.WriteLine("请输入学员姓名:");
 8             objStu.StudentName = Console.ReadLine();
 9             Console.WriteLine("请输入学员性别:");
10             objStu.Gender = Console.ReadLine();
11             Console.WriteLine("请输入学员出生日期:");
12             objStu.Birthday = Convert.ToDateTime(Console.ReadLine());
13             Console.WriteLine("请输入学员身份证号:");
14             objStu.StudentIdNo =Convert.ToDecimal( Console.ReadLine());
15             Console.WriteLine("请输入学员年龄:");
16             objStu.Age = Convert.ToInt16(Console.ReadLine());
17             Console.WriteLine("请输入学员电话:");
18             objStu.PhoneNumber = Console.ReadLine();
19             Console.WriteLine("请输入学员身份地址:");
20             objStu.StudentAddress = Console.ReadLine();
21             Console.WriteLine("请输入学员班级编号:");
22             objStu.ClassId = Convert.ToInt16(Console.ReadLine());
23
24             //调用数据访问方法
25             StudentService objstuService = new StudentService();
26             int result = objstuService.AddStudent(objStu);
27             //展示结果
28             Console.WriteLine(result);
29             Console.ReadLine();
30         }
时间: 2024-11-05 23:34:51

基于对象职责明确原则优化程序的相关文章

《设计模式之禅》笔记整理--面对对象设计六大原则

第一章.面对对象设计六大原则: (1).单一职责原则:应该有且只有一个原因引起类的变更. 为什么要用单一职责原则:(1).类的复杂性降低,实现什么职责都有清晰明确的定义. (2).可读性提高,复杂性降低,当然可读性提高了. (3).可维护性提高,可读性提高,当然更容易维护了. (4).变更引起的风险降低,一个接口修改,只对相应的实现类有影响. 职责划分的例子:电话过程可以划分为两个职责:(1).协议管理(2).数据传送 :RBAC模型,基于角色的访问控制 (2).里氏替换原则:目的:增强程序的健

(转载)GRASP职责分配原则

GRASP (职责分配原则) 要学习设计模式,有些基础知识是我们必须要先知道的,设计模式是关于类和对象的一种高效.灵活的使用方式,也就是说,必须先有类和对象,才能有设计模式的用武之地,否则一切都是空谈,那么类和对象是从那冒出来的呢?这时就需要比23种设计模式更重要更经典的GRASP模式登场了,嘿嘿,原来这才是老大! GRASP(General Responsibility Assignment Software Patterns),中文名称为"通用职责分配软件模式",GRASP一共包括

面对对象编程七大原则

面对对象编程七大原则: 1. OCP 全称:“Open-Closed Principle” 开放-封闭原则 说明:对扩展开放,对修改关闭. 优点:按照OCP原则设计出来的系统,降低了程序各部分之间的耦合性,其适应性.灵活性.稳定性都比较好.当已有软件系统需要增加新的功能时,不需要对作为系统基础的抽象层进行修改,只需要在原有基础上附加新的模块就能实现所需要添加的功能.增加的新模块对原有的模块完全没有影响或影响很小,这样就无须为原有模块进行重新测试. 如何实现“开-闭”原则 在面向对象设计中,不允许

Java基于对象基础 基于对象和面向对象的区别(转)

Java基于对象基础 基于对象和面向对象的区别 JavaScript设计者想把javascript语言设计成基于对象(object-based)的语言,他想把这个与面向对象(object-oriented)语言区分开来.但是实际上,可以将基于对象看作是面向对象. 原型对象和类的区别 在JavaScript中没有类这一可以使用关键字,当然保留字不算.所以它有自己对类这种封装结构的实现,这和Java,c++还是有很大区别的.但是我们还是能将原型对象(prototype object)看做是类,它们的

《C++ Primer》 对象、数组、基于对象设计、泛型设计

数组 C++ 不支持数组的抽象 abstraction 也不支持对整个数组的操作我们有时会希望对整个数组进行操作例如把一个数组赋值给另外一个数组对两个数组进行相等比较或者想知道数组的大小 size 例如给出两个数组我们不能用赋值操作符把一个数组拷贝到另一个中去. int array0[ 10 ], array1[ 10 ]; array0 = array1;  // error 数组类型本身没有自我意识它不知道自己的长度我们必须另外记录数组本身的这些信息. 数组和指针的关系: int ia[]

面向对象与基于对象的区别

面向对象和基于对象的区别是多态,和继承无关. 基于对象仅仅支持了抽象数据类型的功能,继承也不过体现了一种is-a的关系,也是抽象数据类型,只是建立了一个层次体系.但是什么是面向对象呢?就是根 据对象的实际类型不同,可以自动完成不同的行为,而仅仅通过一致的调用形式.换句话说,也就是虚函数实现的多态.以上观点,在OO设计中已经得到了公认, 多态的另一种实现方法是泛型. “面向对象”和“基于对象”两个不同的概念.面向对象的三大特点(封装,继承,多态)却一不可,通常“基于对象”使用对象,但是无法利用现有

JavaScript基于对象编程

js面向对象特征介绍 javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动(EventDirven)并具有安全性能的脚本语言.它具有面向对象语言所特有的各种特性,比如封装.继承及多态等.但对于大多数人说,我们只把javascript做为一个函数式语言,只把它用于一些简单的前端数据输入验证以及实现一些简单的页面动态效果等,我们没能完全把握动态语言的各种特性.在很多优秀的Ajax框架中,比如ExtJS.JQuery等,大量使用了javascript的面向

基于对象和面向对象的区别

基本上每个程序员都听过面向对象(Object-oriented)和基于对象(Object-based)这两个概念.其实这两个概念并没有很明显的界线,不过现在业界比较统一的认为只有完全具有封装.继承.多态三大特点的才能够叫做面向对象,否则即使设计中蕴含了一些对象的概念,也顶多称为基于对象. 基于对象是过程化语言自然演进而来,随着ADT思想的成熟而成熟,七十年代到八十年代初曾经非常流行,但是很快被风头更盛的面向对象给遮盖了,最典型的代表是Ada83.一贯被人认为是过程化语言代表的C语言,在实际应用中

《Essential C++》读书笔记 之 基于对象编程风格

<Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructors(析构函数) 4.3 何谓mutable(可变)和const(不变) 4.4 什么是this指针 4.5 Static Class Member(静态的类成员) 4.6 打造一个Iterator Class 4.7 合作关系必须建立在友谊的基础上 4.8 实现一个copy assignment operat