0

だから私は何かに興味があり、何かに「標準的な」または「良い」コーディング慣行があるかどうかわかりませんでした。たとえば、3つのボタン(Facebook iphoneアプリダッシュボードなど)を備えたホームページがあり、View Controllerを押すとアプリのさまざまな部分に移動し、1つのボタンで、IBActionを次のように関連付けます。

- (IBAction)showSummary:(id)sender {
    SummaryViewController *detailViewController = [[[SummaryViewController alloc] initWithNibName:@"SummaryViewController" bundle:nil] autorelease];
    detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    detailViewController.view.autoresizesSubviews = YES;
    [self.navigationController pushViewController:detailViewController animated:YES];   
}

最初の質問は、アプリを初めて起動したときに、このページを最初に表示したいとします。したがって、viewDidLoadで、このメソッドを呼び出すことができますか

[self showSummary:nil];

または、viewDidLoadに同じコードを含める方がよいでしょう。

これに関する2番目の質問は、リファクタリングです。3つのボタンすべてがviewControllerを作成してスタックにプッシュするときに同じことを行う場合、唯一の違いは初期化するviewControllerです。

例えば

SummaryViewController *detailViewController = [[[SummaryViewController alloc] 

これらのメソッドをリファクタリングする必要がありますか?もしそうなら、それを行うための良い方法は何でしょうか?ありがとう!

4

2 に答える 2

0

質問1:使用するだけのコードを繰り返さないでください[self showSummary:nil];

質問2:コードを繰り返してください。それらは異なるタスクを持つ異なるオブジェクトであるため、それらを分離してください。

于 2012-05-25T15:23:17.513 に答える
0

質問1と2に別々に答えるのではなく、実際に両方の質問に答えるコード設計へのいくつかの変更を提案します。

絶対にviewDidLoadのコードを繰り返さないでください。これは単純な例ですが、コードのコピー/貼り付けは決して良い考えではありません。これを行わない理由の1つは、コードのチャンクにバグを発見した場合、コピー/貼り付けするすべての場所にその変更を適用する必要があることです。それ。たぶん、これをするのにイライラするか、1つの場所を忘れて潜んでいるバグを残すでしょう。コードをコピー/貼り付けしないことを実現する最も簡単な方法は[self showSummary:nil]; 、viewDidLoadのコンテキストから「sender」パラメーターを使用することは意味がないため、単に呼び出すことですが、さらにクリーンなアプローチをお勧めします。

これが私が提案するものです(これは、3つのボタンがすでにbutton1、button2、およびbutton3として設定されていることを前提としています。これらの変数を独自のものに置き換えます):

- (IBAction)showSummary:(id)sender {
    UIViewController *detailViewController = nil;
    if (sender == self.button1) {
        detailViewController = [[[SummaryViewController alloc] initWithNibName:@"SummaryViewController" bundle:nil] autorelease];
    } else if (sender == self.button2) {
        detailViewController = [[[SummaryViewController2 alloc] initWithNibName:@"SummaryViewController2" bundle:nil] autorelease];
    } else if (sender == self.button3) {
        detailViewController = [[[SummaryViewController3 alloc] initWithNibName:@"SummaryViewController3" bundle:nil] autorelease];
    }

    //You can accomplish these two lines in the nib file.  Do it there unless there's a reason to change these separately per controller, it simplifies the code
    //detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    //detailViewController.view.autoresizesSubviews = YES;
    [self.navigationController pushViewController:detailViewController animated:YES];   
}

次に、viewDidLoadから、アクションをシミュレートするボタンを指定するメソッドを呼び出します。

- (viewDidLoad) {
    [self showSummary:self.button1];
}

サードパーティがあなたのコードを見ているので、なぜあなたがそのメソッドにボタンを渡しているのか疑問に思っているので、それは少し読めないと主張する人もいます。代わりに、showSummaryを、アクション(ボタンまたはその他のフラグ)を変換するロジックと実際にアクションを実行する(ナビゲーションコントローラーを押す)ロジックを分離する追加のメソッドにリファクタリングすることを検討できます。

于 2012-05-25T16:32:30.463 に答える