私はJavascriptでOOPに頭を悩ませようとしています(他の言語でもOOPを実際に使用したことはないので、これが初めての経験です)。コンストラクターの入力を必要とするクラスを作成しましたが、コンストラクターは特別にフォーマットされた文字列でのみ機能します。
入力をチェックするために使用できる正規表現がありますが、一致しない場合(または入力がまったくない場合)に何をすべきかわかりません。ある種の例外をスローする必要がありますか?もしそうなら、どうすればそれについて行くことができますか?
私はJavascriptでOOPに頭を悩ませようとしています(他の言語でもOOPを実際に使用したことはないので、これが初めての経験です)。コンストラクターの入力を必要とするクラスを作成しましたが、コンストラクターは特別にフォーマットされた文字列でのみ機能します。
入力をチェックするために使用できる正規表現がありますが、一致しない場合(または入力がまったくない場合)に何をすべきかわかりません。ある種の例外をスローする必要がありますか?もしそうなら、どうすればそれについて行くことができますか?
JavaScriptでは、例外をスローすることはあなたがやりたいことではありません。例外は例外的にのみ発生します(ええと...)。これは、通信のためにあらゆる場所で例外が使用されるJavaとは対照的です。この違いの理由は、JSでは例外処理が非常に遅いためです。
したがって、コンストラクターに。を装備することは非常に適切ですがthrow
、それが本番環境で捕捉されることは想定されていません。コンストラクターの外部で、最初に有効性を確認することをお勧めします。
行う:
if (validRE.test(input)) {
foo = new MyObject(input);
} else {
// show message to the user
}
しないでください:
try {
foo = new MyObject(input);
} catch (ex) {
// show message to the user
}
JavaScriptコンストラクター(new
キーワードで呼び出される関数)は、常にオブジェクトを返す必要があります。返すことはできません。またはfalse
、null
通常どおりに呼び出された場合と同様です。したがって、2つのオプションがあります。
throw
ステートメント内のすべてのjavascript値でこれを行うことができます。次に、try
ステートメントで建設の外でそれらをキャッチしますinvalid
ポインターに設定されています。Date
たとえば、コンストラクターはそれを実行し、属性を取得するとsになりますNaN
。さらに(特に例外を使用する場合)、コンストラクターの静的プロパティとして追加の検証関数(ブール値を返す)を提供する場合があるため、オブジェクトを作成する前でもそれを使用できます。例:
function Decryption(str) {
if (! Decryption.test(str))
throw new SyntaxError("invalid encryption");
this.result = decrypt(str);
}
Decryption.test = function(str) {
return /MyCoolRegExp/.test(str);
};
例外をスローする場合は、次のように実行できます。
throw new Error("Illegal construction string.");
(Error
オブジェクトは必須ではありません。つまり、プレーンな文字列をスローできますが、onerror
イベントを処理するとエラーメッセージが適切に表示されます。)
ユーザー入力を使用する場合は、コンストラクターを呼び出す前に文字列を検証し、例外の結果よりもわかりやすいメッセージをユーザーに提供する必要があります。もちろん、コンストラクターで検証を行って、何も潜入していないことを確認することもできます。
これを回避するには、通常2つの方法があります。例外をスローするか、失敗を示す値(などundefined
)を返す方法です。JavaScriptでは、私は後者の、より寛容なアプローチに傾倒する傾向があります。
また、2番目のアプローチはJavaScript自体の多くをより厳密に模倣していることもわかりました。たとえば、Pythonでは、オブジェクトに存在しない属性にアクセスしようとすると、例外がスローされます。
>>> foo = 0
>>> foo.idontexist
AttributeError: 'int' object has no attribute 'idontexist'
一方、JavaScriptでは、を返すだけundefined
です。
> var foo = 0;
> foo.idontexist
undefined
多くの関数とオブジェクトもこのように機能します。たとえば、例外をスローする代わりに、間違った日付文字列が渡されたときにオブジェクトをDate
返します。Invalid Date
> var foo = new Date('thisisnotadate');
> foo
Invalid Date