التنفيذ النظيف لنمط الإستراتيجية في بيرل
-
09-06-2019 - |
سؤال
كيف أكتب تنفيذًا نظيفًا لنمط الإستراتيجية في بيرل؟أريد أن أفعل ذلك بطريقة تستفيد من ميزات بيرل.
المحلول
يعتمد الأمر حقًا على ما تعنيه بـ "التنفيذ النظيف".كما هو الحال في أي لغة أخرى، يمكنك استخدام نظام كائنات Perl مع تعدد الأشكال للقيام بذلك نيابةً عنك.ومع ذلك، بما أن لغة Perl لديها وظائف من الدرجة الأولى، فإن هذا النمط لا يتم ترميزه بشكل صريح عادةً.مثال ليون تيمرمانز
sort { lc($a) cmp lc($b) } @items
يوضح هذا بشكل أنيق للغاية.
ومع ذلك، إذا كنت تبحث عن تطبيق "رسمي" كما تفعل في C++، فإليك ما قد يبدو عليه استخدام Perl+غزال أمريكي ضخم.هذه مجرد ترجمة لكود C++ من ويكيبيديا--نمط الإستراتيجية, باستثناء أنني أستخدم دعم Moose للتفويض.
package StrategyInterface;
use Moose::Role;
requires 'run';
package Context;
use Moose;
has 'strategy' => (
is => 'rw',
isa => 'StrategyInterface',
handles => [ 'run' ],
);
package SomeStrategy;
use Moose;
with 'StrategyInterface';
sub run { warn "applying SomeStrategy!\n"; }
package AnotherStrategy;
use Moose;
with 'StrategyInterface';
sub run { warn "applying AnotherStrategy!\n"; }
###############
package main;
my $contextOne = Context->new(
strategy => SomeStrategy->new()
);
my $contextTwo = Context->new(
strategy => AnotherStrategy->new()
);
$contextOne->run();
$contextTwo->run();
نصائح أخرى
استخدم المراجع الفرعية والإغلاقات.مثال جيد على ذلك
sort { lc($a) cmp lc($b) } @items
قد تكون هذه المقالة ذات فائدة.ويغطي مثالا لاستخدام نمط الاستراتيجية في بيرل. http://www.perl.com/pub/a/2003/08/07/design2.html