Mes débuts avec les objets

Bonjour à  tous,


 


Je suis de retour pour vous montrez le projet réalisé en Objet, je commence tous juste avec l'objet, et je trouve mon code un peu bizarre, je me demande si c'est la bonne méthode.



//
// MyFileClass.h
//


#import <Foundation/Foundation.h>

@interface MyFileClass : NSObject
{
// Déclaration des attributs associés à  MyFileClass
NSString *path_file;
NSArray *contentFile;

}

// Déclaration des accesseurs
@property(nonatomic, retain) NSString *path_file;
@property(nonatomic, retain) NSArray *contentFile;




// Déclaration des méthodes associées à  la MyFileClass
-(NSString*)userScanPath: (int)fileNumber;
-(BOOL)checkPath: (NSString*)filePath;
-(NSArray*)pathFileToStringArray:(NSString*)path;
-(NSMutableDictionary*)chearchOfOccur:(NSArray*)array;



@end



//
// MyFileClass.m
//

#import "MyFileClass.h"


@implementation MyFileClass

@synthesize path_file;

-(NSString*)userScanPath: (int)fileNumber
{
char filePath[200];
NSString *charToStringPath;

printf("Please enter the path to your file n° %i\n", fileNumber);
scanf("%s", filePath);

charToStringPath = [NSString stringWithUTF8String:filePath];

return (charToStringPath);
}

-(NSArray*)pathFileToStringArray:(NSString*)path
{
NSURL *pathUrl = [NSURL fileURLWithPath:path];
NSString *myFile = [NSString stringWithContentsOfURL:pathUrl encoding:NSUTF8StringEncoding error:nil];
NSArray *myFileByLine = [myFile componentsSeparatedByString:@\n];
return (myFileByLine);

}

-(BOOL)checkPath:(NSString*)filePath
{
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL isDir;
BOOL exist =[fileManager fileExistsAtPath:filePath isDirectory:&isDir];
BOOL writable = [fileManager isWritableFileAtPath:filePath];

if (exist)
{
NSLog(@File exists);
if (isDir)
{
NSLog(@File is a directory);
return (NO);
}
}
else
{
NSLog(@File doesn't exists);
return (NO);
}

if (writable)
NSLog (@File is writable);
else
NSLog (@File is read only);

return (YES);
}

-(NSMutableDictionary*)chearchOfOccur:(NSArray*)array
{
NSMutableDictionary *result = [NSMutableDictionary new];

for (NSString *eachLine in array)
{
NSArray *eachItem = [eachLine componentsSeparatedByString:@ :];

if ([eachLine containsString:@.])
{
NSArray *letters = [eachItem[0] componentsSeparatedByString:@.];
for (NSString* letter in letters)
{
int value = [result[letter] intValue];
value += [eachItem[1] intValue];
result[letter] = @(value);
}
}
else
{
NSArray *letters = [eachItem[0] componentsSeparatedByString:@/];
for (NSString* letter in letters)
{
int value = [result[letter] intValue];
value += [eachItem[1] intValue];
result[letter] = @(value);
}
}
}
return (result);
}

@end



//
// main.m
//

#import "MyFileClass.h"
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
@autoreleasepool
{
MyFileClass *file1 = [[MyFileClass alloc]init];
MyFileClass *file2 = [[MyFileClass alloc]init];

file1.path_file = [file1 userScanPath:1];
file2.path_file = [file2 userScanPath:2];

if ([file1 checkPath:file1.path_file] && [file2 checkPath:file2.path_file])
{
file1.contentFile = [file1 pathFileToStringArray:file1.path_file];
file2.contentFile = [file2 pathFileToStringArray:file2.path_file];

NSMutableDictionary *resultFile1 = [NSMutableDictionary new];
NSMutableDictionary *resultFile2 = [NSMutableDictionary new];

resultFile1 = [file1 chearchOfOccur:file1.contentFile];
resultFile2 = [file2 chearchOfOccur:file2.contentFile];
}

}

return 0;
}

Voila dit moi ce que vous en pensez !!!!


 


Merci.


Réponses

  • Y'a trop de commentaires



  • //
    // MyFileClass.h
    //


    #import <Foundation/Foundation.h>

    @interface MyFileClass : NSObject


    // Déclaration des accesseurs
    @property(nonatomic, copy, readwrite) NSString *path_file;
    @property(nonatomic, strong, readwrite) NSArray *contentFile;



    // Déclaration des méthodes associées à  la MyFileClass
    - (NSString*)userScanPath: (int)fileNumber;
    - (BOOL)checkPath: (NSString*)filePath;
    - (NSArray*)pathFileToStringArray:(NSString*)path;
    - (NSMutableDictionary*)chearchOfOccur:(NSArray*)array;



    @end



    //
    // MyFileClass.m
    //

    #import "MyFileClass.h"


    @implementation MyFileClass


    - (NSString*)userScanPath:(int)fileNumber
    {
    char filePath[200];
    NSString *charToStringPath;

    printf("Please enter the path to your file n° %i\n", fileNumber);
    scanf("%s", filePath);

    charToStringPath = [NSString stringWithUTF8String:filePath];

    return (charToStringPath);
    }

    - (NSArray*)pathFileToStringArray:(NSString*)path
    {
    NSURL *pathUrl = [NSURL fileURLWithPath:path];
    NSString *myFile = [NSString stringWithContentsOfURL:pathUrl encoding:NSUTF8StringEncoding error:NULL];
    NSArray *myFileByLine = [myFile componentsSeparatedByString:@\n];
    return (myFileByLine);

    }

    - (BOOL)checkPath:(NSString*)filePath
    {
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL isDir;
    BOOL exist =[fileManager fileExistsAtPath:filePath isDirectory:&isDir];
    BOOL writable = [fileManager isWritableFileAtPath:filePath];

    if (exist)
    {
    NSLog(@File exists);
    if (isDir)
    {
    NSLog(@File is a directory);
    return NO;
    }
    }
    else
    {
    NSLog(@File doesn't exists);
    return NO;
    }

    if (writable)
    NSLog (@File is writable);
    else
    NSLog (@File is read only);

    return YES;
    }

    -(NSMutableDictionary*)chearchOfOccur:(NSArray*)array
    {
    NSMutableDictionary *result = [NSMutableDictionary new];

    for (NSString *eachLine in array)
    {
    NSArray *eachItem = [eachLine componentsSeparatedByString:@ :];

    if ([eachLine containsString:@.])
    {
    NSArray *letters = [eachItem[0] componentsSeparatedByString:@.];
    for (NSString* letter in letters)
    {
    int value = [result[letter] intValue];
    value += [eachItem[1] intValue];
    result[letter] = @(value);
    }
    }
    else
    {
    NSArray *letters = [eachItem[0] componentsSeparatedByString:@/];
    for (NSString* letter in letters)
    {
    int value = [result[letter] intValue];
    value += [eachItem[1] intValue];
    result[letter] = @(value);
    }
    }
    }
    return result;
    }

    @end



    //
    // main.m
    //

    #import "MyFileClass.h"
    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])
    {
    @autoreleasepool
    {
    MyFileClass *file1 = [[MyFileClass alloc] init];
    MyFileClass *file2 = [[MyFileClass alloc] init];

    file1.path_file = [file1 userScanPath:1];
    file2.path_file = [file2 userScanPath:2];

    if ([file1 checkPath:file1.path_file] && [file2 checkPath:file2.path_file])
    {
    file1.contentFile = [file1 pathFileToStringArray:file1.path_file];
    file2.contentFile = [file2 pathFileToStringArray:file2.path_file];

    NSMutableDictionary *resultFile1 = [file1 chearchOfOccur:file1.contentFile];
    NSMutableDictionary *resultFile2 = [file2 chearchOfOccur:file2.contentFile];
    }

    }

    return 0;
    }

    Je t'ai fait quelques corrections dans le code. Remarque en particulier la déclaration des attributs.

  • colas_colas_ Membre
    décembre 2014 modifié #4

    N'écris pas path_file mais pathFile : c'est la convention de nommage Apple.


  • CéroceCéroce Membre, Modérateur
    - (NSArray*)pathFileToStringArray:(NSString*)path
    - (BOOL)checkPath:(NSString*)filePath

    n'utilisent pas les variables d'instance. Fais-en des méthodes de classe (dont le nom commence par +).
  • AliGatorAliGator Membre, Modérateur
    N'utilise pas les variables d'instance. Utilise des @property à  la place (que tu as déjà , pour ce cas).

    Concernant les variables d'instances :
    • Non seulement il n'est plus nécessaire de les déclarer, car elles sont synthétisées automatiquement d'après les @property
    • En plus, il est préférable d'utiliser les accepteurs (setter/getter) et donc directement les propriétés ("self.contentFile = ..." et pas "contentFile = ...", etc) " à  part dans les méthodes d'init où c'est un cas particulier " pour profiter de l'encapsulation des accès (gestion de l'atomicité des accès, KVO & KVC automatiques, ...)
    • Et en plus quand les @property sont auto-synthétisées, les backing variables qu'il synthétise derrière ont leur nom préfixées d'un underscore. Ce qui veut dire que le compilateur te génère déjà  une variable d'instance "_contentFile" par exemple... en plus de ta propre variable d'instance "contentFile"... du coup, c'est le meilleur moyen de confondre les deux
    • Donc en résumé, oublie les variables d'instance, ça fait un bail qu'il n'est plus conseillé de les déclarer du tout, limite complètement oublier qu'elles existent, et toujours utiliser les @property directement sans ce soucier de ce qu'il y a derrière. (Les rares cas où on fait une exception sont pour des cas d'optimisation avancés dont je vais éviter de te parler pour pas t'embrouiller).
  • @ali : et du coup, dans quel cas il est préférable d'utiliser _variable plutôt que self.variable ? 


  • Joanna CarterJoanna Carter Membre, Modérateur
    C'est conseillé seulement dans les méthodes init et dealloc et dans les lazy getters
  • AliGatorAliGator Membre, Modérateur
    Uniquement dans les constructeurs/initializer (init, initWithFrame, initWithCoder). Et dans le code des accepteurs (setter/getter) si jamais tu surcharges leur implémentation, évidemment, pour éviter les appels récursifs.
  • Il m'arrive aussi de les utiliser dans de rares cas très spécifiques : par exemple si ma propriété représente un état de mon instance (au sens des diagrammes états-transitions), je déclenche les actions de transition dans le setter. Lorsque je veux initialiser mon instance dans un état particulier (sans déclencher une transition donc) j'utilise la variable d'instance.


  • ok merci


Connectez-vous ou Inscrivez-vous pour répondre.