2016-12-27 4 views
0

のようなutilがあります。これには準備と呼び出しのすべてのリクエスト(私は簡単にリクエストを管理したい)が含まれています。例:utilクラスを置き換えるベストパターン

public void reqLogin(String emailAddress, String password) { 
    JsonRequestBody parameters = new JsonRequestBody(); 
    parameters.put(USER_NAME, emailAddress); 
    parameters.put(PASSWORD, password); 
    mService.login(parameters.createRequestBody()); 
} 
public void reqRegister(LocationWrapper location) { 
    JsonRequestBody jsonRequestBody = new JsonRequestBody(); 
    jsonRequestBody.put(DEVICE_TOKEN, "myToken"); 
    jsonRequestBody.put(DEVICE_TOKEN_TYPE, "type"); 
    mService.register(jsonRequestBody.createRequestBody()); 
} 

... 

しかし、この設計の問題はLoginFragmentに私はRegister requestを呼び出すことができ、かつRegisterFragmentに、私はLogin requestを呼び出すことができるということです。だから、このutilクラスを作成するのは悪い解決策ですか?私のissueを解決するパターンはありますか?

答えて

2

このutilクラスを作成するのは悪い解決策ですか?

Utilクラスは、他のクラスに処理を委任しません。彼らは入力を処理し、計算を行い、結果を返します。あなたの例では、utilからサービスクラスにタスクを委任しています。それはちょうど正しくないです。代わりに、サービスクラスはutilメソッドを呼び出す必要があります。

そして、Utilsはビジネスロジックを持つべきではありません。 Mathクラスを見てください。

+0

ありがとうございます、あなたの答えは私にクリアされます。しかし、クラスが@Lebedevsdのような 'util'ではないとすれば、私は自分の問題をどのように解決するのかを教えてください。私はすべての要求を1クラスにまとめたいと思っています。 – NamNH

0

解決策の一つは、あなたのクラスの2つの異なるインタフェースが考えられます。

class RequestManager implemets LoginRequest, RegistrationRequest{ 
    @Override //method from LoginRequest 
    public void reqLogin(String emailAddress, String password) { 
     JsonRequestBody parameters = new JsonRequestBody(); 
     parameters.put(USER_NAME, emailAddress); 
     parameters.put(PASSWORD, password); 
     mService.login(parameters.createRequestBody()); 
    } 
    @Override //method from RegistrationRequest 
    public void reqRegister(LocationWrapper location) { 
     JsonRequestBody jsonRequestBody = new JsonRequestBody(); 
     jsonRequestBody.put(DEVICE_TOKEN, "myToken"); 
     jsonRequestBody.put(DEVICE_TOKEN_TYPE, "type"); 
     mService.register(jsonRequestBody.createRequestBody()); 
    } 
} 

他のソリューションは、ログインして登録を行うだけで2つの別々のクラスである可能性があります。

このクラスはUtilsクラスではなく、ネットワークプロセッサやリクエストマネージャのようなものです。

+0

返信いただきありがとうございますが、多くのインターフェイスが使用されているとうまくいきません。 – NamNH

+0

@JohnSteveなぜあなたにはうまくいかないのか説明できますか?異なるクラスの中では、あなたのオブジェクトはあなたが割り当てたインターフェイスの正確なインスタンスのようにしか動作しません。私は、1つのクラスの要求に関するすべての機能を保持し、その一部だけをクライアントに表示するのが最善の選択だと考えています。 – Lebedevsd

+0

@JohnSteveその他のオプションは、RequestManager.provideLoginRequestManager()を呼び出すことで、RequestManagerのサブクラスを作成し、内部クラスになります(RequestManagerのすべてのコンテキストは可視ですが、他のクラスでマスクされます) – Lebedevsd

1

GodObjectアンチパターンを避けるには、たとえばAPIコールを60回受けた後にCommandというデザインパターンを使用できます。

interface APIOperation { 
    void execute(); 
} 

class LoginAPIOperation implements APIOperation { 
    private final String mEmail, mPass; 

    public LoginAPIOperation(String emailAddress, String password) { 
     mEmail = emailAddress; 
     mPass = password; 
    } 

    public void execute() { 
     JsonRequestBody parameters = new JsonRequestBody(); 
     parameters.put(USER_NAME, mEmail); 
     parameters.put(PASSWORD, mPass); 
     mService.login(parameters.createRequestBody()); 
    } 
} 

new LoginAPIOperation("[email protected]","qwerty").execute(); 

これは別のクラスで再利用できます。

+0

それはよさそうだね! – NamNH

関連する問題