- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑将模块的各个方法移动到单独的模块中,以获得更易于管理的文件。我为此写了一个小测试:
a.pl:
#!/usr/bin/perl
use 5.028;
use warnings;
use utf8;
use open ':std', ':encoding(UTF-8)';
use Readonly;
use English qw(-no_match_vars);
use Benchmark qw(:all);
use A;
our $VERSION = 1;
Readonly::Scalar my $COUNT => 10_000_000;
warn $A::VERSION;
warn $A::Login2::VERSION;
my $a = A->new;
warn $a;
$a->login(1);
$a->login2(1);
cmpthese($COUNT, {
login => sub{$a->login},
login2 => sub{$a->login2}
});
下午:
package A;
use 5.028;
use warnings;
use utf8;
use open ':std', ':encoding(UTF-8)';
use Readonly;
use English qw(-no_match_vars);
use A::Login2 'login2';
our $VERSION = 1;
sub new {
my ($class, $p) = @_;
my $this = {};
bless $this, $class;
return $this;
}
sub login {
my ($this, $dump) = @_;
if ($dump) {
warn "$this: login";
$this->test;
}
return;
}
sub test {
my ($this) = @_;
warn "$this: test";
return;
}
1;
A/Login2.pm:
package A::Login2;
use 5.028;
use warnings;
use utf8;
use open ':std', ':encoding(UTF-8)';
use Readonly;
use English qw(-no_match_vars);
use base 'Exporter';
our @EXPORT_OK = qw(login2);
our $VERSION = 1.1;
sub login2 {
my ($this, $dump) = @_;
if ($dump) {
warn "$this: login2";
$this->test;
}
return;
}
1;
./a.pl 的输出是:
1 at ./a.pl line 18.
1.1 at ./a.pl line 19.
A=HASH(0x5581d48f3470) at ./a.pl line 21.
A=HASH(0x5581d48f3470): login at A.pm line 25.
A=HASH(0x5581d48f3470): test at A.pm line 34.
A=HASH(0x5581d48f3470): login2 at A/Login2.pm line 18.
A=HASH(0x5581d48f3470): test at A.pm line 34.
Rate login login2
login 5847953/s -- -6%
login2 6250000/s 7% --
我本以为登录比登录2更快。
我期待您的评论。
最佳答案
这是一个关于设计的开放式问题,但我会提供一些具体的评论。
首先,为了便于管理和提高可读性而分割笨重的文件是一个值得称赞的想法,这通常是一个好主意。我们在编写的任何大型代码中使用
库——因此,整个代码被分割在不同的单元中。
但这种划分是基于功能的,行为(功能)自然地分组到包中。根据大小进行分割可能会导致代码库变得尴尬;组合起来可能很重要,更新可能会变得棘手(有错误?)等等。这实际上会阻碍整体的可管理性。
如果一个模块感觉太大,很可能是捆绑在一起的功能太多,并且代码库应该位于多个不同模块中。没有简单的规则来评估这一点;设计库并不容易。思考一下拆分一组函数以便它们拥有自己的功能是否有意义可能会有所帮助 namespace ? †
但是,发布的示例有另一个问题:它是一个类,但面向对象的机制与基本包导入混合在一起。这是很复杂的(一个对象如何/为什么传递给一个不是类的文件中定义的函数?),我不建议这样做。
设计良好的类是否会太大而无法很好地放入文件中?大概是我猜的吧,虽然我没见过这样的案例。通常,当一个代码库最终在 Perl 中的多个编译单元中崩溃时,这是因为功能性——拥有多个类更合适。
但是,如果不知何故,仅仅是大小问题最终成为问题,那么合理的方法可能是让多个文件各自为同一个包
,并清楚地记录下来。
A.pm
package A;
use warnings;
use strict;
use feature 'say';
# =======================================================
# NOTE: Class definition is given in multiple parts/files
# =======================================================
use A_part1;
use A_part2;
sub new { ... }
# perhaps more methods in this file
1;
A_part1.pm
package A;
# warnings, strict, pragmas, etc
sub func1 { my ($self, @args) = @_; ... };
...
1;
对于A_part2.pm
等也类似。然后照常使用
use A;
my $obj = A->new( ... );
$obj->func1(...);
请注意,这打破了有关文件名和包名称之间关系的规则(约定)(A_part1.pm
vs package A;
);首先,PerlCritic 会提示。‡但是,这里是故意这样做的,我不会担心这一点。
但我认为实际上很少需要这样做。我宁愿期望,如果一个库看起来太大,它可能承担了太多的任务,应该重新设计为多个类。
† 但是,如果确实有太多属于同一个库的函数,一旦文件被分解,请考虑使用 require
将这些文件放在一起.
‡ Perl::Critic::Policy::Modules::RequireFilenameMatchesPackage
关于Perl 面向对象编程 : Is it a good idea to outsource methods in your own modules,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68297780/
我正在使用 pytesseract(tesseract 版本 3.05)对以数字方式创建的打印 PDF 帐单进行 OCR(光学字符识别)。我对其进行预处理以去除任何颜色并将其设置为纯黑白和 600 D
以下是我尝试运行的代码,输出是Good。那么,我们可以使用类实现的接口(interface)的变量吗? interface IDummyInterface { public String TY
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在编写一个 Java 客户端,它通过 HTTP/XML 与远程服务器通信。 服务器以 XML 格式向我的客户端发送命令,如下所示: C1 ..... 大约有 10 个或更多不同的命令(C1
我在 android 应用程序上有一个奇怪的问题,我没有这样的表异常,但我确定数据库存在。对于某些将我重定向到此处其他帖子的人,我想补充一点,我正在自己的手机上尝试该应用程序而不是模拟器,这是因为我在
我在谷歌上搜索 RNGCryptoServiceProvider,其中包含有关如何限制最大值和最小值之间的范围并仍然获得均匀分布的示例。在我使用模运算符之前,但有时我会得到奇怪的值(高于最大值)...
这个问题在这里已经有了答案: calling constructor of a class member in constructor (5 个答案) 关闭 4 年前。 我有一个非指针类成员需要在构
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭10
作为hadoop配置什么好.. 大量小型机器,每台具有 512 MB Ram 或少量大型机器(大约 2Gb 或 4GB Ram) 我可以选择两者中的任何一个,因为我的节点是虚拟机.. 请分享您的想法.
伙计们,我是vue新手所以不知道如何实现以下情况我如何获取当前选定行的数据这是代码
我经常访问一个名为 GOOD 的网站我特别喜欢一种审美风格;导航栏如何在网站背景中扩展其颜色。如果您访问该网站,就会明白我的意思。 在 CSS 中,我怎样才能以最简单的方式复制它?我已经用 z-ind
我有一个存在主义假设,例如: H : exists (a : A) (b : B) (c : C), P a b c 我想分解为: a : A b : B c : C H0 : P a b c 战术d
在 Github 上,我注意到一些拉取请求说它们“适合合并”,因为它们通过了 Travis构建通过。我已经使用了一点 Travis,它如何与 Github 上的拉取请求集成? 这是我正在谈论的内容的屏
刚刚在 Apple docs: 中找到 Note: Although good for occasional communication between threads, you should not
我正处于一个应用程序的概念阶段,该应用程序将有大量音频/视频输入和输出。我想用Java来做;但不知何故我还没有完全相信。你怎么认为?到底能有多糟糕?有什么建议吗? 为什么我想到 Java: 这是我最熟
我正在用 Java 重新实现 .Net API,该 API 指定了一大堆事件,但 java 并不隐式支持。 我将使用观察者模式,但由于事件的数量,我真的不想让界面变得困惑。 我想知道声明一个“Even
我的类有很多方法,其中一些方法是用注释标记的。每个方法可以有很多注释,例如 @StepAnnotation(name="Action1" ) @SequenceAnnotation(name="tra
启用GD后(通过调用enableSecureCommunication或对应用程序进行身份验证),将自动保护NSURLConnection。它是如何做到的? 最佳答案 我的猜测是,Good Dynam
我是 Vue 的新手并且陷入了困境,如果有人建议我如何做到这一点,我不知道该怎么做,让我先展示我的代码 save 并在脚本中 data(){ return{
考虑以下代码: private List types; if(!getTest().contains(type)) { return Color.LIGHT_GRAY;
我是一名优秀的程序员,十分优秀!