为Perl开发人员编写最佳实践教程

时间:2011-12-01 02:02:13

标签: perl

我一直在为从事Java工作的参与者提供有关编程实践和编写质量代码的培训。面向对象的分析和设计是我的基础,我涵盖了S.O.L.I.D.清洁代码,代码完成2等书籍的原则和摘录。

我计划在两天内向Perl程序员(在Perl中使用不到1年的exp)提供培训,他们不使用Moose(Perl 5对象系统的扩展,带来了现代的面向对象语言的功能)。

我现在很困惑如何构建我的训练,因为他们不遵循OOP。

有什么建议吗?

此致 Shardul。

5 个答案:

答案 0 :(得分:12)

即使没有Moose,Perl中的面向对象编程也是非常有可能的,而且很常见。许多CPAN模块通过面向对象的API提供其功能,即使其中许多提供非面向对象的API。 (这种二元性的一个很好的例子是IO::Compress::Zip。)显然,Perl中面向对象设计的规范与某些语言中的规范略有不同 - 例如,封装不是由语言强制执行 - 而是整体原则和做法是一样的。

即使没有任何形式的面向对象编程,Moosish或其他,在布局包,将代码组织到函数/子例程/模块,构造数据,利用use warnings方面还有很多可以讨论的内容。 (或-w)和use strict以及-T和CPAN模块,依此类推。

我还推荐Mark Jason Dominus的书Higher-Order Perl,他可以免费下载。我不知道你能在多大程度上在一天之内完成整本书的比赛,并在你的演讲中及时整理一些有用的东西 - 函数式编程对于那些不习惯它的人来说是一种范式转换(不管你吧,或者你正在展示的程序员!) - 但是你可以在那里找到一些有用的东西。

答案 1 :(得分:5)

这里的很多答案都是关于向没有使用它的Perl程序员教授OOP的答案,但是你的问题听起来像是因为你如何教授关于代码质量的课程而受到阻碍事实上你的Perl程序员不使用OOP,而不是你想要向非OO程序员教授OOP并强迫他们进入这种范式。

这让我们得到了Perl支持的另外两种编程范例:

  1. Good ol'塑造了Structured Programming Modular Programming
  2. Functional programming support in Perl(也Higher-Order Perl
  3. 我同时使用这两种方法 - 结合健康剂量的对象。因此,我使用对象的原因与我使用良好的结构,模块和功能管道的原因相同。使用为编程过程带来顺序和理智的工具。例如,面向对象编程是多态的主要形式 - 但OOP本身不是不是多态。因此,如果你正在编写有助于多态性的习语,它们有助于多态性,那么它们就不会被困在一些特殊的库中。#34; class"并调用像UtilClass->meta_operator( $object )这样的 little 多态性。

    Moose伟大的对象语言,但您不能调用Moose->has( attribute => is => 'rw', isa => 'object' )。您调用运算符 hasMoose power 位于一个对象库中,它将类操作封装在类上 - 但在简单的表达式操作符中也是如此开放的语法Perl允许。我想称解决OOP解决问题的对象。

    另外,我想我的问题有问题,因为"不是OOP"是一个很大的领域。它可以从主线编码到非严格 -OOP(编程的过程不仅仅是OOP分析)。因此,我认为您必须了解您的受众,并了解他们使用什么来保持代码的结构和理智。我无法想象现代 Perl受众至少不是对象 - 用户

    从那里,Perl Best Practices(通常缩写为PBP)可以帮助您。但是那样学习

    • 仅仅因为OOP是多态性的最佳支持之一,本身并不是 多态性
    • 仅仅因为OOP是封装的最佳支持之一,它本身并不是 封装。
    • OOP已经得到了结构化和模块化编程的帮助 - 而且本身并不是那些东西。它的一些功能只是只是那些学科。

    此外,与我的对象作者和消费者一样大,OOP不像我想的那样 可重用性是我的想法:在我不想再写之前我做了什么?我写的是什么类似的?如何使我当前的任务只是以前编写的适配器。 (而且经常:我如何偷偷摸摸我的行为将一个已建立的模块分成一行?)

    因此,我的一些构造将失败 OOP的行人目标。为了给你一个更好的观点:我将代码划分为两个"域":高度抽象和多态代码,以及我需要做的脚本获取我当前项目中所需的特定功能。 (这基本上是什么"应用程序"意思是,但我认为它不会那么清楚)。因此,多态性主要有助于提供适应性,但是适应本身就是采用最少代码行的任何东西。我的最佳系统是一个库,它允许在库行为和解决特定问题的一组配置或脚本之间的任何关键时刻编写/调整脚本。同样,如果我有我的druthers,配置将从脚本域注入,没有库代码会说"我需要一个属性文件"除非它是一个库模块,它封装了属性文件中实例化的配置算法。它只会知道它需要"政策" (或来自应用领域的决定)以实现其功能。

    因此,我的理想应用程序包含特殊目的"对象",符合"角色"但 classes 的开销是无用的 - 除了类执行允许注入数据和行为的行为。所以我的一些Perl"对象"违反OOP分析,因为它们只是一次性解决方案的封装,有点像push-pin(expando)JavaScript对象。

    我经常(稍后)修改一个特殊用途的对象并将其进一步推回到库域中,因为我发现我需要再次写这样的东西。库域中的所有对象仅处于指定行为的某个级别。另外,我安排了数据网络"其中有一个Sourced类型的类,它只是封装了在对象本身或另一个源对象中访问数据的行为。这有助于加速我的解决方案非常,但我从未在任何鸭 - 猫 - 车 - 卡车OOP底漆中看到它。此外模板 - 特别是与数据网络结合使用时 - 在十几行或半天工作中编码解决方案非常有用。

    所以我想我说,在某种程度上只知道OOP进行结构化编程,你就无法了解一些旧的,合理的做法或其他范例为你做的 - 或者有资格作为OOP的事物如何能够促进平庸的适应性。 (除了组件远远超过"对象&#34 ;.)封装解决了许多问题,但它也促进了您需要的数据缺乏。我们的想法是在您需要的地方获取数据,以便您的固定行为能够实现问题的具体细节并对其进行操作。

    • 重读结构化编程的一些内容
    • 阅读有关函数式编程的一些内容(假设您还不熟悉它。)

    即使是成熟的,有生产力的,也是可能的。 Perl团队正在写...... 废话。如果他们不是OOP程序员,因为他们只是编写垃圾代码,那么无论如何都要教他们OOP,如果他们甚至缺乏结构化编程 *将他们两个都推到他们的喉咙*(我很难过考虑标签" professional",here)。

答案 2 :(得分:4)

好好看看Damian Conway的'Perl Best Practices'。它里面有很多坚实的材料,你的建议也不会出错。

请注意,Getopt::Clade仅作为占位符包提供 - 换句话说,它是vapourware。

答案 3 :(得分:4)

你可能也想看看“现代Perl”一书中的内容:

http://onyxneon.com/books/modern_perl/

正如其他人所说的那样 - 没有驼鹿就可以覆盖。

  • 设置模块/发行版
  • 测试和TAP
  • 使用cpanm / cpan / local :: lib
  • 进行部署
  • 重要变化5.8 5.10 vs 5.12 vs 5.14,autodie等。

答案 4 :(得分:0)

Perl程序员必须了解Perl的弱功能特性,例如列表上下文,map,grep等。一点功能样式使Perl更具可读性。

Perl程序员还必须了解Perl的传统OO功能,尤其是模块,祝福和领带。让他们编写一个对象,或者将一个Cache :: Memcached对象与查询或其他东西绑在一起。

相关问题