web-dev-qa-db-ja.com

私のルーチンが疎結合であると誤って想定しましたか?

私のSeleniumテスト構造は次のようになります-

データオブジェクトクラス-

public class RegistrationData {

  String firstName = "test first name";
  String lastName = "test last name";

  // Getter Setter Here 
}

Webページで操作を実行するページオブジェクトクラス-

public class RegistrationPage {
   private RegistrationData regData;

   public void setRegistrationData(RegistrationData regData) {
   this.regData = regData();    

   public NewAccountPage fillRegForm() {
     enterFirstName("FirstNameTextBoxLocator", regData.getFirstName);
     enterLastName("LastNameTextBoxLocator", regData.getLastName);
     // Some more fields are filled here
     return NewAccountPage();
   }
}

そして、テストクラスはそれらを次のように使用します-

public class TestRegistration extends SelTestCase {

   @Test
   public void testRegNewUser() {
     RegistrationData regData = new RegistrationData();
     RegistrationPage regPage = New RegistrationPage();
     regPage.setRegistrationData(regData)
     regPage.fillRegForm();
     // Some assertion here
   }
}

今、fillRegFormメソッドは引数を取らないため、fillRegFormメソッドを使用する前にRegistrationPageでRegistrationDataを設定する必要があるにもかかわらず、疎結合の例であると想定できますか?.

6
Tarun

私の知る限り、あなたの例は強い結合と密接に一致しています Wikipediaで定義されているように

強い結合は、依存クラスに、必要な動作を提供する具象クラスへのポインターが直接含まれている場合に発生します。依存関係は、依存クラスの変更を必要とせずに、置換または「署名」を変更することはできません。疎結合は、依存クラスにインターフェイスへのポインタのみが含まれる場合に発生します。 1つ以上の具象クラスによって実装されます。依存クラスの依存関係は、インターフェースによって指定された「契約」に対するものです。実装クラスが提供しなければならないメソッドやプロパティの定義済みリスト。したがって、インターフェースを実装するクラスは、クラスを変更する必要なく、依存クラスの依存関係を満たすことができます。これにより、ソフトウェア設計の拡張性が可能になります。インターフェイスを実装する新しいクラスは、依存クラスを変更することなく、一部またはすべての状況で現在の依存関係を置き換えるように作成できます。新旧のクラスは自由に交換できます。強い結合はこれを許可しません...

上記の定義の観点からコードを見てみましょう:

  • チェック
    従属クラスには、必要な動作を提供する具象クラスへの直接のポインターが含まれています
    あなたの例では、依存クラスはRegistrationPageであり、それに含まれる具象クラスへの直接ポインタはRegistrationData regData
  • チェック
    依存クラスを変更せずに、依存関係を置換したり、その「シグネチャ」を変更したりすることはできません。
    あなたの例では、RegistrationPageクラス以外のソースを使用してデータをRegistrationDataおよび他のメソッドに渡すために、enterFirstNameを変更する必要があります。

素人の言葉で言えば、RegistrationPageRegistrationDataについてかなり多くのことを「知っています」-そのようなクラスが存在することを知っており、このクラスの必須メンバーを知っています。この種類のカップリングは、緩いものではありません。


RegistrationPageクラスで使用するにはRegistrationDataクラスのインターフェイスが必要だと思います。そうではありませんか?

RegistrationDataのインターフェースにより、疎結合になります。あなたがそれを必要とするかどうかに関しては、それは文脈に依存し、そして主にあなたの個人/チームの好みにも依存します。たとえば、 他の回答で説明されています のように、RegistrationDataが単一の実装である場合は、そのようなインターフェイスを使用しないようにする可能性があります。

私は確かに今再設計の提案を求めています。質問に詳細を追加する必要があるかどうか私に知らせてください。

これは、疎結合が正しく解決されているかどうかという元の質問を意味しますか?再設計に関しては、それは別の質問になります。個別に投稿することを検討してください。

6
gnat

短い答え:

つのクラスは強く結合されています。

fillRegForm引数を取らないことは結合の問題であり、疎結合ではありません。

0