2

コードの設計についていくつか質問があります。これは長いかもしれません。可能な限り短くします。

Q1) 扶養か独立か?

クラスを作成し、必要な機能を追加して、オブジェクトが独自の状態を変更できるようにするか、コントローラー (ビューコントローラーとも呼ばれます) によって変更される状態を変更できるようにします。

コミュニケーションを図る場合は、コード例が最適です。 注: コードの行数を減らしました。http://www.techotopia.com/index.php/An_Overview_of_Objective-C_Object_Oriented_Programmingの元のコード。

とにかく、アカウントのアカウント残高を設定する必要がある場合は、これを行うことをお勧めします。

@interface BankAccount: NSObject
{
    double accountBalance;
    long accountNumber;
}
-(double) getAccountBalance;
-(void) setAccountBalance: (double) x;
@end

// Implementation Section Starts Here

@implementation BankAccount

-(void) setAccountBalance: (double) x
{
    accountBalance = x;
}

-(double) getAccountBalance
{
    return accountBalance;
}
@end

//usage
    BankAccount *account1 = [BankAccount alloc] init];

    [account1 setAccountBalance: 1500.53];

----しかし、私はこのようなコントローラーでそれを書いたと思います:------

@interface BankAccount: NSObject
{
    double accountBalance;
    long accountNumber;
}

import "BankAccount.h"
@interface MeViewController : UIViewController 
-(void)setAccountBalance:(double)x toAccount:(BankAccount *)tempBankAcc;
@end

@implementation myViewController

-(void) setAccountBalance:(double)x toAccount:(BankAccount *)tempBankAcc
{
    tempBankAcc.accountBalance = x;
}

//USAGE
BankAccount *account1 = [BankAccount alloc] init];

[self setAccountBalance(Account1,1500.53)]

@end

アカウントは単なるアカウントであるため、アカウント自体ではなく、AccountBalance を設定するのは私 (meViewController) だと思うからです。これは非常に悪い考えですか?私のアプローチでは、BankAccount はコントローラーを介して/コントローラーを使用してのみ変更できる (依存) ???

Q2) コントローラには何がありますか?

また、コントローラー内に記述されたコードは次の場合にのみ使用する必要があることもどこかで読みました。

ユーザー インタラクションへの応答とビューの更新

これは、コントローラーで次のことを決して行うべきではないことを意味します。

NSUserDefaults との間で読み取りまたは書き込みを行います。シングルトンなので、現在アクティブなコントローラーに関係なく、書き込みが簡単だと思いましたか? 悪いアイデア?applicationDidEnterBackground と applicationWillTerminate にデータ (NSUserDefaults を含む) を保存する必要があることを理解しています。そのため、他の場所 (別のコントローラーなど) に保存するのは悪い考えです。

Q3) 最も一般的に使用する設計パターンと、誤って悪用する設計パターンはどれですか?

シングルトン: 私の理解では、[UIApplication sharedApplication]、[NSNotification defaultCenter] およびその他のシングルトンはすべてのコントローラーを介してアクセスできますが、NSObject サブクラスはどうですか? またはUIViewサブクラス?

また、モデルが更新されたときに NSNotification を使用して他のコントローラーに通知できるようです。いつ使用するか、どのように使用するかの例を教えてもらえますか? おそらく、当初の意図とは異なる属性を持つデータをインポートすると、オブザーバーにアップグレードされたデータモデルが通知される可能性があります。これは、データモデル内でコントローラーに通知する場合の例ですか?

今のところ、質問はこれで十分です。

申し訳ありませんが、私はそれらをすべて頭から追い出さなければなりませんでした:-)

ベン

4

4 に答える 4

2

まず最初に:これを使用しないでください

@interface BankAccount: NSObject
{
    double accountBalance;
    long accountNumber;
}
-(double) getAccountBalance;
-(void) setAccountBalance: (double) x;
@end

ここでは、accountBalanceivar は公開されていますが、非公開である必要があります。

代わりに、次を使用します@property

@interface BankAccount: NSObject
    @property (assign, nonatomic) double accountBalance;
@end

それはセッターを定義します:

- (void)setAccountBalance:(double)accountBalance { ... }

そしてゲッター:

- (double)accountBalance { ... }

およびという名前のプライベートインスタンス変数 (ivar)_accountBalanceです。

その後、実装で以下を使用できます。

@synthesize accountBalance;

これにより、次のようにセッター/ゲッターが自動的に作成されます。

- (void)setAccountBalance:(double)accountBalance {
    _accountBalance = accountBalance;
}

- (double)accountBalance {
    return _accountBalance;
}
于 2012-10-03T06:55:19.527 に答える
1

Q1 オブジェクト自体からすべてのビジネス ロジックを取り除くと、それは単なる浅いコンテナ オブジェクトにすぎません。さらに、使用するすべてのコントローラーでそのロジックを複製する必要があります。ビジネス ロジックはビジネス オブジェクトに入ります。

具体的な例では、コントローラーのメソッドは、呼び出しをオブジェクト自体に委任するだけです (実際、ここでプロパティを使用する場合は同じメソッドを呼び出します)。したがって、あなたは何も得られませんでした。コントローラーがオブジェクトを呼び出すだけでなく、さらにデータを更新する場合は、コントローラーにそのメソッドを含めても問題ない場合があります。ここでの良いヒントの 1 つは、コントローラーが独自のインスタンス変数を使用しないことです。簡単にクラスメソッドになる可能性があります。コードの匂いです。

Q2 基本的に、NSUserDefaults にアクセスするには、アプリケーション レベル、ビュー コントローラー レベル、またはビュー レベルの 3 つの選択肢があります。

最悪のケースはビュー レベルです。ビューはあらゆるコンテキストで機能し、好きなように構成できる必要があり、外部の魔法に依存するべきではありません。これにより、(他のアプリだけでなく、同じアプリ内でも)再利用性が低下します。

ビュー コントローラ レベルでデフォルトにアクセスすることは、多くの場合問題ありません。特に、シングルトンの役割を担う場合は特にそうです。つまり、再生画面と設定画面が 1 つしかない場合、それぞれが簡単にデフォルトと対話する可能性があります。同じクラスの複数のインスタンスを別々に構成する可能性がある場合、これは面倒で悪臭を放ってそれらを「個別化」する回避策になります。

これは、デフォルトのアクセスをビュー コントローラの外部に配置する場所です。これは、最もエレガントで柔軟なアプローチですが、必要でない場合もあります。

再利用性は、予想よりも早く実現する可能性があります。つまり、2 つ目のテキスト エディター ウィンドウ (別のフォントが表示される場合と表示されない場合があります)、2 つ目の設定画面 (つまり、ポップオーバー)、ボード ゲームの 2 つ目のプレイ画面などを開きます。

Q3 シングルトン自体が悪いとは思いません。ただし、かなりの値札が付いています。グローバル変数と同様に、初期段階では便利です。

彼らはすぐに非常に高価になります。所有権はなく、すべてが共有され、そのオブジェクトの他のユーザーに影響を与えずに少しでも変更する機会はありません。シングルトンも常に必要になるため、シングルトンに依存するオブジェクトの再利用性は低くなります。私はほとんどの場合、それらを避ける傾向があります。そして、コードにそれらのいずれかがある場合はいつでも、それらを取り除くことは良い決断でした.

通知については、システム レベルでの通信用に設計されています。通常のアプリケーション ロジックや通信のために悪用すべきではありません。これは、システム レベルのイベントのブロードキャストです。それらをオブジェクト通信の代わりに使用する場合、これは地獄への確実な方法です。これにより、コードからすべてのロジックが取り除かれ、責任あるコードを構築する方法がありません。

于 2012-10-03T07:47:26.080 に答える
1

Q1) モデル層オブジェクト、特に相互作用して変化するものは、相互作用のルールの知識を表すだけでなく、自身の内部表現にも責任を持つべきです。銀行口座については、あなたが提示した両方のアプローチが間違っていると思います。特に 2 つ目は、アカウントから状態を更新する責任さえも実際に取っているためです。setBalanceしかし、最初のものは、現実の世界では意味をなさないメソッドを提供するだけだからです。そのアカウントを使用する人は誰でも、送金、引き出し、預金、利息などのすべてのロジックを処理する必要があります。本当に、銀行口座にはメソッドが必要ですdeposit withdraw balanceこのようにして、これらの相互作用が発生するルールとロジックを表すことができます。この場合、これが実際の生活でどのように機能するかを描くことが役に立ちます。

Q2) これの多くは、アプリの設定方法によって異なります。単純なアプリのモデル レイヤーは、単なる plist またはNSUserDefaultsいくつかのNSDictionaryインスタンスである場合があります。その場合、View Controller と対話させたくないかもしれませんが、おそらくデータ コントローラー オブジェクトです。しかし、そのようなモデルと通信するビュー コントローラーを使用することで、問題を解決できる可能性があります。ただし、物事がより複雑になると、確実に懸念事項を分離し、コントローラー オブジェクトをデータ モデルに近づけるか、相互作用のルールを提供するより洗練されたモデルを用意する必要があります。個人的には、すべてのビュー コントローラーが NSUserDefaults をロードすることは避けたいと思います。それを処理できる単一のデータ コントローラー クラスを作成し、必要に応じてインスタンス化することができます。

Q3) ここに 2 つの質問があります。「すべてのコントローラーにアクセス可能」とはどういう意味かわかりません。しかし、NSNotification は正しく使えば非常に便利です。3 つのビュー コントローラーがあり、すべてが銀行口座の異なるビューを調整しているとします。1 つは元帳、もう 1 つは円グラフ、もう 1 つは予算計算機です。アプリがインターネットから銀行口座の情報を更新するリクエストを行うと、そのリクエストが戻ってきたときに、これら 3 つのビュー コントローラーすべてに一度に通知し、それに応じてビューを更新できます。何かが起こったことを知ることに関心のあるオブジェクトが複数ある場合はいつでも、実際に使用されます。

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-10-03T07:08:17.323 に答える
0

MVC に関するスタンフォード大学の講義を読んでください。そこでは多くの答えが見つかると思いますhttp://www.stanford.edu/class/cs193p/cgi-bin/drupal/node/205

于 2012-10-03T06:56:41.760 に答える