【问题标题】:How can I get better at OOP? [closed]我怎样才能在 OOP 上做得更好? [关闭]
【发布时间】:2011-04-02 15:12:33
【问题描述】:

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

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

我真的想在使用对象以及何时使用对象方面变得更好。

您能否提及一些情况下对象会很好?当你对何时使用这些该死的对象感到困惑时,写下一些你知道你可以回去看看的东西真是太好了:)

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


我真的希望你能理解我的问题,并且你会认为我对这个网站和 JavaScript 有点陌生

谢谢!

【问题讨论】:

  • +1 知道 OOP 远远超出了 C++/Java/C# 的范畴
  • 有趣的问题,只有一点批评:JavaScript是一种编程语言,它只是(大部分时间)在运行时解释,而不是编译然后运行。
  • 请注意:Javascript 不是一种完全面向对象的语言,它是一种基于原型的语言,看起来很像 OO,但实际上却大不相同。见en.wikipedia.org/wiki/Prototype-based
  • @Jasper:点击“编辑 [x] 分钟前”查看它“从未声明过”的内容。
  • @dbemerlin,基于原型的 OO 的倡导者认为基于类的 OO 不是完全面向对象的,因为您无法更改单个对象的行为。就我个人而言,我认为两者都对“完整”的 OO 提出了同样的要求。

标签: javascript oop


【解决方案1】:

您可能在不知不觉中使用了对象。

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

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

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

要回答您帖子标题中的问题...真正提高 OOP 水平的唯一方法就是练习!阅读和研究该主题只能让你走这么远。

【讨论】:

  • @Marcel - 很好的收获。显然我今天早上在自动驾驶仪上。固定。
  • 使用 对象与实际实现面向对象的代码完全不同。任何程序员都可以在其上创建、对象和调用方法,编写体面的 OO 代码要困难得多。
【解决方案2】:

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

Javascript 的优点之一是它支持许多不同的样式; OOP,命令式和函数式。

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

花时间学习更倾向于迫使您进入 OOP 的语言(即使有些人认为他们不应该这样做)在这里很有帮助。 C# 和 Java 强制遵循 OOP 路线,但 C++ 没有(这里的优势和劣势与 Javascript 相同)。

尝试思考程序中的“事物”。其中一些东西已经由对象(DOM 提供给您的对象)建模。有些真的只是数字和字符串,除此之外不值得编写(尽管学习如何通过原型向这些类型添加功能也是一个好主意)。有些会是比简单类型更复杂的“事物”,自然适合建模为对象。

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

【讨论】:

  • 虽然 C++ 可能不会强迫您使用 OOP,但它并没有与 javascript 完全相同的缺点。这里的关键是,在 C++ 中,“正确”(并且推荐)的方式是 OOP,而在 javascript 中它只是另一种风格,语法笨拙。区别相似但不一样。
  • @Jasper,是的,虽然在学习方面,这取决于你的学习方式。如果你通过学习 C 来学习 C++,然后学习 C++ 可以让你添加其他东西,那么最终用 C++ 编写 C 是很容易的。相反,如果你很早就通过学习对象来学习 Javascript,那么用 OOP 术语来思考它会更容易(也许太容易了,有时你可以采用命令式方法很好)。
  • @Jon Hanna: 没错,学习 C++ 的方法是错误的,如果你先学习(ed)C,这是学习 C++ 的合乎逻辑的方法。但是,有许多书籍或网站示例可让您学习正确的 C++。同时,学习javascript没有“错误”和“正确”的方式。虽然我在很大程度上同意你的观点,但我不会不推荐 C++ 作为学习 OOP 的语言,因为它具有其他功能(而我只是为 javascript 做到了)。尽管如此,可能还有其他原因不开始使用 C++...
  • @Jasper,我当然不会不推荐 C++ 作为学习 OOP 的语言。任何从头开始使用该语言的好的指南都会很好地教别人,但是任何关于 JS 的好书也会如此(尽管它可能更多地关注函数式)。我要说的缺点纯粹是你可以用什么不好的方式来使用它。通常,使用语言的坏方法比好的方法更能体现它们之间的差异!
  • @Jon Hanna:那我的错...在 JavaScript 中的 OOP 中 - 而在 C++ 中,您想在 OOP 中做所有事情,偶尔会有例外。
【解决方案3】:

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

这时您可以决定是否要将对象用于 Javascript 中的任务,或者仅使用函数就足够了。

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

【讨论】:

  • @Marcel Korpel:我并没有说 javascript 很糟糕——它实际上是一种非常好的语言。我确实说过(在本页的其他地方)javascript 的 OO 语法很笨拙。我只是说这是一个开始学习 OOP 的糟糕地方。
  • 我不同意这一点,但我已经对你的回答发表了评论,解释了为什么我不同意,所以我不会再在这里做同样的事情了。
【解决方案4】:

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

【讨论】:

  • 只是好奇,这个想法是从哪里来的?
  • 面向对象是概念性的,并且与设计密切相关。任何支持某种对象模型的编程语言都可以实现良好设计的某些无可辩驳的特征。哎呀,甚至可以使用 VB6 展示良好的 OOP 和设计(尽管需要一点创造力)
  • 您可以用 Javascript 编写纯粹的命令式、非 OOP 脚本。你不能在 Java 中做到这一点。它根本行不通,因为一切都在一个类中。我会在这个问题上坚持我的观点,否决票或否决票。 Javascript 通常不会看起来很像 Java,这是一件好事。
  • @SideFX;我同意,但这并不意味着您应该强制所有 VB6 代码进入 OOP,对吗?
  • @indieinvader;如果您能提出更具体的问题,很高兴给出具体的答复;将我的第一个回复视为评论,让我知道这是否涵盖它?
【解决方案5】:

我在 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 并处理删除按钮上的点击。

【讨论】:

    【解决方案6】:

    首先,您不需要使用对象来避免重复自己。如果您需要在代码中的两个点执行相同的操作,您可以编写一个普通的非 OOP 函数来执行此操作并调用它两次。

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

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

    2. 将函数与数据关联。通过将函数与它们所操作的数据放在一个对象中(纯粹主义者会说它们是“成员”而不是“函数”),你可以让读者清楚地知道它们是一起的。

    结合#1 和#2 可以让您对其他对象隐藏实现细节。您为一个类创建“公共接口”,其他对象应该调用的一组函数,这些函数代表这个类所做的逻辑事情,然后可以隐藏您需要的任何其他函数。 (在某些语言中比在其他语言中更明确,但这不是重点。)

    1. 类可以继承和变异。如果你有两个相似的类 A 和 B,它们应该基本相同,但有一些细微的差别,你可以用所有常见的东西创建一个超类 C,然后 A 和 B 从中继承,并添加自己独特的东西。这就是通常宣传为 OOP 的力量的东西。坦率地说,是的,它很酷,在某些情况下非常方便,但我只是偶尔使用它的真正力量,我怀疑大多数程序员也是如此。 (OOP 爱好者可以随时了解您一直使用继承的方式和原因。)

    什么时候OOP呢?任何时候你有几条逻辑上组合在一起的数据,创建一个类来保存它们是有意义的。像 X 和 Y 坐标;或客户姓名、地址和邮政编码;或移相器范围和移相器功耗;或其他。

    任何时候你有对这些相关数据进行逻辑操作的函数,把它们放在有数据的类中。比如“客户名大写”、“计算该点到原点的距离”等

    如何以及何时使用继承更为复杂。我将把它留到另一次。

    【讨论】:

    • 这是迄今为止最好的答案。它实际上回答了这个问题。
    【解决方案7】:

    想想如何使用对象来组织和简化您的应用程序。我发现两个有用的比喻:

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

    • 一个工作组由许多人组成,每个人都执行一项特定的工作。人们在执行工作时相互沟通,而工作分为两条线——执行任务的(工人)和组织和指导他人工作的(经理)。

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

    让每个类都尽可能地自包含。您想在完成后将其密封,就像 .NET 控件一样。类只能通过它们的接口相互通信,接口由属性和方法组成。这些接口应该具有您能想到的最小占用空间(最少的公共属性和方法)。这个想法是将任何类更改的副作用隔离到该类。

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

    【讨论】:

      【解决方案8】:

      贾斯汀·尼斯纳(Justin Niessner)说过,我只能补充他的答案...

      除了练习之外,我发现阅读其他人的代码很有启发性。您需要谨慎,因为并非所有代码都堪称典范(至少可以这么说),但培养关键技能是变得更好的一部分。

      【讨论】:

        【解决方案9】:

        在我看来,我认为在特定领域或业务问题的背景下考虑 OOP 会更好。例如,JavaScript 使用对象来对浏览器行为和属性进行建模,例如 Window、Frame、History...

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

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

        【讨论】:

          【解决方案10】:

          我认为使用通用类和 OOP 原则可以使您的代码更整洁、更具可读性并提高工作效率。

          【讨论】:

            【解决方案11】:

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

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

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

            【讨论】:

            • 你提到的GOF书不错,但内容很重。一个更简单(虽然看起来有点傻)的介绍是Head First Design Patterns。
            【解决方案12】:

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

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

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

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

            鉴于您陈述的情况和目标,我强烈推荐这本书作为学习用 Javascript 进行 OO 的最佳方法之一。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-03-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多