2012-03-12 8 views
0

私はまだオブジェクト指向の世界で何が行われるべきかということを頭の中に入れようとしています。カプセル化を最大限に活用する方法がわかりません。具体的には、私はプロジェクトでいくつかのクラスで使用する小さなコードをたくさん持っています。例:アプリ内のクラス間でメソッドを共有するためのベストプラクティスは何ですか?

+ (NSString *)getFormattedDate; 
+ (NSString *)getResultsFilePath; 
+ (NSError *)removeFileFromCache:(NSString *)fileName; 

これらは、私が複数のクラスで使用するすべての3-5行のメソッドです。私の標準的な練習は、これらのスニペットをUtility.incファイルに入れて、必要なときに呼び出すことでした。それはオブジェクト指向の世界では適切ですか、各クラスは自己完結型であるべきですか?それが適切であれば、メソッドを使用する各クラスのシングルトンまたは通常のクラスファイルと[[Utilities alloc] init]にコードを入れますか?

+3

あなたは、これらのメソッドが何をするかについて詳しく説明することはできますか?彼らは内部状態を持っていますか? 'getFormattedDate'と' getResultsFilePath'の名前を推測するだけで、メソッド(クラスには関連付けられていない、つまり)ではなく関数である可能性があります。 –

+0

私は専門用語についてはわかりませんが、Obj-Cのすべての「関数」はメソッドと呼ばれていると思いました。これらはクラスメソッドであり、ファイルに対して何かを行う。録音を削除するか、電子メール用のファイルを作成するか、文字列を返します。 Cacheディレクトリの場所。どのユーティリティメソッドも、プロジェクト内のどのオブジェクトについても知る必要はありません。 – JScarry

+0

いいえ、関数とメソッドは非常に似ていますが、メソッドが属し、クラスのデータを操作する重要な違いがあります。一般に、「手続き」(この場合は一般的な用語として、メソッドと関数の両方を扱うことができます)がクラスのデータを操作する必要がない場合は、「普通の」関数として使用する方がよいでしょう。それは「普通の」Cと同じように見えます。 –

答えて

0

お返事ありがとうございます。私はこれが正しいことをやっているのかどうかはわかりませんが、これは私が今投稿したプロジェクトでやったことです。

私はユーティリティメソッドとグローバルの2つのクラスを作成しました。 Utilitiesクラスのメソッドは、ファイルと定数またはグローバルで動作するため、すべてのクラスメソッドです。それから私はグローバル変数のためのシングルトンを作った。 .pchファイルにグローバル定数がすべてあります。また.pchファイルには、次の2行のコードを入れて、ユーティリティとグローバルをどこでも利用できるようにしています。

// File for utilities like file delete, find Documents file 
    #import "Utilities.h" 
    #import "Globals.h" 

このメソッドへのアクセスは簡単です。次に、メールのHTMLヘッダーを生成する両方のメソッドを呼び出す例を示します。

NSString *gameNameHeader = [NSString stringWithFormat:@"<p>&nbsp</p><h1>%@ Results</h1><h2>%@%@</h2>",GAME_NAME_TITLE,[Utilities formattedClientName], [Utilities formattedDate]]; 

誰でも使用できますが、ここには現在のバージョンのコードがあります。 (フォーマットには申し訳ありませんが、私はウィキが協力するように見えません)。

@interface Utilities : NSObject { 


} 

+ (NSString *)formattedDate; 
+ (NSString *)formattedClientName; 

+ (NSString *)cachedResultsFilePath; 
+ (NSString *)cachedResultsFileContents; 
+ (NSString *)resultsFileName; 
+ (NSError *)removeFileFromCache:(NSString *)fileName; 

+ (NSString *)applicationCachesDirectory; 
+ (NSString *)applicationDocumentsDirectory; 
+ (NSString *)applicationLibraryDirectory; 

+ (NSError *)copyCachedResultsToFile; 
@end 



    #import "Utilities.h" 
@implementation Utilities { 

    } 

+ (NSString *)formattedDate { 
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd"]; 
    NSString *todaysDate = [dateFormatter stringFromDate:[NSDate date]]; 
    return todaysDate; 
} 

+ (NSString *)formattedClientName { 
    NSString *client = [NSString stringWithFormat:@" "]; 
    if([Globals sharedInstance].currentClient) client = [NSString stringWithFormat:@" %@ ",[Globals sharedInstance].currentClient]; 
    return client; 
} 

+ (NSString *)cachedResultsFilePath { 
    NSString *resultsFilePath = [[self applicationCachesDirectory] stringByAppendingPathComponent:@"Results.txt"]; 
    return resultsFilePath; 
} 

+ (NSString *)cachedResultsFileContents { 
    NSStringEncoding encoding; NSError* error = nil; 
    NSString *resultsText = [NSString stringWithContentsOfFile:[self cachedResultsFilePath] usedEncoding:&encoding error:&error]; 
    return resultsText; 
} 

+ (NSString *)resultsFileName { 
    return [NSString stringWithFormat:@"%@ Results%@%@.html",GAME_NAME_TITLE,[self formattedClientName],[self formattedDate] ]; 

} 

+ (NSError *)removeFileFromCache:(NSString *)fileName { 
    NSError *error = nil; 
    NSFileManager *localFileManager=[[NSFileManager alloc] init]; 
    NSString *fullPath = [NSString stringWithFormat:@"%@/%@", [self applicationCachesDirectory],fileName]; 
    [localFileManager removeItemAtPath: fullPath error:&error ]; 
    return error; 
} 

+ (NSString *)applicationCachesDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; 
} 

+ (NSString *)applicationDocumentsDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

+ (NSString *)applicationLibraryDirectory { 

    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
} 

+ (NSError *)copyCachedResultsToFile { 
    // Grab the header and footer and put it around the cached data 
    NSStringEncoding encoding; NSError *error = nil; 
    NSString *htmlHeaderTextPath = [[NSBundle mainBundle] pathForResource:@"HTML_header" ofType:@"html" ]; 
    NSString *htmlHeaderText = [NSString stringWithContentsOfFile:htmlHeaderTextPath usedEncoding:&encoding error:&error]; 

    NSString *cachedResultsText = [NSString stringWithContentsOfFile:[self cachedResultsFilePath] usedEncoding:&encoding error:&error]; 
    // Write the results to a file if there are any 
    if (cachedResultsText) { 
     NSString *htmlFooterTextPath = [[NSBundle mainBundle] pathForResource:@"HTML_footer" ofType:@"html" ]; 
     NSString *htmlFooterText = [NSString stringWithContentsOfFile:htmlFooterTextPath usedEncoding:&encoding error:&error]; 

     NSString *gameNameHeader = [NSString stringWithFormat:@"<h1>%@ Results for%@%@</h1>",GAME_NAME_TITLE,[self formattedClientName],[self formattedDate] ]; 
     NSString *tempStringP1 = [htmlHeaderText stringByAppendingString:gameNameHeader]; 
     NSString *tempStringP2 = [tempStringP1 stringByAppendingString:cachedResultsText]; 

     NSString *formattedTextForPrinting = [tempStringP2 stringByAppendingString:htmlFooterText]; 
     NSString *resultsFilePath = [ [Utilities applicationDocumentsDirectory] stringByAppendingPathComponent:[self resultsFileName] ]; 
     if (!([[NSFileManager defaultManager] fileExistsAtPath:resultsFilePath])) { 
      if (! ([[NSFileManager defaultManager] createFileAtPath:resultsFilePath contents:nil attributes:nil])) { 
       NSLog(@"Error was code: %d - message: %s", errno, strerror(errno)); 
      } 
     } 
     NSFileHandle *fileHandler = [NSFileHandle fileHandleForUpdatingAtPath:resultsFilePath]; 
     [fileHandler writeData:[formattedTextForPrinting dataUsingEncoding:NSUTF8StringEncoding]]; 
     [fileHandler closeFile]; 

    } 
    return error; 
} 
@end 

グローバルなシングルトンです。おそらくスレッドセーフではありませんが、今は気にしません。

@interface Globals : NSObject { 


} 
@property (nonatomic, strong) NSString *currentClient; 
@property (nonatomic, strong) NSString *showmePict; 
@property BOOL checkBoxes; 

+ (Globals *)sharedInstance; 

- (void)resetClient; 

@end 

@implementationグローバル{

}

static Globals *singleton = nil; 
@synthesize currentClient = _currentClient; 
@synthesize showmePict = _showmePict; 
@synthesize checkBoxes = _checkBoxes; 

+(Globals *) sharedInstance { 

    NSLog (@"sharedInstance of Globals called."); 

    if (nil != singleton) return singleton; 
    static dispatch_once_t pred;  // lock 
    dispatch_once(&pred, ^{    // this code is at most once 
     singleton = [[Globals alloc] init]; 
    }); 

    return singleton; 

} 

- (void)resetClient { 
    self.currentClient = nil; 
} 


@end 
0

1つしか作成されずに他のクラスで使用されるユートリムシングルトンを作成します。

2

Categoriesをご覧ください。あなたが与えた例については、これらは、あなた自身のクラスのいくつかで使用される特定のクラスのオブジェクトに関連するメソッドです。カテゴリを使用すると、頻繁に使用されるこれらのメソッドを、共通の要素に関連付けることができます。

関連する問題