web-dev-qa-db-ja.com

Objective-Cでステートレスメソッドをまとめながら、それらをどのように定義しますか?

ステートレスな方法がいくつかあります。

loginWithEmail: password: completion:
signUpWithEmail: password: completion:
resetPasswordForUsername: completion:

現在私がしていることは、これらのステートレスメソッドを保持するクラスを作成することです。

@interface KGAccountService : NSObject

+ (void)//method1
+ (void)//method2
+ (void)//method3

@end

次に、ユーザーがログインに使用しているViewControllerなどの場所からメソッドを呼び出します。

[KGAccountService loginWithEmail:@"email" password:@"password" completion:{
    // user logged in or error
}];

私の同僚は、クラスがクラスメソッドのみを格納し、いかなる種類の状態も必要としない場合でも、シングルトンパターンを使用して実装し、それを介して呼び出す必要があることを強く主張しています。

@interface KGAccountService : NSObject

+ (instanceType)sharedInstance;
- (void)//method1
- (void)//method2
- (void)//method3

@end

次に:

[[KGAccountService sharedInstance] loginWithEmail:@"email" password:@"password" completion:{
// user logged in or error
}];

シングルトンパターンを実装する必要がなく、同僚が彼の視点を私に伝えることができなかった場合、それを実装する意味がわかりません。私が見逃しているデザインパターンはありますか?ステートレスクラスメソッドを格納するクラスを作成する私の方法は正しいですか?

4
Kris Gellci

関数の名前を長くしたいだけの場合を除いて、ステートレスグローバル関数をクラスメソッドとしてラップする理由はありません...そして、それがやりたいことがすべてである場合は、名前を長くしてください。このため、検討中のアプローチに反対することを強くお勧めします。それは何の役にも立ちません。

同僚の考えとしては、これらの関数へのすべての呼び出しの前に[[KGAccountService sharedInstance] ...(または[[KGAccountService alloc] init] ...)を付ける場合は、関数の名前を付ける以外に何も達成していません。より長いです。

オブジェクトを他のオブジェクトに注入して、別のオブジェクトに簡単に置き換えることができる場合は、同僚のアイデアにいくつかのメリットがあります... sharedInstanceメソッドが不要になることを除いて。わざわざ入れないでください。

そして、@ gnasher729が作ったポイントがあります...これらのメソッドがステートレスであることは正しくないと感じます。それらは、何らかの方法で(関数の名前に基づいて)いくつかの基礎となる状態によって接続されている可能性があります。

2
Daniel T.

まず、同僚に、彼のアプローチの利点は何でしょうかと尋ねてみましたか?私の見解では、シングルトン(および基本的にオブジェクトメソッド)を使用することの唯一の利点は、後でこれらの関数を拡張(またはモック)し、依存するコードの動作を変更できることです。それ。これは、ユニットテストを行う必要がある場合に特に便利です。

@interface KGAccountService : NSObject

+ (instanceType)sharedInstance;
- (void)//method1
- (void)//method2
- (void)//method3

@end

@implementation KGMockedAccountService : KGAccountService

- (void)//overridden method1
- (void)//overridden method2
- (void)//overridden method3

@end

// The account service injected here could be any one implemented above
-(Data *) retrieveUserDataWithAccountService: credentials: completion:

これはあなたの質問に答えていますか?

詳細については、オープンクローズの原理についていくつかの調査を行うことができます。

1
Francis Toth

シングルトンパターンmayが有利です。メソッドはステートレスであると言っても、実装は必ずしもそうではありません。その場合、状態を保持するオブジェクトを持つと便利です。

簡単な例として、loginWithEmail:...はおそらく非同期であり、最初の呼び出しの実行中に別の呼び出しを行う必要はありません。周りに状態がないとそれは難しい。

0
gnasher729