سؤال

كيف أكتب تنفيذًا نظيفًا لنمط الإستراتيجية في بيرل؟أريد أن أفعل ذلك بطريقة تستفيد من ميزات بيرل.

هل كانت مفيدة؟

المحلول

يعتمد الأمر حقًا على ما تعنيه بـ "التنفيذ النظيف".كما هو الحال في أي لغة أخرى، يمكنك استخدام نظام كائنات 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top