在本章中,我们将学习面向对象(OO)并探索它在软件系统开发过程中带来的好处。
为了回答这个问题,我们首先(简单地)看看如何使用结构化编程方法(也称为函数式编程)来设计软件系统。
在结构化编程中,一般方法是分析问题并将其分解为函数来执行特定任务。大多数这些函数都需要数据类型来处理。 功能系统中的数据通常存储在数据库中,或者可以作为全局变量.
保存在内存中让我们举一个学校管理系统的简单示例。该系统存储学校所有学生和讲师的详细信息。同时,它还管理学校提供的课程信息,并跟踪哪些学生正在学习哪些课程。
系统需要存储学生、老师、考试和课程的信息,设计有以下功能:
从那里,我们可以构建数据、函数和依赖关系的图表,如下所示:
这种方法的问题是,如果我们要解决的问题变得过于复杂,系统将变得越来越难以维护。以上面的示例为例,如果请求改变了 Student 处理数据的方式,例如将 “出生年份” 从两个字数字转换为四位数字,该怎么办?只是这个小小的改变就可能导致不可预见的副作用并导致严重的问题。 考试、课程和老师的数据都依赖于学生的数据。此外,我们可能破坏了 add_student、enter_for_exams、issue_certificate 和 expel_student 函数。例如,add_student 肯定不再起作用,因为它需要两位数的“出生年份”数据,而不是四位数字。
从上面的例子中,我们可以看到结构化编程的一些缺点,包括函数和数据之间的相互依赖,导致难以维护,难以扩展且容易遇到意想不到的问题更改数据时。为了解决这些问题,我们需要一种新的方法,那就是面向对象(OO).
对象:可以理解为一个具体的实体,由2个主要组件组成:
属性:是对象的信息和特征。
方法:对象可以执行的操作和动作。
从上面的问题学校管理系统的例子中,我们可以有以下对象:
类: 是一种数据类型,包括对象将具有的预定义属性和方法。我们可以将类理解为创建对象的模板。
例如:类学生是所有学生的通用定义模板,包括共同的属性和方法,如姓名、出生年份和其他如入学等行为。对象是一个名为2004年出生的Nguyen Van A的特定学生,具有班级特征学生
封装就是将相关的属性和方法分组到同一个类中,以达到有效管理和使用的目的。这降低了复杂性并提高了安全性,同时也使代码易于维护和扩展。
public class Student { private String name; private String dateOfBirth; public void registerForCourse(Course course) { course.addStudent(this); } }
学生信息将被封装在Student类中,与Student相关的动作将通过该类中的方法进行。
传承
继承允许子类继承父类的属性和方法,以最佳地重用源代码并轻松扩展功能。
public class Person { private String name; private String dateOfBirth; } public class Student extends Person { private double gpa; } public class Teacher extends Person { private String department; }
Student 和 Teacher 都继承自 Person 类,有助于重用公共属性。每个子类都可以添加单独的属性或方法。
多态允许一个方法以多种不同的方式实现,即该方法可以在具有不同行为的子类中重新定义。
public class Person { public void introduce() { System.out.println("I am a person."); } } public class Student extends Person { @Override public void introduce() { System.out.println("I am a student."); } } public class Teacher extends Person { @Override public void introduce() { System.out.println("I am a teacher."); } } public class Main { public static void main(String[] args) { Person person = new Person(); Person student = new Student(); Person teacher = new Teacher(); person.introduce(); // I am a person. student.introduce(); // I am a student. teacher.introduce(); // I am a teacher. } }
introduce 方法在 Person 类中定义,并在 Student 和 Teacher 子类中重写。即使使用 Person 类型,当调用 introduce 方法时,系统将使用实际对象的适当方法(Student 或 Teacher ),表现出多态性。
抽象是一种处理一般概念的方法,而不需要过多关注具体的实现细节,从而提高灵活性并降低复杂性。
public class Student { private String name; private String dateOfBirth; public void registerForCourse(Course course) { course.addStudent(this); } }
通过Abstraction,我们定义一个带有泛型方法(startCourse())的抽象类(Course)。 MathCourse 和 ScienceCourse 等子类详细实现了这些方法,使系统易于扩展和定制。
以上是引入面向对象的详细内容。更多信息请关注PHP中文网其他相关文章!