6

たくさんのフィールドを持つクラスがあり、すべてプライベートです (サブクラスは保護されたゲッターでいくつかにアクセスします)。これらのフィールドのほとんどを別のクラスのメソッドに渡し、それらをフォーマットして出力を生成する必要があります。それらをすべて渡すフィールドを持つクラスにメソッドがあっても大丈夫ですか? それとも、これらの状況は、2 つのクラスの間に他の関係を実装する必要があることを示唆していますか?

詳細情報: クラス A は従業員を表し、クラス B の唯一の責任は、プログラムの出力をフォーマットすることです。

4

7 に答える 7

6

次のことを行ってもよろしいですか?

public class A {
 private B myB = new B();
 private String myUnformattedName = "some information";

 public String getFormattedInfo() {
   return myB.formatInfo(myUnformattedName);
 }
}

それはまったく問題ありません。

フィールドをプライベートとしてマークすることは、それを含むクラスのみがそれにアクセスできることを意味します...

何か他のことを意味する場合は、質問にコードを挿入して、人々にコンテキストを提供することをお勧めします


ここで値を設定する方法はありませんが、フォーマッタを呼び出す 2 つの異なる方法を見ることができます。パラメータ リストが 3 つまたは 4 つの項目を超えると、読みにくくなります。

この例では、A をフォーマッタに渡し、B に読み取らせたい値ごとに get メソッドを用意します。

public class A {
 private B myB = new B();
 private String myUnformattedName = "some information";
 private String myUnformattedNameOne = "some information";
 private String myUnformattedNameTwo = "some information";
 private String myUnformattedNameThree = "some information";
 private String myUnformattedNameFour = "some information";
 private String myUnformattedNameFive = "some information";
 private String myUnformattedNameSix = "some information";

 public String getFormattedInfo() {
   //pass the object itself and use get methods
   return myB.formatInfo(this); 
 }

 public String getFormattedInfoLong() {
   //this is OK but gets difficult to read the longer the 
   //parameter list gets
   return myB.formatInfo(myUnformattedName, myUnformattedNameOne, 
      myUnformattedTwo, myUnformattedNameThree, myUnformattedNameFour,
      myUnformattedNameFive, myUnformattedNameSix); 
 }

 //getters
 public String getUnformattedName() {
    return myUnformattedName;
 }

 public String getUnformattedNameOne() {
    return myUnformattedNameOne;
 }

 //etc

}
于 2013-04-09T10:32:15.970 に答える
5

私は実際に Visitor パターンを提案します。

クラス A には、次のように明確に定義された public メソッドを持つビジターを受け入れるメソッドがあります。

まず、訪問されたクラスは、明確に定義されたインターフェースを持ついくつかのクラスを許可し、それ自身のデータを外部に渡しません。

public class A {
    int data;

    public void getFormattedBy(Formatter f) {
       f.format(data);
    }
}

複数のフォーマッタを使用できるビジターのインターフェース

public interface Formatter {
    void format (int data);
}

訪問したクラスに許可されるフォーマッタ。

public class B implements Formatter {
    public void format(int data) {
        // do the formatting and printing
    }
}

この方法では、単に呼び出します

A a = new A();
B b = new B(); // the formatter
a.getFormattedBy(b);

最終的に、ビジター (フォーマッター) は、ビジターを許可する多くのクラスにアクセスでき (おそらく独自のインターフェースを実装することによって)、訪問したクラスには多くのビジターがアクセスできます。

于 2013-04-09T10:34:51.203 に答える
2

それらがプリミティブ型であるか、不変である限り、それらを渡してもまったく問題ないと思います。

想定されていないときに呼び出し先がそれらを変更できる場合は、設計上の問題があります。

于 2013-04-09T10:30:57.783 に答える
1

クラス B が変更しない限り、問題ありません。クラスがそうする場合は、不変のインスタンスをそれに渡します。

于 2013-04-09T10:30:46.297 に答える
1

クラス B をユーティリティ クラスにして、その上にのみ静的メソッドを含めることができます。

次に、クラス A 内で次のような sth を使用できます。

public String formatMyVariables() {

return B.format(a,b,c,d);

}

あなたが言及した出力は文字列だと思いますが、実際には何でもかまいません。

于 2013-04-09T10:31:16.583 に答える
1

Employeeフィールドがプリミティブ値 ( intboolean) または不変値 (Stringたとえば) である場合は、他のクラスに気にせずに読み取らせることができることを考慮する必要があります。

でフィールドを保護することは、 APIprivateを介してのみアクセスできるオブジェクトの内部作業を公開しない方法です。publicただし、クラスが実際にビジネス オブジェクト (つまり、エンティティを識別する値のグループ) を表している場合は、他のユーザーに内部フィールドを読み取らせても完全に安全です。

于 2013-04-09T10:31:43.057 に答える
-1

データを転送する最良の方法は、DTO オブジェクトです。

これらのオブジェクトには、転送するデータとしてインスタンス変数 (セッターとゲッターを含む) のみが含まれています。

このクラスには動作があってはなりません

たとえば、従業員データを渡したい場合は、次のようにします

class EmployeeBean
{
private String name;
private String age;

public void setName(String n)
{
name=n;
}

public String getName()
{
return name;
}


public void setAge(int n)
{
age=n;
}

public int getAge()
{
return age;
}

}

EmployeeBean クラスを作成し、そのインスタンス変数にデータを入力してから、このオブジェクトをパラメーターとして他のクラスのメソッドに渡し、そこでフォーマットすることができます。

于 2013-04-09T10:32:02.200 に答える