はPerlのコンストラクタを返しますundefまたは"無効な"オブジェクト?
-
19-09-2019 - |
質問
質問:
と思われるもの"ベストプラクティス"- なぜ -取扱いを誤るコンストラクタ?.
"ベストプラクティス"ときから引用-シュワルツ氏は、50%のCPANモジュールです。;が嬉しいなどの理由付き意見ら誰でもこの共通のベストプラクティスなのです。
どっとのコミュニケーションのセキュリティーソフトで通知するソフトウェア開発を含め多くの年に、三つの主要へのエラー処理を必要とするperlモジュール上場から最悪の思):
を構築し、オブジェクトの設定で無効なフラグ(通常"
is_valid
"法です。しばしば相の設定にエラーメッセージを経由してクラスのエラー処理する。プロ:
できるための基準と比べてどのメソッドの呼び出し)エラー処理として利用可能です
$obj->errors()
タイプ通話後の悪いコンストラクタのように後その他の方法。できる追加の情報を渡すこと(例えば>1エラー、警告、など)
できる軽量化のための"やり直し"/"fixme"機能、その場合、オブジェクトを構築し非常に重く、多くの複雑な属性が100%でもOK、との理由で有効でない人の入力に誤りがあった日付できない"
$obj->setDate()
"の代わりのオーバーヘッドを再度実行全体のコンストラクタです。このパターンが必要との要望に応えることができ非常に有のデザイン。
連結実績:なしをしているところ意識している。
返却"
undef
".連結実績:できません達成の為のプランに初のソリューション(オブジェクトごとのエラーメッセージ以外のグローバル変数および軽量化"fixme"の能力が重。
金型内のコンストラクタです。外部の非常に狭い端の場合、個人的にこのことを考え、どの選択肢が多すぎる理由のあるリストのマージンのこの質問です。
更新:かについて考察(その他の非常に価値やデザイン)溶液を非常に簡単なるコンストラクタではなくすべての重初期化法ですべてのエラーチェックが生じた場合には、まだサブセットのいずれかの場合#1(初期化設定エラーフラグ)の場合#3が初期化子の金型を用います。明らかに、そのようなデザインは、自動的に拒否するオプション#2.
解決
すごいコンストラクタへの行する
この応答が私の個人的な観測がほとんどのものPerl、最良の実践かを突き詰めれば"この一文について教えてください、き出によってニーズに応えるものです。 お客様のお好みにてご説は完全に有効にすると誰もいないのかを伝えるべきます。
私は実際に 好 死場建設に失敗した場合、この設定を行う唯一の種類の誤差の中で起こりうるオブジェクトの建設は、明らかな誤りは中止します。
一方で、希望しないなと思っていう2 1日がかりやすくチェックのためのパラメータが定義されているオブジェクトでチェックは一部のフラグを変数となります。こんてしない強力な入力制約をほとんど当社のコンストラクタを返す必要があるオブジェクトこのタイプです。で還元 undef
, は、確認のための成功または失敗す。
の架空の建設の故障が考特定のエッジケースができない迅速に失敗する前に負担架での方が好みの方法1.表示によって違いますので、それぞれが何を意味だけに定義されたオブジェクト。例えば、好きなヘビー級初期化以外の建築です。として標準化だと思いるかどうかの確認、コンストラクタを返します定義されたオブジェクトでは標準として確認フラグを変数となります。
編集: お客様の編集約initializers拒否する場合には#2んか初期化子ができれば、戻り値の型関数が値を返すことを示す成功または失敗ではなく設定フラグに変更します。実際に、使いたい場合は、両者によって詳細にできているとエラーが表示されるが発生しました。ているのは、完全に有効な初期化子にtrueを返成功 undef
のです。
他のヒント
う:
- いとして初期化してきましたが、コンストラクタです。
croak
との情報メッセージが何かが間違っています。- 適切な初期化の方法を提供したオブジェクトのエラーメッセージなど
また、帰国 undef
のではなくcroakingとする場合には、利用者のクラスは、なぜ、故障が発生した場合に限って有効なオブジェクトです。
I despiseん is_valid
手法または追加をチェックの確保の方法でなされたときに呼び出され内部状態のオブジェクトでは定義されています。
いうことから非常に客観的視点を作らずにいる、当社グループの現在の計約ベストプラクティスに関する
でおすすめの対#1だからこそつながりエラーコードの取り扱いますので書いていただくようにしました。例えば、ばかりのときはfalseを返しますこの作品です。
my $obj = Class->new or die "Construction failed...";
ものを返却された場合は、そのオブジェクトは無効とな...
my $obj = Class->new;
die "Construction failed @{[ $obj->error_message ]}" if $obj->is_valid;
としての量のエラー処理コード確率を増大するのかについて書かれているわが低下します。な非線形です。の増加による複雑さのエラー処理システムで実際に減少量の誤差では実用化が実現した。
ものではありません注意するこのオブジェクトが無効な場合に該金型の場合のメソッドが呼び外 is_valid
や error_message
先には、さらに多くのコードの機会です。
それに価値があることに関する情報を取得するための障害ので、falseを返す( return
ない return undef
)現在も同じです。伝統的にこれを呼び出すことによってクラスメソッドまたはグローバル変数としてDBI.
私$dbh=DBI->接続($data_source,$ユーザー名、$のパスワード) や$DBI::errstr;
では、まだまだ書きエラーコードの取り扱いおよびB)その場合に有効で、最終動作します。
の最善のこと、一般的には例外をスローすと croak
.現在は、通常の場合、ユーザに書き込みのない特別なコードにエラーが発生した時点では問題なくエラーメッセージがデフォルトです。
my $obj = Class->new;
Perlの伝統的な提言に対し例外を投げるライブラリコードとしては失礼は時代遅れです。Perlプログラマー(後)抱例外をスローしました。より書込みエラーコードの取り扱い、もう一度ひっくり返してもう一つがひどく、しばしば忘れ、例外DWIM.いないと確信での使用を開始 autodie (見pjfのビデオで やまずレジで注文を聞かれ、渡されます。
例外alignハフマン符号化は実際に利用します。共通の例と期待のコンストラクタで作品を見捨てずに何とかしようという誤っていることを確認してくださいが、少なくともコードです。では珍しい場合がしたい、ということはあまり扱うするとエラーが必要で書面に特殊なコードです。特殊コードは小さい。
my $obj = eval { Class->new } or do { something else };
場合には包装毎に呼び出 eval
ることができます。例外と呼ばれることとなります。場合は、コメントは、上記したい優雅なエラー処理のためのユーザーの酒、それを活かし、この誤差はバブルのスタックです。例えば、提供したい素敵なユーザエラーページやログのエラーを実行します。
eval {
run_the_main_web_code();
} or do {
log_the_error($@);
print_the_pretty_error_page;
};
する必要があるので一つの場所でのお呼び出しスタックによる散乱です。できるので小さな単位で、たとえば---
my $users = eval { Users->search({ name => $name }) } or do {
...handle an error while finding a user...
};
あいます。1) Users->search
で返します真の価値、この場合配列。この単純な my $obj = eval { Class->method } or do
ます。このオプションです。その2)が必要となりますが多く作られているのも特徴のエラー処理の周辺 Users->search
.すべてのメソッドの呼び内 Users->search
すべての方法でコー---か投げることができます。それらはすべてって、ある地点における取り扱いと同じです。取り扱いの例外でのポイント利益ばかり考えて行動しています。いneater、コンパクトと柔軟なエラー処理のコードです。
できるパックの例外による croak
グ文字列バオブジェクトではなくただの文字列になります。
my $obj = eval { Class->new }
or die "Construction failed: $@ and there were @{[ $@->num_frobnitz ]} frobnitzes";
例外:
- この商品につけられたタグなくなったりすることは以前からよく、呼び出し側
- の少なくともコードの場合
- 提供し、最も柔軟性に関する情報は失敗の呼び出し側
モジュールなど Try::Tiny 固定の掛けを取り巻く問題を eval
例外として、ハンドラです。
としてご利用いただく場合が非常に高価なオブジェクトという、継続していけるので部分的に造り---匂いYAGNI。いま必要なのですか?以下は肥大化したオブジェクトデザインしていく考慮したほうが良いと思います。う必要がある場合で、入れることができるのに必要な情報を継続の建設中の例外オブジェクトです。
最初の華一般の考察
- コンストラクタの仕事をとるときで有効建設のパラメータに戻有効なオブジェクトです。
- コンストラクタでないものを有効なオブジェクトを履行できないその仕事はそのためにピッタリの例外です。
- く構築されたオブジェクトが有効なのはコンストラクタです。渡知することにより悪いオブジェクトを頼りに顧客のことを確認するオブジェクトの有効性は必ずうまくいく方法をと無効なオブジェクトの爆発モニタと高速なネットワーク接続のための非です。
- チェックすべての引数は以前のコンストラクタを呼 は クライアントの仕事です。
- 例外を細粒度の伝播特定のエラーが発生しなくて壊れたオブジェクトです。
return undef;
常に悪い[1]- bIlujDI'yIchegh()Qo';yIHegh()!
現在、実際の問題ますが、堅固なことはできないものは何ですdarchのアドバイザリー-グループでご覧ください.まず、私が注還元を偽値失敗はPerlの歴史の中核る作品は、例えば、多くのモジュールに従うこと。しかし、この条約の生産に劣るクライアントコードは、新しいモジュール内に広く伝え、また日本です。[2]
【支援の引数をコードサンプルのためこの減り具合によってより一般の場合より例外として扱うことが認めるときの創造 autodie, なか誘惑に抵抗をその場合はこちらです。代わりに:]
をチェックのための創出が実際に 以上 有償より確認のための例外では適切な例外扱います。の他のソリューションを必要との顧客になりういうオブジェクトを取得ることによって、ある場合は、必須ではありませんのコンストラクタが失敗による例外。[3]、例外が格段の差がありますの表現によ undef
もひとつの表現として通過後、壊れたオブジェクトの目的の文書に誤りや注釈ついて、さまざまなレベルのスタックです。
することができます、部分的に構築されたオブジェクトに合格いは例外です。こういう悪習り"というのは、私の見方というコンストラクタの契約のお客様とともにあるべきであるが、行動に対応しています。祭.
い:るコンストラクタを作成できない有効なオブジェクトは例外をスローすることになりました。例外をコンストラクタでスローされる可能性があります文書化されるべきである部品のインタフェース。のみ呼び出しのレベルでの有意義に関する法律の例外とすべきものを探す非常に多く行動は、"この建設に失敗した場合、ない"は本当に正しい
[1]:るという私的な利用の場合 return;
とは異なるのですが優れている。ば呼んでくださいこうして実際に開か疑問です。だかないようになりましたよ。;)
[2]:たっ極めて非科学的記憶のモジュールの界面を読んで、昨年には、両方の選択-検証のバイアス.
[3]:注この例外をスローしなが未だ不十分な項目もありますがエラー処理のように提案したソリューション。であるということではありません包装毎インスタンス生成に eval
されない限りは、たいへん複雑なエラー処理の周辺建築(たくさんいしょ悪い)。この包装のできる有意義に関する法律の例外を、 eval
.