面向对象编程的核心

时间:2010-08-17 17:15:36

标签: oop

我试图理解php或actionscript proect的面向对象编程的核心。据我所知,我们将有一个Main类来控制项目的不同元素。例如,photoslider类,音乐控制类......等等。我在Main类中创建了这些类的实例,并使用它们的方法或属性来控制这些对象。

我已经研究了许多OOP文章,但大多数只讨论了继承,封装...等我不确定我是否对此如此,如果有人可以解释更多,我将不胜感激。谢谢!

6 个答案:

答案 0 :(得分:3)

同样的问题,当我开始职业生涯的时候,我一直在问,但随着职业生涯的进步,我理解了面向对象。

但是对于oop中非常基本的起点。

1-考虑对象只是尝试将您的日常家居用品(您的笔记本电脑,您的ipad,您的手机,您的宠物)联系起来

第2步 -

尝试将(您的电视和遥控器)等对象联系起来,这样可以让您了解对象应该如何相互关联的基本概念。

第3步 -

尝试隐藏事物的构成方式,以创建一个完整的功能,如你的身体组成(心脏,肺和许多其他器官)

第4步 -

尝试考虑对象的生命周期(例如汽车enigne在Car外部不太有用,所以如果car是一个对象,那么这个对象必须包含一个引擎,当实际的汽车对象破坏引擎时也会被破坏)

第5步 -

尝试了解一个多态性(就像一个ScrewDriver可以根据你的需要采取形状,然后映射到你的对象,如果你使用c#而不是试图利用ToString()方法覆盖)

第6步 -

尝试为你的现实生活对象创造一个现实生活的边界(就像你的房子;你通过各种方式保护你的房子)

这是最初的学习..阅读尽可能多的文字,并尝试通过自己的例子学习

在最后; oop是一门艺术品,试图掩饰它。

答案 1 :(得分:2)

我的主要建议是将对象视为“智能serfs”:其中每一个都有内存(数据成员)和逻辑(成员函数)。 根据我的经验,OOP的最大优势在于您对设计发展的控制:如果您的软件远程有用,它将会发生变化,OOP为您提供了可持续变更的工具。特别是:

  • 一个班级应该改变只有一个原因,所以它必须只解决一个问题(单一责任原则)
  • 更改类的行为应该通过扩展来进行,而不是通过修改它(OPEN CLOSED PRINCIPLE)
  • 专注于接口,而不是继承
  • 告诉,不要问!命令对象,不要将它们用作“数据存储”

还有其他原则,但我认为这些是必须真正理解才能在OOP中取得成功的原则。

答案 2 :(得分:2)

在我开始使用Ruby编程之前,我不确定我是否理解过OOP,但我认为我现在已经理解它了。

曾经向我解释过汽车的组成部分并且帮助了很多......

Car )这样的东西。

my_car和girlfriends_car都是 Car 实例

my_car存在称为轮胎的这些东西。

my_car有四个轮胎的实例 - tyre1,tyre2,tyre3,tyre4

所以我有两个班 - 汽车,轮胎 我有每个班级的多个实例。

Car类有一个名为Car.colour的属性。

my_car.colour是蓝色

girlfriends_car是粉红色的

对我而言,关键在于理解类方法和实例方法之间的区别。

实例方法

实例方法类似于my_car.paint_green。调用Car.paint_green没有任何意义。油漆什么车绿色?不。它必须是girlfriend_car.wrap_around_tree,因为实例方法必须应用于该类的实例。

课程方法

说我想建一辆车? my_new_car = Car.build

我调用了一个Class方法,因为在实例上调用它是没有意义的吗? my_car.build? my_car已经建成。

<强>结论

如果您正在努力理解OOP,那么您应该确保理解Class本身与该Class实例之间的区别。此外,您应该尝试理解类方法和实例方法之间的区别。我建议学习一些Ruby或Python,这样你就可以更全面地理解OOP,而不会增加使用非OOP语言编写OOP的复杂性。

真正的OOP语言会带来很大的好处。在Ruby中,一切是一个类。甚至没有(Nil)是一个班级。字符串是类。数字是类,每个类都是Object类的后代,所以你可以做一些巧妙的事情,比如从Object继承instance_methods方法,所以String.instance_methods会告诉你字符串的所有实例方法。

希望有所帮助!

凯文。

答案 3 :(得分:1)

好像你在询问OOP的程序或“怎么样”,而不是概念。

对于how-tos,你大多是正确的:我不是特别熟悉PHP或ActionScript,但对于我们这些在.NET中的人来说,你的程序会有一些可以控制的入口点,然后它将调用不正常的对象,函数,方法或其他任何东西 - 通常将控制权转移到其他代码片段 - 来执行你已经决定的任何事情。

在伪代码中,它可能看起来像:

EntryPoint
  Initialize (instanciate) a Person
  Validate the Person's current properties
  Perform some kind of update and/or calculation
  provide result to user
Exit

如果您正在寻找的是“为什么”,那么您已经找到了正确的位置。封装,继承等术语的定义将阐明为什么我们做OOP。

答案 4 :(得分:1)

主要是将属于某些区域的代码分组在一起。在非OOP语言中,您经常遇到的问题是,您无法分辨哪个函数用于/修改哪些结构或函数往往会执行太多松散相关的事情。一种解决方法是引入严格的命名方案(例如,使用与其关联的结构名称启动每个函数名称)。使用OOP,每个函数都与数据结构(对象)相关联,因此可以更轻松地组织代码。如果您的代码变得更大/任务数量更大,继承开始产生影响。

好的例子是表示形状和返回其中心的函数的结构。在非OOP中,该函数必须区分每个结构。如果添加新形状,则会出现问题。您必须教您的功能如何计算该形状的中心。现在想象一下,你还有恢复环绕和区域的功能......继承解决了这个问题。

请注意,您可以使用非OOP语言进行OOP编程(例如参见C中的glib / gtk +),但是“真正的”OOP语言使得OOP风格的代码变得更容易并且通常不易出错。另一方面,您可能会误用几乎所有OOP语言来编写纯粹的命令式代码:-)并且没有语言可以阻止编写愚蠢和低效的代码,但这是另一个故事。

答案 5 :(得分:1)

不确定你正在寻找什么样的答案,但我认为1000名新毕业的comp sci学生中有10人会同意:没有多少书籍和理论可以替代实践。换句话说,我可以详细解释封装,多态,继承,但它无法教你如何有效地使用OO。

没有人能告诉你如何编程。随着时间的推移,你会发现,无论你工作多少个不同的项目,你都会一遍又一遍地解决同样的问题。你可能会经常问自己:

  • 如何以有意义的方式向客户表示对象或流程?
  • 如何在没有复制粘贴代码的情况下重用功能?
  • 课堂上究竟是什么/课程应该如何细化?
  • 如何根据专业化或类型支持一类对象的功能变化?
  • 如何在不重写现有代码的情况下支持功能变化?
  • 如何构建大型应用程序以使其易于维护?
  • 如何让我的代码易于测试?
  • 我在做什么似乎真的很复杂/ hacky,有更简单的方法吗?
  • 当我完成时,其他人是否能够维护代码?
  • 能否在6个月或一年后维护代码?

关于这个主题有很多书,如果你需要一些建议,他们可以给你一个良好的开端。但是相信我,时间和实践都是你需要的,而且不会太长 - 在一个真实的项目上可能是6或9个月 - 当OO习语成为第二天性时。