0

ここに私のジレンマがあります。私はレガシー コードを扱っており、コード ベースの膨大な量の冗長性を単純化して削減しようとしています。これが問題の核心です。2 つの非常によく似たクラスをスーパークラス/サブクラスの関係に統合しようとしています。1 つは NSObject のサブクラスで、もう 1 つは NSManagedObject のサブクラスです。

InventoryItems.h という変数のみを含むクラスがあります。NSObject のサブクラスです。

@property (nonatomic, retain) NSString * desc;
@property (nonatomic, retain) NSString * locationInventoryId;
...

InventoryItems.m

@synthesize desc;
@synthesize locationInventoryId;
...

NSManagedObject のサブクラスである FavoriteInventoryItems.h と呼ばれる別のクラスがあります。これには、InventoryItems とまったく同じ変数が含まれており、変数が 1 つ追加されています。

FavoriteInventoryItems.h

@property (nonatomic, strong) NSString * desc;
@property (nonatomic, strong) NSString * locationInventoryId;
@property (nonatomic, strong) NSString * dateAddedAsFav;
....

FavoriteInventoryItems.m

@dynamic desc;
@dynamic locationInventoryId;
@dynamic dateAddedAsFav;
...

InventoryItems を NSManagedObject のサブクラスにしてから、FavoriteInventoryItems を InventoryItems のサブクラスにすることで、うまく機能させることができます。動作しますが、次のメッセージが表示されます。

CoreData: エラー: NSManagedObject クラス 'InventoryItems' で指定された初期化子を呼び出せませんでした

私の解決策は確かに、否定的な結果をもたらす可能性のあるハックです。

コードが次のように似ている場所が複数あります。

if (InventoryItem)
    ...many lines of code here
else if(FavoriteInventoryItem)
    ...exact same code as above based on favorites

これらのクラスの両方をスーパークラス/サブクラスの関係に統合する方法が他にわかりません。または、継承を伴わないこの問題を処理するより良い方法はありますか? 何か案は?

4

1 に答える 1

3

プロトコルを使用して、クラス間で共通するものを指定し、「使用」コードをプロトコルに汎用にするようにしてください。

プロトコルの仕様は重要な部分です。実装は既に 2 つのクラスに存在します。仕様には、2 つのクラス間で共通のメソッド (またはプロパティ) がリストされます。次に、複製されたコードで、次のように言う代わりに:

InventoryItem *item = ...

また

FavoriteInventoryItem *item = ...

あなたは言うでしょう:

id < InventoryItem > item = ...

より良い名前がわからないため、名前を複製していますが、プロトコルは次のように定義されています。

@protocol InventoryItem < NSObject >

@property (nonatomic, strong) NSString * desc;
@property (nonatomic, strong) NSString * locationInventoryId;

@end

次に、プロトコルを使用するコードは、基になるクラスが何であるかを気にしません。プロトコルが提供するものを気にするだけです。

item.desc = @"Teddies";
item.locationInventoryId = ...
于 2013-06-10T16:20:38.683 に答える