web-dev-qa-db-ja.com

セッターメソッドで検証ロジックを記述できますか?

セッターメソッドは、引数として渡される属性の値を設定するためにのみ使用されますか?属性に値を割り当てる前に、検証ロジックを記述できますか?

15
Mac

はい、検証ロジックは間違いなく受け入れられます。

ただし、広範な検証がある場合は、これを特定のバリデーターサービスに抽出することをお勧めします。ただし、簡単な検証の場合は、これを安全に行うことができます。

ゲッターとセッターの使用の背後にある全体的な考え方は、誰もあなたのフィールドに直接アクセスできないようにすることです。値を設定/取得したいだけの場合は、それらをpublicにすることができます。

代わりに、セッターを使用して受信データを検証し、設定したルールに準拠しているかどうかを確認します。

この概念は「カプセル化」とも呼ばれ、オブジェクト指向プログラミングの基礎です。

21
Jeroen Vannevel

はい、値を割り当てる前に、セッター属性に検証ロジックを追加できます。実際、不要な値がセッターに送信される可能性がある場合は、これを行う必要があります。

8
Balduz

実際には、setterメソッドへの入力を検証する(データの抽象化に適合するかどうかを確認する)ことをお勧めします。そうすれば可能です。

7
halileohalilei

承知しました。検証を含めることができます。それは許容できますが、必須ではありません。検証しないと、値が変数に設定されようとすることを考慮に入れる必要があります(データ型の要件を満たしています)。

基本的にあなたが持っている場合

public void setNickname(String nick)
{
    this.nickname = nick;
}

それを検証したい場合は、セッター内で行うことができます-たとえば

public void setNickname(String nick)
{
    if(nick.matches("[a-zA-Z]+"){ // only letters
        this.nickname = nick;
    }else{
        // react
    }
}

またはそれを使用する前にセッターの外

if(nick.matches("[a-zA-Z]+"){ // only letters
    account.setNickname(nick);
}

または、メソッドを使用してそれを検証することも、別のバリデータークラスを使用することもできます。多くの可能性があります。

ここで言うように、開発者がこれに目がくらむことを恐れる必要はありません。

6
Dropout

もちろん、セッターに有効な値のみを受け入れさせることには何の問題もありません。

5
NPE

クラスの他のフィールドを変更しない限り、検証するのは正しいことです。

また、setterを削除し、検証またはビルダーでコンストラクターを使用することを検討する必要があります Joshua Blohバージョン

3
Marcin Szymczak

プロパティのセッター内で他の操作を行うことを妨げるものは何もありません。検証から他のプロパティの値の設定など、何でもできます。ただし、そうすべきだと言っているわけではありません。あなたの良い判断と常識を使って、そこに何を入れるかを決めてください。セッターが無数のコード行で大量に処理されている場合は、プログラム構造に質問する必要があります...

2
Tomás