1

経験豊富な開発者が手がけたiPhoneアプリを開発しています。私は単なる見習いプログラマーであり、実用的な Objective-C/iOS アプリケーション開発にまだ苦労しています (Java と PHP を独学で学びましたが、objective-c は私にとってこれらのようなものではありません)。

私たちのアプリは、サーバー側の操作に大きく依存し、毎回頻繁に http ポスト要求を行う (ユーザーの場所の追跡、他のユーザーにメッセージを送信するなど)。

このアプリの開発を任されたとき、コード内で、すべての HTTP リクエストが各メソッド内に記述されていることに気付きました。各リクエストは別のスレッドをディスパッチすることによって行われ、それに応じてそれらのリクエストの応答に対して各アクションが記述されました。

例えば

-(void) methodA {  
// Making http request headers...  

// Dispatch another thread  
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);  
dispatch_async(queue, ^{  
  // Send synchronous request and handle the response...  
});

}  

-(void) methodB {  
// Making http request headers...  

// Dispatch another thread  
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT , 0);  
dispatch_async(queue, ^{  
  // Send synchronous request and handle the response...  
});

}  

上記のようなコードは、アプリがサーバーにリクエストを送信する必要があるすべての場所にあります。

なぜ彼は http リクエストを処理するクラスを作成しなかったのか疑問に思っています。
Java では、サーバーに同期要求を行うクラスを作成できます。

public class ClassHttpRequest {
     public int makePost {  
        // Send synchronous request and return result...  
     }  
}  

次に、このクラスのインスタンスを作成し、そのインスタンス メソッド (この場合は makePost) をスレッド内で実行します。

public class methodA {  

   Thread t = new Thread(new Runnable() {  
         public void run() {   
           public ClassHttpRequest requestHandler = new ClassHttpRequest();  
               if (success == requestHandler.makePost()) {  
                   // Handle response...  
               }  
           }  
         }  
     });

    t.start();  
 }  

クラスを作成し、Objective-C で頻繁な http 要求を処理できるようにする際に、パフォーマンスの低下や問題はありますか? それとも、単に「推奨」されていないだけですか?Objective-C では、例外処理に try-catch ステートメントを使用することは、多くのリソースを消費するため、一般的ではないと聞いています。私はいくつかの iOS および Objective-C の本を読んだ (そしてググった) ことはありますが、実際のアプリケーション開発のためのそのような「実用的な」答えを見つけるのは難しく、ほとんどの場合、私のような初心者にとってはややこしいものです。

なぜそのようなクラスを作らなかったのか彼に尋ねなければなりませんが、彼は今不在で連絡が取れませんでした。また、stackoverflow の専門家は、前任者よりもはるかに正確で簡潔なソリューションを提供してくれると信じています。(私はいくつかの質問をしましたが、知りたいことはすでにわかっています。)

前もって感謝します。

4

2 に答える 2

3

オブジェクト指向設計の通常のルールが適用されます。HTTP リクエストを具体的なオブジェクトとして表現することが理にかなっている場合 - 特に、必要であり、そうでなければコピーアンドペーストされるボイラープレート コードがたくさんある場合 - を使用することはおそらく良い考えです。クラス。そうでなければ、必要ありません。この特定のケースでは、標準の非同期システム API (NSURLRequest、NSURLConnection、NSURLDownload など) だけを使用していない理由はありますか?

@try/@catch は定義上、例外処理に使用されるため、必要に応じて使用する必要があります。それらを軽視すると、コードは不必要に興味深い方法で失敗する可能性があります (たとえば、ロックをぶら下げたままにする)、または不必要な程度に失敗する可能性があります (たとえば、特定の操作を単に失敗させるのではなく、完全にクラッシュさせる)。すべきでないことは、それらをフロー制御に使用することです。他の言語とは異なり、Objective-C の例外は、プログラマーのエラー、「不可能な」状態、およびその他のそのようなイベント用です。残念ながら、既存の Objective-C コードの多くは例外に対して安全ではありません。

最近使用する可能性のあるどのランタイムでも特に高価ではありません。@try は非常に安価で、ほとんど無料です。例外がスローされた場合にのみ、重要な作業が行われます。非常に悪い状況 (頻繁ではない) でのみ発生するはずなので、パフォーマンス コストは関係ありません。

于 2012-11-17T08:22:50.097 に答える
1

コードのリファクタリングはバランスの問題です。現在のコードは冗長で少し繰り返していますが、別のクラスにリファクタリングすると、中間 API である新しい間接化が導入されます。SomeNetworkServiceなどのメソッドを使用してクラスを作成できる場合のように、新しい API がまともなセマンティクスを持っている場合は、おそらく価値がありpostStatusますlistItems。インターフェイスは次のように非同期である必要があります。

typedef void (^StatusCompletionBlock)(BOOL success, NSError *error);
- (void) postStatus: (NSString*) status withCompletion: (StatusCompletionBlock) completion;

SomeNetworkServiceこれにより、オブジェクト全体をスタブに置き換えることができるため、コードが読みやすくなり、DRY になり、さらにテストしやすくなります。それは確かにそれだけの価値があります。

余分なメッセージを 1 つ送信することによるパフォーマンス ヒットは、言及する価値はありません。一般的に言えば、人々はパフォーマンスを気にしすぎています。読みやすさのためにパフォーマンスを犠牲にできるのであれば、100 回中 99 回は犠牲にする価値があります。

于 2012-11-17T08:43:48.040 に答える