web-dev-qa-db-ja.com

データ転送オブジェクトのインスタンス変数の優先アクセス修飾子は何ですか?

私はデータ転送オブジェクトを作成していますが、インスタンス変数へのパブリックアクセスのみを与える方が良いのか、それともゲッターとセッターを使用してデータにアクセスする目的があるのか​​を判断できませんか?

データ転送オブジェクト ウィキペディアの記事によると:

DTOは、それ自体のデータ(アクセサとミューテータ)の格納と取得を除いて、動作はありません。 DTOは、テストを必要とするビジネスロジックを含むべきではない単純なオブジェクトです。

DTOのインスタンス変数については、パブリックアクセスが正当化されるようです。

これが私が取り組んでいる例です:

Ivars with public access modifier:

class ServerContext
{
    public String Host;
    public String user;
    public String password;
    public int port;

    ServerContext(String Host, String user, String password, int port) {
        this.Host = Host;
        this.user = user;
        this.password = password;
        this.port = port;
    }
}

プライベートアクセス修飾子:

class ServerContext
{
    private String Host;
    private String user;
    private String password;
    private int port;

    ServerContext(String Host, String user, String password, int port) {
        setHost(Host);
        setUser(user);
        setPassword(password);
        setPort(port);
    }

    public String getHost() {
        return Host;
    }

    public void setHost(String Host) {
        this.Host = Host;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getUser() {
        return user;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }
}

EDIT:これらはivarをプライベートに保つための有効な引数である可能性があります:

  1. 後でDTOをリファクタリングして機能性を高める可能性はありますか?

  2. DTOと通常のオブジェクト間で実装の一貫性を保ちたいですか?

3
Korey Hinton

素人の言葉で。

パブリックインスタンス変数はカプセル化に違反しています。

その際、クライアントコードはインスタンス変数の名前に結合されます

クライアントコードは内部で何にも結合されるべきではありません。

内部の事柄は将来変更される可能性があります。

外部インターフェイス(コントラクト)は、変更された内部の影響を受けません。

ゲッターとセッターを手動で記述したくない場合は、IDEを使用してください。

また、ゲッターとセッターを使用すると、ビルダーパターンを使用して、100パラメーターコンストラクターなしでオブジェクトのインスタンスを構築および「構築」できます。

動作がないクラスは、カプセル化に違反できるという意味ではありません。また、将来そのような行動が起こらないという意味でもありません。

1

データ転送オブジェクトを作成していますが、インスタンス変数へのパブリックアクセスを許可する方が良いのか、データにアクセスするためにゲッターとセッターを使用する目的があるのか​​を判断できませんか?

プロパティはrenamedのみです。 get/setメソッドは非推奨になり、検証ルールを適用してコード化し、データをさまざまなタイプに変換できます。あなたがそうしない場合必要これらのものは時間を無駄にしないでください。

DTOは、それ自体のデータ(アクセサとミューテータ)の保存と取得を除いて、何の動作もしません。 DTOは、テストを必要とするビジネスロジックを含むべきではない単純なオブジェクトです。

プロパティの設定/取得メソッドは、動作やビジネスロジックではありません。これらは、スコープを制御するためのアクセスメソッドと、間隔状態へのアクセスにすぎません。クラスは引き続きget/setメソッドを持つDTOです。

DTOのインスタンス変数に対してパブリックアクセスが正当化されるようです。

プロパティへのパブリックアクセスが悪いことだった場合。 Javaには、プロパティのpublicキーワードはありません。プロパティへの読み取り/書き込みアクセス権を持つコードでオブジェクトが正常に機能する場合、1行のコードで大量のget/setメソッドを追加するのはなぜですか。

一方、読み取り専用が必要な場合は、getメソッドを作成します。

2
Reactgular

これらのオブジェクトがどのように使用されるかは少し異なりますが、通常はパブリックな可視性で十分です(または、現代の言語での呼び出し方法-プロパティ)。ただし、Javaであるため、フレームワークを作成でき、値を取得および設定するメソッドが必要です。 (setAttribute()、getAttribute())。オブジェクトメンバーにアクセスするための特別なメソッドが必要なフレームワークを使用しない場合は、パブリックフィールドを使用します。もちろん、より多くのコード行を記述する必要がある場合は、値の設定/取得用に追加のコードを生成する方が適しています。

1
Dainius