問題タブ [moose]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
perl - mod_perl で冗長なリクエストの数を適切に減らすにはどうすればよいですか?
かなり大規模なレガシー プロジェクトで、いくつかの毛むくじゃらのモジュールを Moose クラスにリファクタリングしました。これらの各モジュールは、その属性を (遅延) フェッチするためにデータベース アクセスを必要とします。これらのオブジェクトはかなり頻繁に使用されるため、たとえば変更されていないデータに対する冗長なリクエストの数を減らしたいと考えています。
さて、どうすればそれを適切に行うことができますか?いくつかの選択肢があります:
- 5〜10分の有効期限でそれらを保存するロールを介してMooseクラスにキャッシュを実装します
memcached
(おそらくそれほど難しくはありませんが、遅延属性では注意が必要です)更新:KiokuDBはおそらくここで役立つ可能性があり、属性について読む必要があります - (いずれにせよ実行する必要があります) に移行し
DBIx::Class
、このレベルでキャッシュを実装します (DBIC はおそらくそれだけでほとんどの苦痛を取り除きます) - どういうわけか、オブジェクトを mod_perl プロセス内に永続化します (これを行う方法の手がかりはありません :()
あなたはこれをどのように行いますか?オブジェクトまたは ORM レベルでデータのキャッシュが優先されますか?
perl - Perl で Moose を使用して、パラメーター化されたロールのメソッドで実行時に作成されたメソッド内のコンシューマー クラスのメソッドにアクセスするにはどうすればよいですか?
実行時に新しいクラスを作成する必要があるパラメーター化されたロール内にメソッドを定義し、Moose::Meta::Class->create
その正確なパラメーター化されたロールをそれに適用します。を使用してその役割の新しいメソッドも作成しています
sub {...} の内部で、コンシューマ クラスのメソッドにアクセスして何かに使用したいのですが、 を使用しようとし$self->get_method
ましたが、うまくいきませんでした。
$self
上記のサブの内部はMooseX::Role::Parameterized::Meta::Role::Parameterizable
これを行う場合、別の質問もあります。
なぜ$object
some_type型ではなく、それは醜いの MooseX::Role::Parameterized::Meta::Role::Parameterizable
ですか?
perl - 新しいMooseクラスを作成し、実行時にそのクラスのオブジェクトをインスタンス化するにはどうすればよいですか?
を使用してメタクラスを作成した後Moose::Meta::Class->create
、そのクラスをメタクラスとして使用して実際のMooseクラスをインスタンス化するにはどうすればよいですか?(メタクラスにもいくつかの役割を適用したいので、メタクラスも作成する必要があります。)
perl - 実行時に Moose オブジェクトのメソッドをどのように置き換えますか?
実行時にMooseオブジェクトのメソッドを置き換えることは可能ですか? Class::MOP::Method
(Moose::Meta::Method
から継承する)のソースコードを見て、私は
実行時にオブジェクトのメソッドを置き換えることができます。を使用してメソッドを取得できます
しかし、これはうまくいきませんでした。
実行時にメソッドを変更することは考えられますか? そして、ムースでそれを行う方法は何ですか?
perl - Moose ベースのオブジェクトで isa() に正規表現を渡すことはできますか?
正規表現をパラメーターとして Moose で isa を使用できますか? 不可能な場合は、以外のもので同じことを達成でき->isa
ますか?
わかりました、次のタイプがあります Animal::Giraffe
、Animal::Carnivore::Crocodile
、やりたいのですが->isa(/^Animal::/)
、できますか? できない場合、目的の効果を得るために何を使用できますか?
perl - MooseX::Declare を使用すると、主に起動時にパフォーマンスが低下しますか?
MooseX::Declare を使用した場合のパフォーマンス ヒットは、主に最初の処理 (つまり、定義を標準の Perl 構文に「変換」する処理) を行うときに発生しますか? つまり、コンパイルとランタイムの初期設定が完了したら、MooseX::Declare メソッドと従来の宣言で定義されたメソッドの呼び出しでパフォーマンスに違いはありますか?
perl - Moose 属性が読み取り専用かどうかをテストする簡単な方法はありますか?
現在、ブロックeval
を使用して、属性を読み取り専用に設定したことをテストしています。これを行う簡単な方法はありますか?
作業コードの例:
UPDATE
答えてくれたfrido、Ether、Robert P、コメントしてくれたEther、Robert P、jrockwayに感謝します。
私は、Ether の答え$is_read_only
が!
. 二重否定もそれを提供します。したがって、 coderef を出力せずに関数$is_read_only
内で使用できます。is()
最も完全な回答については、以下の Robert P の回答を参照してください。誰もが非常に役に立ち、お互いの回答とコメントに基づいて構築されています。全体として、彼は私を最も助けてくれたと思うので、彼は現在受け入れられた回答としてマークされています。繰り返しになりますが、Ether、Robert P、frido、jrockway に感謝します。
疑問に思われるかもしれませんが、私が最初に行ったように、ここに と の違いに関するドキュメントがありますget_attribute
( find_attribute_by_name
Class ::MOP::Class から):
perl - Moose:BUILDメソッドでファイルからオブジェクトを読み込んでいます
BUILDメソッドでファイルを読み取る必要があり、MooseX::Storageパッケージのloadメソッドを使用したいと思います。
ただし、このloadメソッドは新しいオブジェクトを作成するため、オブジェクトをインスタンス化すると、これはファイルから読み取られたオブジェクトではありません。以下のコードでは、ファイルを書き込むために状態2のオブジェクト$ m1を作成し、ファイルを読み取るためのパラメーターなしで$ m2を作成しますが、$m2に正しい値が含まれていません。その包み:
メインプログラム
perl - ミックスイン/ロール/トレイトをUMLで適切に表現するにはどうすればよいですか?
私と他の数人の開発者は現在、レガシーコードベースをクリーンアップしており、主にビジュアルレイヤーとデータレイヤーを分離しています。このリファクタリングに関与していない開発者がモデルを理解できるように、各クラスのスコープと望ましい使用法についてのコメントを含む(非公式の)クラス図を紹介したいと思います。私は怠け者なので、そのためにUMLGraphを使用したいと思います。
ただし、小さな問題があります。perlコードベースがあり、リファクタリングではMooseの役割が広範囲に使用されます。今、私は役割の適切な抽象化を見つけるのに十分なUMLを知りません-私の最初の推測はインターフェースですが、それらには実装も含まれています。多重継承もそれを完全にカットしません。
クラス図で役割を適切に表現するにはどうすればよいですか(またはどのように表現しますか)?
perl - Moose で基になる属性が変更されたときに遅延構築された属性を再構築する
属性を持つMooseクラスがありlazy_build
ます。その属性の値は、別の (非遅延) 属性の関数です。
必要な属性の値が 42 のクラスを誰かがインスタンス化したとします。次に、42 の関数として計算される lazy 属性を要求します。次に、神経質になって最初の属性を変更します。
遅延属性は既にビルドされているため、ビルダーが再度呼び出されることはなく、遅延属性は古くなっています。
必要な属性に「ダーティ」フラグを維持し、レイジー フラグのアクセサがダーティ フラグをチェックし、必要に応じて再構築するという解決策があります。
ただし、これは大変な作業のようです。トレイトを使用するなど、Moose 内でこれを処理する方法はありますか?