我最近和一位不喜欢的同事进行了一场辩论 面向对象编程. 。引起我注意的是他说的话:

“在对象中进行编码有什么意义?如果它是重用的,那么我可以创建一个库并调用手头任何任务所需的任何函数。我需要这些多态性、继承、接口、模式或其他概念吗?”

我们是一家小公司,为电子商务网站和房地产开发小型项目。

如何在“日常、现实世界”设置中利用 OOP?或者 OOP 真的是为了解决复杂的问题而不是为了“日常”开发吗?

有帮助吗?

解决方案

约OOP的美好事物来自捆扎的一组数据的一组的行为。

所以,如果你需要做一个相关的数据集的许多相关的操作,你可以写上一个结构进行操作的功能很多,或者您可以使用一个对象。

对象给你继承的形式,一些代码重用的帮助。

IME,很容易与一组已知的属性和方法,它是将一组复杂的结构和功能上它们操作的对象一起工作。

有些人会去关于继承和多态。这些都是有价值的,但在OOP的真正价值(在我看来)来自其封装及联营数据与行为的好方法。

你应该在你的项目中使用OOP?这取决于你的语言如何支持面向对象的。这取决于你需要解决的各类问题。

不过,如果你是做小网站,你还在谈论足够的复杂性,我会用给定的开发语言提供适当的支持面向对象的设计。

其他提示

我亲自查看:上下文

当你在OOP编程你有上下文的认识。它可以帮助你组织代码以这样一种方式,它更容易理解,因为现实世界中也是面向对象的。

比得到的东西只是工作更多 - 你的朋友的角度来看,一个设计良好的面向对象设计比较容易理解,遵循,拓展,延伸和落实。它是如此容易得多例如委托的工作,断然类似或持有应呆在一起的数据(是即使是C结构是一个对象)。

好吧,我相信很多人会给出更多学术上正确的答案,但以下是我对一些最有价值的优势的看法:

  • OOP 允许更好的封装
  • OOP 允许程序员以更符合逻辑的方式思考,使软件项目更易于设计和理解(如果设计良好)
  • OOP 可以节省时间。例如,查看可以使用 C++ 字符串对象、向量等执行的操作。所有这些功能(等等)都带来了“免费”。现在,这些确实是类库的功能,而不是OOP本身的功能,但是几乎所有的OOP实现都带有不错的类库。你能用 C 实现所有这些东西(或大部分)吗?当然。但为什么要自己写呢?

看看设计模式的使用,您就会看到 OOP 的实用性。它不仅仅涉及封装和重用,还涉及可扩展性和可维护性。正是接口让事物变得强大。

举几个例子:

  • 实现没有对象的流(装饰器模式)很困难

  • 如果没有对象,向现有系统添加新操作(例如新加密类型(策略模式))可能会很困难。

  • 查看PostgreSQL的实现方式与数据库书说应该实现数据库的方式,您会看到很大的差异。该书将为每个操作员提出节点对象。Postgres使用无数的表和宏来模仿这些节点。因此,它不那么漂亮,而且很难扩展。

这样的例子还在继续。

大多数编程语言的强大之处在于:其提供的抽象。面向对象的编程提供了非常强大的抽象系统,它可以让你管理相关的想法或行为之间关系的方式。

考虑计算面积对于任意和扩大的形状的集合的任务。任何程序员可以快速编写功能,适用于圆形,方形,三角形,ECT的区域。并将它们存储在库中。想写识别并计算任意形状的区域中的程序时的困难来了。每次添加一种新的造型,说五边形,你将需要更新和扩展类似的IFCASE结构,让你的程序,以确定新的形状,并从“库函数”调用正确的区域常规。一段时间后,与该方法相关的维护成本开始堆积。

使用面向对象的编程中,很多这来自free--刚刚定义包含的面积法的Shape类。然后,它并没有真正不管你在运行时处理什么具体的形状,只要每个几何图形,从外形继承了一个对象,并调用面积法。面向对象模式处理是否细节在这个时刻,与该用户的输入,我们需要计算出一个圆形,三角形,正方形,五边形或者是椭圆选择的区域只是增加了半分钟前。

如果你决定改变该地区函数被调用的方式背后的接口?面向对象编程,你只想更新Shape类和变化自动地传播到从该类继承的所有实体。对于非面向对象的系统,您将面临通过您的“函数库”苦读和更新每个单独接口的任务。

总之,面向对象的编程提供了一个抽象强大的形式,可以通过在你的代码消除重复和精简扩展和维护节省您的时间和精力。

所有的编程模式有相同的目标:隐藏不必要的复杂性。

有些问题很容易有必要的范式来解决,比如你的朋友使用。其他的问题很容易用面向对象的范例解决。还有许多其他的范式。其中主要有(逻辑编程,功能编程,以及命令性编程)都彼此相等;面向对象的编程通常被认为是一个扩展命令性编程。

当程序员造型类似于项目,但不一样的面向对象的编程,最好使用。当务之急范式会把不同种类的型号为一体的功能。一个面向对象的范例不同种类的模型分成上相关对象的不同方法。

您的同事似乎被卡在一个范例。祝好运。

1994年左右,我试图让OOP和C ++感的同时,发现自己沮丧,尽管我可以在原则上理解OOP的值。我就是这么用能乱用其他语言的应用程序(主要是基本的,大会和Pascal家族语言),它好像我赞成一些学术抽象放弃生产力的任何部分的状态。不幸的是,我与像MFC框架OO第几次接触,它更容易破解,但并不一定提供多少启蒙的方式。

只有通过持久性的组合,暴露于交替的(非C ++),这两个1)工作,2)更多相干且直观地比等效的程序代码处理对象的方法,以及面向对象的代码仔细分析我开始真正得到它。而15年后,我在新的定期惊讶(我)的高明,但令人印象深刻的简单的面向对象的解决方案,我无法想象在程序方法,因为这样做整齐的发现。

我已经经历了相同的一组斗争试图使函数式编程范式的意义,在过去几年中。套用保罗·格雷厄姆,当你低头的功率连续,您会看到缺少的一切。当你正在寻找了电力的连续,你看不到的力量,你刚才看到的怪事。

我想,以承诺做一些不同的方式,你必须1)看到有人明显是更高效更强大的结构和2)暂停怀疑,当你发现自己击中墙壁。它可能有助于有一个导师是谁,至少一点点进一步沿着他们的新范式的理解了。

除非暂停怀疑,如果你希望有人能够快速神交一个面向对象模型的价值所需的魄力,我想你可以做很多事情不如问别人花一个星期与注重实效的编程书on Rails的。它遗憾的是并留出了很多的魔法是如何工作的细节,但它是一个相当不错的介绍面向对象的抽象的系统的功率。如果通过这本书后的工作,你的同事仍然没有看到OO的价值由于某种原因,他/她可能是一个无望的情况下。但是,如果他们愿意花一点时间与具有强固执己见OO设计的作品,并从0-60让他们远比程序语言做同样的事情更快的方法工作,有可能只是希望。我想,即使你的工作并不涉及网络的发展这是事实。

我不那么肯定带来了“真实世界”将成为一个大卖点,作为编写好的应用程序一个工作框架,因为事实证明,尤其是在像C#和Java,造型静态类型语言现实世界中往往需要曲折的抽象。您可以通过查看成千上万的人在努力的东西为“形”的几何抽象的表面上简单的模型中看到模拟现实世界中的困难的一个具体的例子(形,椭圆形,圆形)。

在我看来,OOP的力量不显示自己,直到你开始谈论继承和多态。

如果一个对OOP论点都是封装和抽象的概念,以及这是不是对我来说是非常有说服力的论据。我可以写一个巨大的图书馆,只有记录,我希望用户知道的接口,或者我可以依靠语言级别的结构,如Ada中的包,使领域私有的,只能暴露它是什么,我想露出。

然而,真正的优点是当我已经写在一个通用的层次代码,以便它可以重复使用以后,使得完全相同的代码的接口被用于不同的功能,以达到相同的结果。

这是为什么方便?因为我站在巨人的肩膀上完成我当前的任务。这个想法是,我可以煮一个问题的部分下降到最基本的部件,构成该组合......构成该项目中的对象物体的对象。通过使用一个类定义的行为相当不错,在一般情况下,我可以使用相同的成熟代码来构建的同一件事更具体的版本,然后同样的事情更具体的版本,然后又一个更具体版本同样的事情。关键是,这些实体有一个已经被编码和测试的通用性,而且也没有必要稍后再次reimpliment它。如果我不使用继承这一点,我最终重新实现通用的功能或明确反对旧代码,它提供了一个场景对我来说,引入控制流的错误链接我的新代码。

多态性是在我需要实现从物体的某一功能性的实例非常方便,但也从类似所需的相同的功能,但独特的类型。例如,在Qt中,有将项目拖到一个模式,使数据可以显示,你可以很容易地维护该对象的元数据的想法。如果没有多态性,我需要用更多的细节来打扰我比我目前做的(即我需要实现的是进行同样的业务逻辑,最初是打算去模型上的项目相同的代码接口)。因为基类我的数据绑定对象与模型本身交互,我可以代替插入元数据在这个模型中,没有麻烦。我得到了我需要走出对象与在什么模型需要不关心,模型得到了它超过了我已添加到类中没有关注的需求。

请你的朋友想象的任何对象在他非常客房,府或市......如果他能告诉一个这样的对象,其系统本身并能够做一些有意义的工作。搜索结果事情,比如按钮心不是单独做的事情 - 它需要大量的对象以打个电话。结果,类似地汽车发动机由曲轴,活塞,火花塞。 OOPS概念已经从我们在我们的生活中自然的过程或事物的感知能力发展。搜索结果“内部COM”一书由发问采取类比从确定动物的儿时游戏讲述COM的目的。

设计胜过技术和方法。良好的设计往往包含复杂性管理的普遍原理,如得墨忒耳的法律,是在什么OO语言特性努力编纂心脏。

好的设计是不依赖于使用OO特有的语言特性尽管它通常是在那些最佳利益来使用它们。

它不仅使

  • 在当前情况下,对于其他人(和你自己)来说,编程更容易/更易于维护
  • 它已经允许更轻松的数据库 CRUD(创建、更新、删除)操作。

您可以查找有关它的更多信息:- 爪哇:Hibernate-点网:实体框架

甚至了解 LINQ (Visual Studio) 如何使您的编程生活变得更加轻松。

  • 另外,您可以开始使用设计模式来解决现实生活中的问题(设计模式都是关于 OO 的)

也许用一个小演示来演示甚至很有趣:

  • 假设您需要以类似的方式将员工、帐户、成员、书籍存储在文本文件中。

.PS。我尝试以伪方式编写它:)

面向对象的方式

您调用的代码:io.file.save(objectsCollection.ourFunctionForSaving())

类对象集合

函数 ourFunctionForSaving() 作为字符串

字符串_对象

   for each _Object in objectsCollection
         Objects &= _Object & "-"
   end for

返回_Objects结束方法

非面向对象方式

我不认为我会写下非 oo 代码。但想想吧:)

现在让我们说

以面向对象的方式。上面的类是所有保存账本、员工、成员、账户等方法的父类。如果我们想更改保存到文本文件的方式会发生什么?例如,使其与当前标准 (.CVS) 兼容。

假设我们想添加一个加载函数,您需要编写多少代码?在面向对象的方式中,您只需要添加一个 New Sub 方法,该方法可以将所有数据拆分为参数(这会发生一次)。

让你的同事考虑一下:)

在其中状态和行为对准不良域,面向对象减少了这些结构域之内的整体依赖性密度(即复杂性),这使得所得的系统较不脆。

这是因为面向对象的本质是基于以下事实,组织,它不状态和行为之间dustinguish可言,治疗都均匀地“特征”。对象仅仅设置的clumpled以最小化特征的总体依赖性。

在其它结构域,面向对象是不是最好的方法。有针对不同的问题不同的语言范例。经验的开发人员知道这一点,并愿意用任何语言是最接近域。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top