我怎样才能在OOP上变得更好?

时间:2010-08-23 12:42:52

标签: javascript oop

这对许多人来说可能是一个奇怪的问题,我实际上并不知道在这种情况下说 OOP 是否正确,因为 OOP 面向对象编程)通常与编程语言(如C ++和Java)相关联,而不是轻量级编程语言或脚本语言。然而,我的问题是 JavaScript 类别,它也是面向对象的。我了解对象,属性,方法,原型和构造函数,我似乎无法在使用对象时进入脑海。

当我编写我的网络应用程序时,由于某种原因,我从不使用对象。这让我很烦,因为当我读到各种书籍和在线文章中的对象时,对象会使一切变得如此简单,只是为了把它放在那里,我讨厌重复自己,这就是为什么我希望我知道何时使用物品。

我真的想要更好地使用对象以及何时使用对象。

你能不能提一下几个对象会不错的情况?如果您对使用这些darn对象感到困惑,那么写下你知道可以回去查看的东西真是太好了。)

我希望简单的答案解释为什么以及何时更喜欢物品 我还想告诉我,如果我在某些通常适合对象的特殊情况下使用对象,即每次你想要_________然后你使用一个对象...


我真的希望你理解我的问题,你会认为我对这个网站有些新手并且是JavaScript新手

谢谢!

12 个答案:

答案 0 :(得分:10)

你可能在没有意识到的情况下使用对象。

如果您正在编写与DOM交互的Javascript,那么您正在使用对象。

如果您正在使用任何Javascript框架(jQuery,MooTools等),那么您正在使用对象。

当您需要封装一些常用代码时,使用对象将非常有用,以便可以轻松地重复使用(在单个应用程序内或跨多个应用程序,如jQuery插件......它们本身就是对象)。

要回答帖子标题中的问题......在OOP上真正变得更好的唯一方法就是练习!阅读和研究这个主题只能让你到目前为止。

答案 1 :(得分:9)

首先,您不需要使用对象来避免重复自己。如果你需要在代码中的两个点做同样的事情,你可以编写一个普通的非OOP函数来做这个并调用它两次。

为了总结OOP的优点而不在这里写书,OOP基本上为你做了三件事:

  1. 将相关数据组合在一起。非OOP程序通常在主程序中浮动一大堆变量,这些变量只是松散相关。使用OOP,可以将相关变量放入对象中。

  2. 将功能与数据相关联。通过将函数放在一个带有它们操作数据的对象中(纯粹主义者会说它们是“成员”而不是“函数”),你就会清楚地告诉读者这些数据是一起的。

  3. 组合#1和#2可以隐藏其他对象的实现细节。您可以为类创建“公共接口”,其他对象应调用的函数集以及表示此类所执行的逻辑事物,然后可以隐藏所需的任何其他函数。 (在某些语言中比在其他语言中更明确,但这不是重点。)

    1. 类可以继承和变异。如果你有两个相似的类A和B应该大致相同,但有一些细微的差别,你可以创建一个包含所有常见内容的超类C,然后A和B从中继承,每个都添加自己独特的东西。这通常被宣传为OOP的力量。坦率地说,是的,它很酷,在某些情况下可以非常方便,但我偶尔只使用它的真正力量,我怀疑大多数程序员也是如此。 (OOP爱好者可以随时了解如何以及为何使用继承。)
    2. 什么时候开始OOP呢?每当你有几个逻辑上合并在一起的数据时,创建一个类来保存它们是有意义的。像X和Y坐标;或客户名称,地址和邮政编码;或相位器范围和相位器功耗;或者其他什么。

      只要您拥有对此相关数据进行逻辑操作的函数,请将它们放入包含数据的类中。比如“大写客户名称”,“计算这一点与原点的距离”等等。

      如何以及何时使用继承更复杂。我会再把它留下来了。

答案 2 :(得分:8)

首先要记住的是,很多简单的Javascript代码确实不需要定义对象(使用它们是不可避免的,因为DOM给你的所有东西都是对象)。不要太恐慌。

Javascript的一个好处是它支持许多不同的风格; OOP,命令性和功能性。

使用Javascript的一个坏处是,因为它支持很多不同的样式,所以很难学习另一种风格,至少在你被其他东西强迫进入“a-ha”时刻之前。

花费时间在更倾向于强迫你进入OOP的语言中(即使有些人认为他们不应该这样做)在这里是有用的。 C#和Java强制一个沿着OOP线,虽然C ++没有(这里有与Javascript相同的优点和缺点)。

尝试考虑程序中的“事物”。其中一些东西已经被对象建模(DOM给你的东西)。有些人真的只是数字和字符串而不值得超越(尽管学习如何通过原型向这些类型添加功能也是一个好主意)。有些将是“事物”比简单类型更复杂,并且自然适合作为对象建模。

还要看一下Javascript中的函数式编程(例如,将函数作为参数传递给另一个函数是最简单的例子),因为它和OOP之间的交互是Javascript中最强大的元素之一,并且在定义方法时必不可少在给定基于原型的OOP模型的对象上。

答案 3 :(得分:3)

我在JavaScript中使用OOP的个人经验是积极的,一旦我想出去做我想做的事情,我通常将它与jQuery结合使用,所以结果代码看起来有点......奇

function BlogPost(id,title,content)
{
    this.id = id;
    this.title = title;
    this.content = content;

    function display()
    {
        var post = $('<div class="blogpost"></div>');
        $(post).append('<h2>' + this.title + '</h2>');
        $(post).append('<p>' + this.content + '</p>');
        var deleteButton = $('<span class="deletePost">delete</span>')
        $(post).append(deleteButton);
        $(deleteButton).click(this.delete)

        $('#postcontainer').append(post);
    }


    function delete()
    {
        $.post('some/xhr/handeler',{id:this.id});
    }
}

这是一个快速(未经测试)的类,可用于动态地将博客帖子添加到具有id postcontainer'的div中,并处理对删除按钮的点击。

答案 4 :(得分:3)

考虑如何使用对象来组织和简化应用程序。我找到了两个有用的比喻:

  • 机械表由多个齿轮组成,每个齿轮在机器的整体操作中起到单一作用。如果您将应用程序视为手表,那么对象就是它的齿轮。

  • 工作组由许多人组成,每个人都执行特定的工作。人们在完成工作时相互沟通,工作分为两类 - 执行任务的人(工人),以及组织和指导其他人(管理人员)工作的工作。

您可以使用这些隐喻来组织应用程序所做的工作。首先将应用程序划分为功能层;例如,UI,业务层和持久性。获取每个用例,并在这些层中分配它所做的工作。这应该为您提供所需课程的起点。

让每个班级都成为一个独立的班级。你希望在完成后将其封锁,就像.NET控件一样。类只能通过它们的接口相互通信,接口由属性和方法组成。这些界面应该具有最小的占用空间(最少的公共属性和方法)。我们的想法是将任何类别的变化的副作用单独隔离到该类。

如果你做这些事情,你将领先80%的程序员。您会发现开发和维护大型应用程序要容易得多,因为您可以将复杂的问题分解为简单的组件。

答案 5 :(得分:2)

Javascript只是学习OOP的一种可怕语言。我建议学习另一种语言(如Java或C ++)的OOP,然后在Javascript中学习面向对象的语法。在那一刻,你拥有所有的成分。

那时您可以决定是否要在Javascript中使用对象作为任务,或者仅仅使用函数就足够了。

就个人而言,我主要编写非对象javascript,并在任务感觉面向对象时保留对象。例如,我使用面向对象设计的拖放脚本,在其中您只需使用正确的参数创建一个DragNDrop对象,并且页面中的项目可以从那一刻开始拖动,或者当我想简化一些javascript时在xml处理函数中,我编写了一个包装普通xml对象的对象。

答案 6 :(得分:1)

Justin Niessner说我和他只能补充他的答案......

除了练习,我发现阅读其他人的代码非常有启发性。你需要保持谨慎,因为并非所有代码都是典型的(至少可以说),但开发关键技能是改善的一部分。

答案 7 :(得分:1)

在我看来,我认为在特定领域或业务问题的背景下考虑OOP会更好。例如,JavaScript使用对象来模拟浏览器行为和属性,例如,窗口,框架,历史......

业务问题的domain model将包含将在编写的OOP编程代码中反映的对象。例如,大学生申请将有学生,教授,课程,课程,房间等对象。因此,从您的业务问题开始并为域建模。您的OOP代码应该具有从您的域建模的对象。 alt text

来源:http://csci.csusb.edu/dick/samples/uml0.html

答案 8 :(得分:1)

我认为使用一般的类和OOP原则会使您的代码更整洁,更具可读性并使您的工作效率更高。

答案 9 :(得分:1)

您可能对设计模式(BookWikipedia)感兴趣,它告诉您如何使用OOP解决常见问题。 许多经典设计模式可能与JavaScript不太相关,因为在JavaScript中还有其他非OOP元素(例如函数),这可以解决一些更优雅的问题。

我可以推荐一些简单的设计模式:

  • 抽象工厂:推迟对象的实例化。在大多数情况下,在JavaScript中,函数可以完成这项工作。
  • 装饰器:在运行时透明地向对象添加功能。也可以嵌套。用法示例:记录
  • 复合:将对象的树/图形视为单个对象。

答案 10 :(得分:1)

最近我在一个需要大量客户端Javascript的Web应用程序上工作。

来自C#/ Java背景我意识到Javascript需要改变思路,但是我仍然希望在可能的情况下应用良好的OO原则,特别是控制应用程序的可能复杂性。

经过一番搜索,我找到了一本名叫Object Oriented Javascript的好书,由Stoyan Stefanov撰写。它真正让我看到了这种通常被称为“玩具语言”的力量。关于函数式编程概念,变量作用域和闭包的一些部分甚至可能比您想要的更高级。

然而,在Javascript中阅读和应用本书中的许多概念(闭包,匿名函数等),实际上甚至帮助我回到C#领域,这些概念现在变得更加主流。

鉴于您所陈述的情况和目标,我强烈推荐这本书作为了解在Javascript中执行OO的最佳方法之一。

答案 11 :(得分:-1)

Javascript比C#或Java更不像面向对象;如果您的Javascript看起来不像面向对象,请不要担心。