Perlでの壮大なオブジェクトの作成

お気に入りのPerlでオブジェクトを作成するためのオリジナルのオプションに何度か出会い、6日目までため息をつきました。 しかし、かなり人気があり、 完全に安全なデザインは、「人気のある」5つで保護できます。 クロージャーとコショウのスライドを含む教科書の古典的なバージョンを使用します:)


だから、教祖を遅らせたり困らせたりしないために-私はすぐにコードを引用していますが、説明はその下にあります:

package Person;

use Carp;
use strict;

my ($init,$setup);

sub new {
my $invocant = shift;
my $self = bless({}, ref $invocant || $invocant);
$self- > $init();
$self- > $setup(@_);
return $self;
}

$init = sub {
my $self = shift;
$self- > name("unnamed"); # end etc

};

for my $field (qw(name race aliases)) {
my $slot = __PACKAGE__ . "::$field";
no strict "refs"; # So symbolic ref to typeglob works.
*$field = sub {
my $self = shift;
$self- > {$slot} = shift if @_;
return $self- > {$slot};
};
}

$setup = sub {
my $self = shift;
my %var = @_;
no strict "refs";
foreach (keys %var) {
if (*$_{CODE}) {$self- > $_($var{$_});}
else {carp (qq{Haven`t properties "$_" in object }.__PACKAGE__." ");}
}
};


* This source code was highlighted with Source Code Highlighter .


完全に古典的な方法でオブジェクトを作成するための素晴らしいパッケージを取得します。

my $mage = Person- > new(name= > "Gandalf",race= > "Istar");


「-教科書のどのような再版ですか?」 -お願いします。

実際、教科書とはいくつかの違いがあります-
  1. 完全に静かに新しいオブジェクトのパラメーターをコンストラクターに完全に渡します
  2. エラーを渡してコンストラクターを完全に冷静に許可します-オブジェクトは(すべての有効なプロパティで)作成され、ユーザー(モジュール)は不明なプロパティを設定しようとしたというメッセージを受け取ります。 おそらくこれにより、彼はモジュールのドキュメントを読むことになります。


そして、設計全体が透かし模様で耐久性があります。提供しなかったプロパティを「固定」しようとすると、ユーザー(モジュール)コード内の場所をPerl自体が示す致命的なエラーが既に発生します。

私見は、OOP関数の「大きな」ラッパーモジュールを使用する「より透過的」です。

PS。 ROプロパティの作成を妨げるものは何もないことは明らかです。クロージャに型チェックを追加します。
if (__PACKAGE__ eq (caller)) {#inner call}

そして、外部からROプロパティへの書き込み呼び出しを遮断し、内部呼び出しのみを残します(このプロパティを使用しますか?)。

UP 。 このトピックに基づいて、半完成ボトックスが誕生しました-それをコピーして賢く使用してください。

Source: https://habr.com/ru/post/J72891/


All Articles