Perl 设计问题

Perl 设计问题,perl,orm,data-access-layer,Perl,Orm,Data Access Layer,最近我一直在做一些Perl项目,我是一个非常新手的Perl程序员。我一直在试验DBIx::Class,到目前为止,我非常满意它的灵活性和易用性。不过我很好奇。我来自.NET背景,似乎我们在一定程度上花了很多时间抽象我们的DAL。对于Perl这样的语言,这是一个好主意吗 我希望很快能够开始模拟我的DAL,这样我就可以为任务编写单元测试。现在,我正在努力研究应用程序的整体结构和设计应该是什么样子 很久以前,我曾在web的perl项目中工作。但在使用Django等工具之后,perl的工具(如DBI等)

最近我一直在做一些Perl项目,我是一个非常新手的Perl程序员。我一直在试验DBIx::Class,到目前为止,我非常满意它的灵活性和易用性。不过我很好奇。我来自.NET背景,似乎我们在一定程度上花了很多时间抽象我们的DAL。对于Perl这样的语言,这是一个好主意吗


我希望很快能够开始模拟我的DAL,这样我就可以为任务编写单元测试。现在,我正在努力研究应用程序的整体结构和设计应该是什么样子

很久以前,我曾在web的perl项目中工作。但在使用Django等工具之后,perl的工具(如DBI等)在我看来已经相当初级和过时了。例如,看看django ORM,它非常优雅,使用起来非常高效,如果查询太复杂或者ORM妨碍了您,您可以绕过它

这些天,我会选择python或ruby来完成这类项目。
对于一行程序、小文本解析或系统管理之类的东西,我仍然喜欢使用小的perl代码段。但是这些天来,我比TMTOWTDI更热衷于编写几行以上的代码。

很久以前,我就曾在web的perl项目中工作过。但在使用Django等工具之后,perl的工具(如DBI等)在我看来已经相当初级和过时了。例如,看看django ORM,它非常优雅,使用起来非常高效,如果查询太复杂或者ORM妨碍了您,您可以绕过它

这些天,我会选择python或ruby来完成这类项目。
对于一行程序、小文本解析或系统管理之类的东西,我仍然喜欢使用小的perl代码段。但是这些天来,我比TMTOWTDI更喜欢DRY,因为它的代码超过了几行。

Re:ORM在应用程序中的关系

希望这就是你想要的答案

对于脚本世界中的大多数web应用程序框架,即perl、ruby、python、php,我大部分时间都看到了在ORM对象级别实现的业务逻辑。例如,在Rails应用程序中,它处于ActiveRecord级别;如果您使用的是DBix::Class,那么它将处于结果类级别

更具体地说,在DBIx::Class的情况下,如果您有一个名为VENDOR的表,那么将有一个名为MySchema::Result::VENDOR的类,它表示表VENDOR中的一行。只需将您的业务方法添加到此类中

这种方法的一个缺点是它将您的业务逻辑与ORM类联系在一起,这会使单元测试更加困难。解决这个问题的一个方法是使用一个轻量级数据库进行单元测试,即SQLite,类似ORM的DBIx::Class将有助于在两者之间进行切换。当然,如果您依赖于SQLite中没有实现的SQL特性,这是行不通的

另一种方法是将业务逻辑方法置于Moose角色中。然后,可以将这些方法组合到DBIx::Class结果类或模拟对象中进行测试。如果你愿意,我可以举例说明

上面的一个大假设是您的业务对象=数据库中的一行。如果情况并非如此,即您的业务对象跨越多个表,那么您可能需要创建一个shell或容器对象,其中包含每个组成ORM对象的实例成员。幸运的是,Moose有一个很好的工具用于委托方法搜索Moose委托和实例成员声明的handles属性,因此从两个或多个ORM对象中创建复合业务对象相对容易。同样,如果你愿意,我可以给你举个例子


HTH

Re:应用程序中ORM的关系

希望这就是你想要的答案

对于脚本世界中的大多数web应用程序框架,即perl、ruby、python、php,我大部分时间都看到了在ORM对象级别实现的业务逻辑。例如,在Rails应用程序中,它处于ActiveRecord级别;如果您使用的是DBix::Class,那么它将处于结果类级别

更具体地说,在DBIx::Class的情况下,如果您有一个名为VENDOR的表,那么将有一个名为MySchema::Result::VENDOR的类,它表示表VENDOR中的一行。只需将您的业务方法添加到此类中

这种方法的一个缺点是它将您的业务逻辑与ORM类联系在一起,这会使单元测试更加困难。解决这个问题的一个方法是使用一个轻量级数据库进行单元测试,即SQLite,类似ORM的DBIx::Class将有助于在两者之间进行切换。当然,如果您依赖于SQLite中没有实现的SQL特性,这是行不通的

另一种方法是将业务逻辑方法置于Moose角色中。然后,可以将这些方法组合到DBIx::Class结果类或模拟对象中进行测试。如果你愿意,我可以举例说明 上面的一个大假设是您的业务对象=数据库中的一行。如果情况并非如此,即您的业务对象跨越多个表,那么您可能需要创建一个shell或容器对象,其中包含每个组成ORM对象的实例成员。幸运的是,Moose有一个很好的工具用于委托方法搜索Moose委托和实例成员声明的handles属性,因此从两个或多个ORM对象中创建复合业务对象相对容易。同样,如果你愿意,我可以给你举个例子


HTH

你知道,这是我一直在想的事情。perl死了吗?看起来仍然有一个很大的社区,但是像python和ruby这样的语言似乎已经失去了一些流行性。Perl还远没有死,它正在现代Perl标签下经历一次奇妙的复兴。DBI确实是最基本和过时的,这就是为什么我们使用DBIx::Class,它对django ORM有自己的优势。在Perl编程中也需要django ORM.DRY,它不会懒得重复您自己。DBI不是ORM,所以您不应该将它与ORM进行比较。看看DBIx::Class for Perl ORM,这正是我想知道的。perl死了吗?看起来仍然有一个很大的社区,但是像python和ruby这样的语言似乎已经失去了一些流行性。Perl还远没有死,它正在现代Perl标签下经历一次奇妙的复兴。DBI确实是最基本和过时的,这就是为什么我们使用DBIx::Class,它对django ORM有自己的优势。在Perl编程中也需要django ORM.DRY,它不会懒得重复您自己。DBI不是ORM,所以您不应该将它与ORM进行比较。看看DBIx::Class for Perl ORM。您是否在寻找通常用于库、测试等不同功能的目录结构?不,我非常确定我有一个合适的目录结构,带有/bin、/lib、/t。我真的很想知道ORM在应用程序中应该扮演什么样的角色。你是否在寻找通常用于不同事物(如库、测试等)的目录结构?不,我非常确定我有一个合适的目录结构,带有/bin、/lib、/t。我真的很想知道ORM应该在应用程序中扮演什么样的角色。我从来没有使用过“Moose”,但似乎我越是深入perl这个领域,我就越能看到这个名字出现?如果你不介意举个简单的嘲弄的例子,我会很感激的。否则,我想你已经回答了我的问题。我从来没有使用过“Moose”,但似乎我越是深入perl的研究,我就越能看到这个名字出现?如果你不介意举个简单的嘲弄的例子,我会很感激的。否则我想你已经回答了我的问题。