0

データベース内のテーブルを表すモデル クラスがあります。テーブルには 7 つの列があるため、クラスには 7 つの属性があります。null を許可するものもあれば、許可しないものもあります。

したがって、人をパブリック関数に渡すとき、null 属性が許可されていないかどうかを確認します。のような通常のチェックで

if(person.getName() == null || person.getSurname() == null ...)
     throw new NullPointerException();

基本的にこれを行う Person クラスで関数を作成することの欠点があるかどうか疑問に思いますか? お気に入り

public void checkFullDataset()
{
   if(name == null || surname() == null ...)
       throw new NullPointerException();
   return;
}

そのため、人と仕事をするときはいつでも、すべてのフィールドを手動でテストする代わりに、このメソッドを呼び出します。また、将来テーブルが変更された場合 (新しいフィールドが追加された、null/not null の動作が変更されたなど)、コード全体の多くの「if」の代わりにこの関数を変更するだけでよいため、利点もあります。

4

3 に答える 3

1

2 つのアイデア:

  1. 空のコンストラクターを無効にして、すべてのフィールドを引数として取り、そこにチェックを入れるコンストラクターを導入することをお勧めします。

  2. そのようなメソッドを追加したい場合は、セッションを、などのboolean標準check関数と同様に返して、ユーザーに処理させる方がよいでしょう。hasElement()hasNext()iEmpty()

    public boolean checkFullDataset() {
       if(name == null || surname() == null ...)
         return false;
        return true;
    }
    
于 2012-10-16T16:11:37.017 に答える
0

要求を処理する最善の解決策は、Personクラスを不変にし、Builder パターンを使用して初期化時に必須フィールドをチェックし、その後はチェックしないことです。

このサンプルを見てください: http://xavimiro.blogspot.fr/2008/04/new-builder-pattern.html

于 2012-10-16T16:16:27.390 に答える
0

あなたが発見したように見えるのは、「クラス不変」という概念です。プログラミング言語があります。たとえばEiffel、言語は、クラスのすべてのパブリック関数に出入りする前に制約をチェックし、満たされていない場合は例外をスローします。自分でやっていることがほとんどです。

関数の事前条件と事後条件も検索してください。同様の概念です。

コードによっては、チェックがパフォーマンスの問題であることがわかる場合があります。その場合、プロダクション コードではチェックを無効にすることができます。

于 2012-10-16T16:17:13.833 に答える