OOP对小脚本有意义吗?

时间:2010-06-14 18:38:04

标签: python oop scripting

我主要在python中编写小脚本,大约有50到250行代码。我通常不使用任何对象,只是简单的程序编程。

我知道OOP的基础知识,之前我曾在其他编程语言中使用过对象,但对于小脚本,我看不到对象如何改进它们。但也许这只是我对OOP的有限经验。

我是否因为没有更努力地使用对象而遗漏了某些东西,或者OOP对小脚本没有多大意义?

17 个答案:

答案 0 :(得分:32)

我使用最适合手头问题的范例 - 无论是程序性的,OOP,功能性的......程序大小不是一个标准,但是(稍微有点边缘)更大的程序可能更有可能利用OOP的优势 - 类的多个实例,子类化和重写,特殊方法重载,OOP设计模式等。任何这些机会都可以很好地发生在一个小脚本中,它在一个小脚本中出现的可能性稍高。更大的。

另外,我讨厌global语句,所以如果自然程序方法需要它,我将几乎总是转而使用OOP - 即使唯一的优点是能够使用合格的名称代替需要global的姓名。

一般来说,没有必要“更加努力” - 只要问自己“这里有机会使用(a)多个实例(等等)”它很快会成为第二天性,即你会发现机会而不需要每次都有意识地提醒自己寻找它们,结果你的编程也会有所改进。

答案 1 :(得分:27)

面向对象编程,虽然对于将系统表示为真实世界的对象(并希望使大型软件系统更容易理解)非常有用,但并不是每个解决方案的灵丹妙药(尽管有些人教过)。

如果你的系统没有从OOP提供的东西中受益(诸如数据抽象,封装,模块化,多态和继承之类的东西),那么产生OOP的所有开销就没有意义了。但是,如果您发现随着系统的发展,这些事情成为您的一个更大的问题,那么您可能需要考虑转向OOP解决方案。

修改:作为更新,您可能希望转到维基百科阅读各种criticisms of OOP上的文章。请记住,OOP是一种工具,就像你不会使用锤子一样,OOP不应该用于所有事情。考虑一下这项工作的最佳工具。

答案 2 :(得分:8)

用oop开发的一个不幸的习惯是Objectophrenia--在我们编写的每一段代码中看到对象的错觉。

之所以发生这种情况,是因为我们错误地认为存在统一的对象定理。

您编写的每一段代码,您都开始将其视为对象的模板以及它们如何适合我们的个人计划。即使这可能是一项小任务,我们也会受到这个问题的诱惑 - 这是我可以放入我的类库中的,我也可以将其用于未来吗?我是否在这里看到了一个模式,其中包含我之前编写的代码以及我的对象千里眼告诉我的代码,我有一天会写这个代码?我可以将当​​前任务构建为其中一种模式。

这是一个烦人的习惯。通常情况下,最好不要拥有它。但是当你发现你编写的每一段代码都以某种方式落入模式并重构/重新调整这些模式直到它满足你的大部分需求时,你往往会感到满足和成就。

当程序员出现妄想(强迫性的强迫性面向对象障碍)并且没有意识到模式存在例外并且试图过度操纵模式以覆盖更多案例时,问题就开始出现是错误的。这就像我童年的痴迷一样,每天早上我都吃早餐,试图用黄油或果酱完全覆盖一块面包。有时候,将面向对象的感知留在后面并且只是快速而肮脏地执行手头的任务会更好。

80-20的公认行业格言可能是一个很好的衡量标准。以不同于通常感知的方式使用这种格言,我们可以说80%的时间具有面向对象的感知。 20%的时间 - 编码快速而肮脏。

沉浸在物体中,但最终你必须抵制它消耗你。

你可能还没有完成足够的编程,因为如果你有,你会看到你所做的所有模式,你也会开始相信你尚未应用的模式。当你开始看到这样的物体视觉障碍时,是时候注意不要被它们消耗了。

答案 3 :(得分:8)

如果您打算独立使用脚本,那么不。但是,如果您打算import并重新使用其中一些,那么是的。在第二种情况下,最好编写一些提供所需功能的类,然后进行条件运行(if __name__=='__main__':),并使用代码执行脚本的“脚本”版本。

答案 4 :(得分:5)

我的经验是,任何超过几十行的纯粹程序脚本都难以维护。首先,如果我在一个地方设置或修改变量并在另一个地方使用它,并且这两个地方无法放在一个屏幕上,那么就会出现问题。

当然,答案是收紧范围并使应用程序的不同部分更加封装。 OOP是实现这一目标的一种方式,可以是一种模拟环境的有用方法。我喜欢OOP,因为我发现我可以在思考特定对象的内部如何工作时思考,思考对象如何协同工作,并保持理智。

但是,OOP肯定不是使代码更好地封装的唯一方法;另一种方法是使用精心定义的输入和输出的一组小的,名称很好的函数,以及一个适当调用这些函数的主脚本。

答案 5 :(得分:4)

  

我是否因为没有更努力地使用对象而遗漏了某些东西,或者OOP对小脚本没有多大意义?

对象为您带来封装重用(通过继承)。在编写小脚本时,两者都不可能非常有用。如果您编写了类似脚本的集合,或者发现自己反复更改脚本,那么也许您应该考虑对象可能有用的位置。

答案 6 :(得分:4)

使用正确的工具来完成正确的工作。对于不需要复杂数据结构和算法的小脚本,可能没有用于面向对象的概念。

答案 7 :(得分:4)

OOP是一种管理代码复杂性的工具,50-250行代码很少复杂。我写的大多数脚本主要是程序性的。所以是的,对于小脚本,只需要进行程序编程。

请注意,对于非常复杂的脚本,OOP可能更相关,但仍然没有硬性和快速的规则说使用OOP。这是个人偏好的问题。

答案 8 :(得分:2)

OOP只是另一种范式。使用程序或OOP可以解决许多问题。

当我在编写的代码中看到明确需要继承时,我使用OOP,它更容易管理常见行为和常见属性。

有时它易于理解和管理。即使代码很小。

答案 9 :(得分:2)

OOP的另一个好处是传达意图(无论是对于其他开发人员,经理人还是将来某些人)。如果脚本足够小,可以在几个句子中完全传达,那么在我看来,OOP可能没有必要。

答案 10 :(得分:2)

使用OOP几百行代码很少有意义。但是,如果您的脚本很有用,它可能会相当快速地增长,因为将添加新功能。如果是这种情况,最好从长远来看开始编码OOP方式。

答案 11 :(得分:2)

在你的情况下,我会说OOP只有在使脚本更具可读性和可理解性时才会有用。如果没有,你可能不需要打扰。

答案 12 :(得分:1)

首先 - 对象是什么意思?在Python中,函数是对象,您最有可能使用它们。 :)

如果对象是你的意思是类和实例,那么我会说一些明显的东西:不,没有理由说使用它们会使你的代码本身变得更好。 在小型脚本中,复杂的OO设计不会产生任何影响。

答案 13 :(得分:1)

如果在模块化编程之上添加多态性,OOP就是你得到的 后者都促进低耦合,封装,责任分离和一些其他概念,这些概念通常产生代码,简短,富有表现力,可维护,灵活,可扩展,可重用和健壮。

这不是一个关于大小的问题,而是关于软件生命周期的长度问题。如果您编写任何代码,尽可能短,只要它足够复杂,您不想重写它,当您的需求发生变化时,重要的是它符合上述标准。

OOP使模块化编程更容易,因为它已经建立了实现模块化编程所促进概念的解决方案,并且多态性允许通过依赖注入实现真正的低耦合。

我个人觉得使用OOP实现模块化(特别是可重用性)更简单,但我猜,这是一个习惯问题。

用一句话说。 OOP不会比程序编程更好地帮助您解决给定问题,而是提供一个解决方案,更容易应用于其他问题。

答案 14 :(得分:1)

这实际上取决于剧本是什么以及你如何看待这个世界。

在脚本使其超过20-30行代码之后,我个人通常会找到一种OOP对我更有意义的方式(特别是在Python中)。

例如,假设我正在编写一个解析日志文件的脚本。好吧,从概念上讲,我可以想象这个“日志解析器”机器......我可以将所有这些纸张扔进去,它会对它们进行排序,从一些页面中切出部分并将它们粘贴到另一个页面上,最后给我一个很好的报告。

那么我开始思考,好吧,这个解析器做了什么?好吧,首先他是(是的,解析器是他。我不知道有多少我的程序是女性,但这个人肯定是一个人)要读取页面,所以我需要一个名为页面的方法读者。然后,他将找到所有涉及我们正在使用的新Frobnitz过程的数据。然后他将把关于Frobnitz过程的所有参考文献移到复活节兔子图的旁边。哦,现在我需要一个findeasterbunny方法。在他完成之后,他将采取剩余的日志,删除每个第3个单词,并颠倒文本的顺序。所以我也需要thirdwordremovertextreversal方法。所以一个空shell类看起来像这样:

class LogParser(Object):
    def __init__(self):
         #do self stuff here
    def pageReader(self):
         #do the reading stuff here, probably call some of the other functions
    def findFrobnitz(self):
         pass
    def findEasterBunny(self):
         pass
    def thirdWordRemover(self):
         pass
    def textReversal(self):
         pass

这是一个非常人为的例子,老实说可能不是我使用OOP的情况......但它实际上只取决于我在那个特定时刻理解的最简单的事情。

答案 15 :(得分:0)

“脚本”表示“顺序”和“程序”。这是一个定义。

脚本处理的所有对象都是 - 井 - 对象。所有编程都涉及对象。对象已经存在于您编写脚本的上下文中。

某些语言允许您清楚地识别对象。某些语言无法清楚地识别对象。对象始终。这是一个关于语言是否清晰或模糊的问题。

由于对象总是,我发现使用一种允许清楚识别对象,属性,方法和关系的语言会有所帮助。即使对于简短的“脚本”,我发现显式对象和OO语言也有帮助。

重点是这一点。

“程序”,“脚本”和“OO”之间没有任何有用的区别。

这只是重点的转变。对象始终。世界本质上是面向对象的。真正的问题是“你是否使用一种使对象明确的语言?”

答案 16 :(得分:0)

作为执行大量脚本的人,如果您认为您的代码可能会在某些时候超过250行开始进行操作。我使用了很多vba和vbscript,我同意100线以下的任何东西通常都非常简单,花时间计划一个好的oop设计只是浪费。

话虽如此,我有一个脚本来到大约500行+并回头看它,因为我没有这样做,它很快就变成了一堆不整洁的意大利面。所以现在超过200行,我确保我提前有一个好的oop计划

相关问题