سؤال

لديّ حزمة (في الحقيقة مجرد روتين فرعي واحد) أستخدمه بشكل متكرر لتحليل ملف التكوين وما إلى ذلك. يبدو الأمر كذلك:

sub get_settings {
        my %config;
        my $config = 'path...';

        unless(-r $config) {
                die("Couldn't read config");
        }
        open CONFIG, '<', $config or die $!;
        while(<CONFIG>) {
                next if (($_ eq "\n") or /^\;/);
                chomp;
                my($setting, $value) = split(/=/, $_);
                $config{$setting} = $value;
        }
        return %config;
}

أساسي إلى حد ما ، لكنني كنت أتساءل كيف (وإذا) يمكن أن تكتب هذا/ OOP؟ حقا فقط للتعلم ، لم أر متى ولماذا الاستخدام يبارك. =)

شكرًا!

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

المحلول

إن الإجابة على السؤال لها علاقة بالبرامج التي تستخدمها في الحزمة أكثر من الحزمة نفسها.

إذا كانت هذه التطبيقات/البرامج النصية الكبيرة القائمة على OOP ، فمن المؤكد أن يكون من المنطقي ذلك لأن هذا هو ما يتوقعه العميل (التطبيقات والأشخاص الذين يكتبون هذه التطبيقات/البرامج النصية). أيضا وجود مكتبات على النمط الضروري تلتصق مثل الإبهام المؤلم وخلق التعقيد.

على العكس من ذلك ، إذا تم استخدام الحزمة في البرامج النصية الضرورية الأقصر ، فإن واجهة OOP ستتعارض مع توقعات العميل (أي البرامج النصية + الأشخاص الذين يقومون بتطويرها).

ربما أنت تهاجر بين الأساليب (على سبيل المثال ، يصبح البرنامج النصي كبيرًا وغير عملي ويحتاج إلى أن تكون منظمًا بشكل أفضل ، ربما مع OOP) في هذه الحالة ، يعد نوع الإعدادات/التكوين مكانًا جيدًا للبدء لأنها تميل إلى الانفصال جيدًا ولديها خطوط واضحة من الاستجابة.

باختصار: افعل ما هو أكثر منطقية حيث يتم استخدام الحزمة.

نصائح أخرى

فيما يلي (نأمل!) مثالًا بسيطًا على تجريد التكوين القائم على OO باستخدام:

NB. يمكنك استخدام وحدات أخرى أو حتى لفة الخاصة بك. أدناه يخدم تماما كمثال عام.

RoomConfig.pm

package RoomConfig;
use Moose;
with 'MooseX::SimpleConfig';

has doors   => (is => 'rw', isa => 'Int', required => 1);
has windows => (is => 'rw', isa => 'Int', default  => sub {0});

1;

لذلك أعلاه هو فئة التكوين OO لدينا. يتم الإعلان عن كل شيء بدقة ، لذا فأنت تعلم بوضوح أن خيارات التكوين متاحة وصالحة ، أي. توثيقها الذاتي.

لذا لإنشاء ملف room من ملف التكوين سيكون:

use RoomConfig;

my $box_room = RoomConfig->new_with_config( configfile => 'box_room.yaml' );

لأنها فئة يمكنني أيضًا إنشاء مثيل room بدون ملف التكوين:

my $cupboard       = RoomConfig->new( doors => 1 );
my $utility_room   = RoomConfig->new( doors => 2 );
my $master_bedroom = RoomConfig->new( 
    doors      => 1,
    windows    => 2,   # dual aspect
);

وأيضًا مع هذه الوحدات المعينة ، نحصل على ميزات إضافية مثل هذا:

# below throws exception because room must have a door!
my $room_with_no_door_or_window = RoomConfig->new; 

وبالتالي ، يمكن أن يأتي التكوين الخاص بي بسهولة من ملف التكوين أو عن طريق تعيين السمات.


ويمكننا المضي قدمًا عن طريق توسيع تكويننا لأنواع مختلفة من rooms:

الحمام

package BathRoomConfig;
use Moose;
extends 'RoomConfig';

has loos  => (is => 'rw', isa => 'Int', default  => sub {0});
has sinks => (is => 'rw', isa => 'Int', default  => sub {0});
has baths => (is => 'rw', isa => 'Int', default  => sub {1});

1;

وإذا استخدمنا هذا التكوين (الحمام. Yaml):

doors:  1
windows:    1
bath:   1
loos:   1
sinks:  2

ثم يمكنك القيام بذلك:

use BathRoomConfig;

my $upstairs_bathroom = BathRoomConfig->new_with_config( 
    configfile => 'bathroom.yaml' 
);

my $closet_room = BathRoomConfig->new_with_config( 
    configfile => 'bathroom.yaml',
    baths      => 0,
    sinks      => 1,
    windows    => 0,
);

لاحظ أن $closet_room يستفيد من كل من ملفات التكوين وإعداد سمات الإعداد.

لاحظ أيضًا أنه إذا لم يكن لدى ملف التكوين الخاص بي doors (أي خاصية مطلوبة) ثم كان قد ألقى خطأ على new_with_config.


وأخيراً قد نجد introspected لدينا فئة التكوين المحددة في متناول يدي:

use RoomConfig;

say "RoomConfig provides the following options:";

for my $attr (RoomConfig->meta->get_attribute_list) {
    next if $attr eq 'configfile';
    say '-> ', $attr;
}


الآن لا يوجد شيء يمنعك من تنفيذ معظم هذا في حزمة التكوين القياسية ، لذا في نهاية اليوم ، فإن الخيول فقط للدورات التدريبية!

ومع ذلك ، فإن سهولة إدارة كل هذا أسهل بكثير مع OO والميزات التي توفرها هذه الوحدات المكتوبة بالفعل هي ميزة كبيرة خاصة في المشاريع الأكبر.

يمكنك إلقاء نظرة على التعليمات البرمجية المصدر من الوحدات النمطية على CPAN. فمثلا التكوين :: عام يجب أن تجيب على أسئلتك ...

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