Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.64
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
#1

Быстрое обращение к данным многомерных словарей - Objective-C

15.06.2013, 11:24. Просмотров 3402. Ответов 39
Метки нет (Все метки)

предлагаю на рассмотрение следующий метод работы с данными многомерных словарей

рассматриваются словари, чья многомерная структура состоит из словарей и массивов

1) сокращенные методы получения данных из словарей и массивов
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// DKeyClass test version
 
#import <Foundation/Foundation.h>
 
@interface NSDictionary (NSDictionaryDkey)
 
-(id) key: (id) key;
 
@end
 
@interface NSArray(NSArrayDkey)
 
-(id) index: (int) index;
 
@end
данные методы зеркально отражают стандартные objectForKey: и objectAtIndex:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// DKeyClass test version
 
#import "DkeyClass.h"
 
@implementation NSDictionary(NSDictionaryDkey)
 
-(id)key:(id)key {
    return  [self objectForKey:key];
}
@end
 
@implementation NSArray(NSArrayDkey)
 
-(id)index:(int)index {
    if (index>=self.count || index<0) {
        NSLog(@"DkeyClass ARRAY ERROR index at %d (max=%d) \n %@",index,self.count-1,self);
        return nil;
    }
    return [self objectAtIndex:index];
}
@end
дополнительно в метод index: добавлен логический блок проверки индекса, который не допускает внезапного завершения приложения из-за неверного индекса

2) примеры кода, показывающие удобство использования сокращенных конструкций key-index
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// уровень 1
 
[_dict1 objectForKey:@"s1"];
 
[_dict1 key:@"s1"];
 
// уровень 2
 
[[_dict1 objectForKey:@"k1"] objectAtIndex:1];
 
[[_dict1 key:@"k1"] index:1];
 
// уровень 3
 
[[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"s3"];
 
[[[_dict1 key:@"k1"] index:0] key:@"s3"];
 
// уровень 4
 
[[[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"k3"] objectForKey:@"s4"];
 
[[[[_dict1 key:@"k1"] index:0] key:@"k3"] key:@"s4"];
3) тестовая программа

Быстрое обращение к данным многомерных словарей

состоит из кнопок на которые назначены действия показа данных через NSLog

в программе заполняется многомерный словарь состоящий из 4 уровней

1 - словарь
2 - массив
3 - словарь
4 - словарь

структура

Быстрое обращение к данным многомерных словарей

исходный код программы

ViewController.h
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//
//  ViewController.h
//  test_dict4
//
//  Created by Mac on 6/15/13.
//  Copyright (c) 2013 Mac. All rights reserved.
//
 
#import <UIKit/UIKit.h>
#import "DkeyClass.h"
 
@interface ViewController : UIViewController<UIAlertViewDelegate>
- (IBAction)b1:(id)sender;
- (IBAction)b2:(id)sender;
- (IBAction)b3:(id)sender;
- (IBAction)b4:(id)sender;
- (IBAction)indexerror:(id)sender;
 
- (IBAction)obj1:(id)sender;
- (IBAction)obj2:(id)sender;
- (IBAction)obj3:(id)sender;
- (IBAction)obj4:(id)sender;
- (IBAction)indexobjError:(id)sender;
 
@property NSMutableDictionary* dict1;
 
@end
ViewController.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//
//  ViewController.m
//  test_dict4
//
//  Created by Mac on 6/15/13.
//  Copyright (c) 2013 Mac. All rights reserved.
//
 
#import "ViewController.h"
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _dict1 = [NSMutableDictionary new];
    NSMutableArray * a2 = [NSMutableArray new];
    NSMutableDictionary * d3 = [NSMutableDictionary new];
    NSMutableDictionary * d4 = [NSMutableDictionary new];
    
    
    // дерево словарей заполнено
    [_dict1 setObject:a2 forKey:@"k1"];
    [a2 addObject:d3];
    [d3 setObject:d4 forKey:@"k3"];
    
    // заполняем словари строковыми данными
    
    [_dict1 setObject:@"level1" forKey:@"s1"];
    [a2 addObject:@"level2 array"];
    [d3 setObject:@"level3" forKey:@"s3"];
    [d4 setObject:@"level4" forKey:@"s4"];
 
    
    NSLog(@"текущая структура словарей %@",_dict1);
}
 
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
 
#pragma mark черезКлючи
 
- (IBAction)b1:(id)sender {
    id obj = [_dict1 key:@"s1"];
   
    NSLog(@"KEY МЕТОД строка уровень 1 \n%@", obj);
}
 
- (IBAction)b2:(id)sender {
    id obj = [[_dict1 key:@"k1"] index:1];
    
    NSLog(@"KEY МЕТОД строка уровень 2 \n%@", obj);
}
 
- (IBAction)b3:(id)sender {
    id obj = [[[_dict1 key:@"k1"] index:0] key:@"s3"];
    
    NSLog(@"KEY МЕТОД строка уровень 3 \n%@", obj);
}
 
- (IBAction)b4:(id)sender {
    id obj = [[[[_dict1 key:@"k1"] index:0] key:@"k3"] key:@"s4"];
    
    NSLog(@"KEY МЕТОД строка уровень 4 \n%@", obj);
}
 
- (IBAction)indexerror:(id)sender {
    // запрашиваем ошибочный индекс
    [[_dict1 key:@"k1"] index:2];
    
}
 
#pragma mark стандартный метод
 
- (IBAction)obj1:(id)sender {
    id obj = [_dict1 objectForKey:@"s1"];
    
    NSLog(@"СТАНДАРТНО строка уровень 1 \n%@", obj);
}
 
- (IBAction)obj2:(id)sender {
    id obj = [[_dict1 objectForKey:@"k1"] objectAtIndex:1];
    
    NSLog(@"СТАНДАРТНО строка уровень 2 \n%@", obj);
}
 
- (IBAction)obj3:(id)sender {
    id obj = [[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"s3"];
    
    NSLog(@"СТАНДАРТНО строка уровень 3 \n%@", obj);
}
 
- (IBAction)obj4:(id)sender {
    id obj = [[[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"k3"] objectForKey:@"s4"];
    
    NSLog(@"СТАНДАРТНО строка уровень 4 \n%@", obj);
}
 
- (IBAction)indexobjError:(id)sender {
    UIAlertView *a = [[UIAlertView alloc] initWithTitle:nil message:@"приложение сейчас прекратит работу из-за неверного индекса массива" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil];
    [a show];
    
}
 
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
   // запрашиваем ошибочный индекс
   [[_dict1 objectForKey:@"k1"] objectAtIndex:2];
}
 
@end
лог после запуска программы

Bash
1
2
3
4
5
6
7
8
9
10
11
12
2013-06-15 09:46:43.865 test_dict4[709:c07] текущая структура словарей {
    k1 =     (
                {
            k3 =             {
                s4 = level4;
            };
            s3 = level3;
        },
        "level2 array"
    );
    s1 = level1;
}
0
Вложения
Тип файла: zip test_dict4.zip (38.4 Кб, 4 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2013, 11:24
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Быстрое обращение к данным многомерных словарей (Objective-C):

обращение к данным uiviewcontroller
как взять текст из label.text из одного uiviewcontroller в другой? как...

Вывод русских словарей и массивов в читаемом виде
Вывод русских словарей и массивов в читаемом виде ext_log.h //* ...

Приложение представляющее организацию многомерных вычислений многомерных массивов
Разработать приложение для Windows, представляющую организацию многомерных...

Обращение к данным из базы
Есть база данных на MS SQL из которой нужно получить данные в переменную из...

Обращение к данным класса.
Доброе время суток. Начал самостоятельно изучать классы. Хотел выполнить...

Обращение к данным хостинга
Я создал программу и хочу сделать условия запуска В данном случае: private...

39
Vorona
Peace 2 all shining faces
671 / 533 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
24.07.2013, 01:44 #21
Цитата Сообщение от noname_club Посмотреть сообщение
абстракция ради абстракции?
про какую абстракцию речь?
я вам показал довольной конкретный пример, конкретную реализацию, не больше, не меньше
говорю, что такое удобно рефакторить, соответствует оо-подходу, покрывается юнит-тестами

если в одном классе нужно порядка 50 макросов констант, то стоит задуматься об архитектуре, если это не какой-то базовый класс с настройками фреймворка или чего-то в таком духе

Цитата Сообщение от noname_club Посмотреть сообщение
конструкции со знаком подчеркивания легче читаются
ну тут уж извините, в каждом языке свои конвенции написания кода, и желательно соблюдать их, дабы не оказаться дураком
в Objective-C с подчеркиванием пишутся низкоуровневые конструкции или часть на С, думаю это нетрудно заметить наблюдая за Foundation хотя бы.
Плюс снова повторюсь, во всем мире зачастую макросы константы пишутся начиная с k (kSomeValue), потому людям, работающим с вашим кодом будет легко и привычно.

думаю, тут вы найдете что-то полезное, а так же по простому запросу 'objective-c naming conventions'
http://developer.apple.com/library/m...d/10000146-SW1

Цитата Сообщение от noname_club Посмотреть сообщение
[[[self.dictionary key:d_elementKey] key:d_elementKey] key:d_elementKey]
это что еще за фигня, не нравятся длинные конструкции - разбивайте на короткие, тут как бы очевидно, что чем длиннее конструкция, тем ее тяжелее читать, а то что везде коричневые слова будут маячить вместо зеленых, это погоды не меняет
в C# в Visual Studio вообще все слова бирюзового цвета, так что, там скажете неудобно работать?
это тут вам и розовенький и фиолетовенький и коричневенький лишь бы разработчик не хныкал, и все равно находятся такие, ну насчет цвета это все очень печально, надеюсь вы попадете хорошему тимлиду, который вас быстро в чувство приведет, иначе никак ... вы либо с какого-то php или javascript начинали (простите, наболевшее), либо просто не видели массивные серьезные проекты, где работает по 10-15 человек только на клиенте

вы то ли перевоплощение alexpac26, то ли он и есть, потому что так же упрямо стоите на своем, невзирая на то, что вам везде советуют
пишете наверное сами для себя в кладовке, куда никакая культура кодирования не проникнет, как бы и не старалась, выкладываете на всеобщее пользование корявые и ненужные обрывки кода, то прислушивались бы к всеобщим канонам, раз все-таки хотите вести какую-то деятельность среди других разработчиков, а не наедине с собой
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
24.07.2013, 02:08  [ТС] #22
в C# в Visual Studio
там язык существенно отличается и строки пишутся без знака собаки @

Плюс снова повторюсь, во всем мире зачастую макросы константы пишутся начиная с k (kSomeValue), потому людям, работающим с вашим кодом будет легко и привычно.
вы тоже частенько пишите kSomeValue? или не пишите вовсе ничего подобного.

либо просто не видели массивные серьезные проекты, где работает по 10-15 человек только на клиенте
опять возвращаемся к тому что "стандарты" программирования становяться жестче по мере увеличения количества разработчиков, вам наверно не знакомо такое чувство как "вдохновение" при написании программы. Для вас это скучная рутина. В которой нельзя ничего поменять в лучшую сторону, даже с архитектурной точки зрения.
0
Vorona
Peace 2 all shining faces
671 / 533 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
24.07.2013, 02:42 #23
как раз таки, для меня это интересный коллективный проект, который очень хорошо написан, легко поддерживается и конфигурируется, в который не стыдно привести коллегу или передать его ему и который без меня смогут поддерживать другие программисты зная только логику самого проекта, не углубляясь в детали
для меня творчество - это красота и простота, мне приятно когда другие люди могут без труда вникнуть в мой код, не зацикливаясь на мелочах и не спотыкаясь на костылях

Цитата Сообщение от noname_club Посмотреть сообщение
вы тоже частенько пишите kSomeValue? или не пишите вовсе ничего подобного.
естественно пишу, все мы такое пишем, только вопрос в том, как и где это писать
например файлик констант для каких-то путей в директории проекта, их использует весь проект, их легко конфигурировать и они лежат по назначению

Цитата Сообщение от noname_club Посмотреть сообщение
опять возвращаемся к тому что "стандарты" программирования становяться жестче по мере увеличения количества разработчиков
лучше сразу привыкать писать правильно, потом программировать будет одно удовольствие

например юнит тестирование – поначалу казалась ужасно рутинной работой, зато когда наловчился хоть немного, пишешь функциональность ни разу не компилируя код и в процентах 70-80 он работает сходу, плюс сам код написан красиво и правильно, доступен для рефакторинга больше чем обычный код да и рефакторить можно не боясь что-то сломать, ничего лишнего не пишешь, что потом вызовет кучу головной боли, одно удовольствие
все чисто и ясно, как божий день, дописал что-то, подправил что-то, результат сразу на лицо, в плане регрессивного тестирования больше доверяю машине, чем человеку да и тестировщику меньше головной боли перепроверять или старый функционал не свалился, больше позитива, чем головняка и проблем (сам рад, что все как хотелось да и денег больше получаешь за богатый опыт и хороший, рабочий код), вот это я называю наслаждением

просто оставлю это здесь
http://qualitycoding.org/objective-c-code-smells/
а особенно это
http://qualitycoding.org/preprocessor/#macro

вообще интересный дядька, советую перечитать его блог
1
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
24.07.2013, 02:49  [ТС] #24
Все это прекрасно, но пока #define выделяются на фоне остальных переменных, и плюс прибавим сюда следование "стандартам" названия констант kDefineValue
Ни enum ни static const, не смотря на кажущиеся преимущества, не смогут так выглядеть как они, а следовательно что с константами что без них, код будет бирюзовой гаммой

а ведь !методы! объявления что у enum и static const, что у #define ИНДЕТИЧНЫ

Оба сидят в хедере и оба прозрачны для изменений.

Так почему не использовать? Банальное не хотение ?
0
Vorona
Peace 2 all shining faces
671 / 533 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
24.07.2013, 03:20 #25
Цитата Сообщение от noname_club Посмотреть сообщение
Так почему не использовать? Банальное не хотение ?
семантика

Цитата Сообщение от noname_club Посмотреть сообщение
а ведь !методы! объявления что у enum и static const, что у #define ИНДЕТИЧНЫ
не совсем, вы бы если потрудились прочитать вторую статью, вы бы заметили существенную разницу не только в принципе работы и применении, а и в самом объявлении

ну то что enum может группировать числовые константы и это удобней чем макросы, надеюсь спорить вы не станете
насчет C# я так и не понял, чем там бирюзовые вперемешку со светло-зелеными оттенками не мешают разработчикам и никто там не использует директивы, а тут вот без директив плохо
да и я же дал вам ссылку на шикарнейший источник, это не просто скучающий дядя, а один из тех, на кого весь мир равняется и вам советую того же, тем более объясняет он убедительней меня

смею предположить, что вы выбираете красивое подсвечивание в одной из IDE, грамотности, правильности и чистоте кода и банальное нехотение как раз относится к вам
тут просто уже столько доводов приведено, а вы все стоите на коричневеньком подсвечивании в одной из безгранично многих настроек, одной из многих IDE и текстовых редакторов

кстати текст читать удобней, когда он монотонного цвета, а не пляшет как светофор
в правильно написанном методе никогда не будет путаницы по поводу "откуда эта переменная", так как методы должны быть краткими, выполнять одну и только одну функцию и не быть больше 5-10 строк, и если придерживаться конвенции выделения констант, статических переменных и т.д., то вы сразу заметите что из себя представляет переменная

тут если сразу учиться программировать правильно, можно заметить что все между собой взаимосвязанно и в итоге получается чистый и красивый код, который легко поддерживать

прекрасно сказано
We work in an object-oriented language, so let’s use OO patterns, shall we?
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
24.07.2013, 09:57  [ТС] #26
насчет C# я так и не понял
ну например там метод объекта вызывается просто как
C#
1
object.method(param1,param2);
и тп что уже позволяет вытворять различные длинные вещи в очень малом количестве букв

в отличие от objc где метод вынужден избыточно называть себя как ENG предложение

Objective-C
1
[object methodWithParam1: param1 AndParam2: param2];
к тому же там строки пишутся быстрее и выглядят в коде лучше, за счет отсутствия знака @, что расширяет их применение, как параметров ассоциативных структур

смею предположить, что вы выбираете красивое подсвечивание в одной из IDE, грамотности, правильности и чистоте кода и банальное нехотение как раз относится к вам.
возмем код с макросом

[object methodWithParam1: kParam1 AndParam2: kParam2];

возмем код без макроса

[object methodWithParam1: kParam1 AndParam2: kParam2];

а теперь угадай какой из фрагментов кода я щас напишу ниже? нижний или верхний?

[object methodWithParam1: kParam1 AndParam2: kParam2];
не знаешь? а почему? а потому что они одинаковые!

Да, код не грамотный с точки зрения того что макрос надо заменить константами и тд и тп.
А в остальном он чистый и правильный с какой стороны не глянь.
Чем то приходится жертвовать...

в одной из безгранично многих настроек, одной из многих IDE и текстовых редакторов
Эта та самая IDE одна единственная с языком ObjC и сравнивать ее не с чем. Текстовые редакторы это просто редакторы, компилировать они не умеют.
0
Vorona
Peace 2 all shining faces
671 / 533 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
24.07.2013, 10:16 #27
Цитата Сообщение от noname_club Посмотреть сообщение
Эта та самая IDE одна единственная с языком ObjC и сравнивать ее не с чем.
AppCode от Jetbrains, кстати во многом лучше чем Xcode
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
24.07.2013, 12:25  [ТС] #28
осталось выяснить каким цветом там раскрашиваются макросы и константы.

Вообще если у них цвет одинаковый (как в C#) то нет смысла использовать #define.
0
Xavier
in god we trust
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
24.07.2013, 12:35 #29
вам не кажется что пора завязывать? а то вся дискуссия свелась к тому кому какой цвет нравиться.
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
24.07.2013, 12:45 #30
Ааааа.

ПРОСТО_ЗАКРОЙТЕ_ТЕМУ.
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
24.07.2013, 12:46  [ТС] #31
я тут попробовал константы, оказывается строки почемуто желтеют при попытке передать из как типизированный параметр в функцию

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#import "ViewController.h"
 
@interface ViewController ()
 
@end
 
const NSString* kValue = @"hello world";
 
@implementation ViewController
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
 
}
 
- (IBAction)B1:(id)sender {
    
    NSMutableDictionary*dt = [NSMutableDictionary new];
    [dt setObject:@"hello" forKey: kValue];
    
    
    [self logString:kValue]; // << желтизна тут 
    
}
 
-(void) logString: (NSString*) str {
    NSLog(@"string %@",str);
}
 
@end
Быстрое обращение к данным многомерных словарей

может я неправильно ее объявил? ARC включен
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
24.07.2013, 12:58  [ТС] #32
я неправильно объявил.

http://stackoverflow.com/questions/6...ards-qualifier

надо вот так

Objective-C
1
2
NSString* const kValue = @"hello world"; // constant pointer
int const KInt = 3;  // constant number
подведу итог.

Итак если нужно правильно и быстродейственно, то используем константы для подсказывания параметров

Objective-C
1
2
3
4
5
6
7
NSString* const kValue = @"keyValue";
 
// <<
 
id element = [dictionary objectForKey: kValue];
id element = dictionary[kValue];
id element = [dictionary key: kValue];
Если нужно выделение констант в коде. Или просто чтобы было удобно.
Используем макросы

Objective-C
1
2
3
4
5
6
7
#define kValue @"keyValue";
 
// <<
 
id element = [dictionary objectForKey: kValue];
id element = dictionary[kValue];
id element = [dictionary key: kValue];
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
24.07.2013, 12:58 #33
Цитата Сообщение от noname_club Посмотреть сообщение
может я неправильно ее объявил
Как и всю тему

Objective-C
1
NSString* const kFieldNameKey = @"FieldValue";
1
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
12.09.2013, 12:31 #34
[[[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"k3"] objectForKey:@"s4"];

[[[[_dict1 key:@"k1"] index:0] key:@"k3"] key:@"s4"];
Мне за 3.5 года разработки на iOS ни разу не приходилось писать подобной чепухи. Если у вас есть необходимость упрощать подобные конструкции, это говорит о том, что у вас серьезные архитектурные проблемы в проекте. Может стоить прежде всего о них задуматься?
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
12.09.2013, 12:55  [ТС] #35
Если у вас есть необходимость упрощать подобные конструкции
улучшение читаемости кода это разве не первостепенная необходимость?

Мне за 3.5 года разработки на iOS ни разу не приходилось писать подобной чепухи.
написание классов-категорий это всегда чепуха?
даже если это удобно?

у вас серьезные архитектурные проблемы в проекте
проектная архитектура следующая

Быстрое обращение к данным многомерных словарей
0
Vorona
Peace 2 all shining faces
671 / 533 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
13.09.2013, 00:06 #36
Цитата Сообщение от noname_club Посмотреть сообщение
проектная архитектура следующая
да, проблемы

в iOS уже есть NSUserDefaults

а тупой синглтон со словарем, к которому обращается масса контроллеров, это мягко говоря говнокод, разве что у вас есть ну очень веская причина для подобной архитектуры. Есть масса ооп принципов и видов рефакторинга, которые без особых усилий уберут необходимость в этом god-singleton классе

ну и учитывая то, что уже, как полгода есть возможность использовать упрощающие жизнь лексемы, необходимость в этом масле масленном пропадает

Цитата Сообщение от noname_club Посмотреть сообщение
улучшение читаемости кода это разве не первостепенная необходимость?
кстати читаемость вы так и не улучшили, а только ухудшили

если тут: [_dict1 objectForKey:@"k1"]
я читаю как обычное предложение на английском, т.е. dictionary's object for key 'k1', я понимаю что получу объект по ключу, то у вас:
[_dict1 key:@"k1"]
я ожидаю получить ключ относительно какой-то непонятной строки – dictionary's key 'k1', т.е. дай мне ключ к1 что ли?

фигня какая-то, люди в NextStep были поумнее вас и старались предоставить действительно удобный интерфейс, который можно будет читать
а то, что длинные слова, так это вполне конкретно раскрывает суть конструкции, и с их написанием нет никаких проблем благодаря навороченным IDE с автодополнением, и всякая муть вроде dict и arr должна оставаться в своем времени (конца 90х)

почитайте Clean Code хотя бы, я вас прошу, я не могу пропустить мимо глаз подобную ересь
0
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
16.09.2013, 09:24 #37
улучшение читаемости кода это разве не первостепенная необходимость?
Вы ничего не улучшили, как написал Vorona, есть стандартные методы, которые названы в соответствии с общепринятыми правилами именования, вы их переобозвали другими, некорректными именами, только слегка покороче. Что тут еще сказать, читайте: https://developer.apple.com/library/...uidelines.html

дополнительно в метод index: добавлен логический блок проверки индекса, который не допускает внезапного завершения приложения из-за неверного индекса
Боюсь ошибиться, но есть впечатление, что вы не совсем понимаете, зачем нужны исключения.

написание классов-категорий это всегда чепуха?
Я и не писал, что написание классов - это чепуха. Чепуха - это то, что у вас какие-то данные лежат в dictionary, который лежит в dictionary, который лежит в массиве, который лежит в dictionary, и то, что вы обращаетесь к этим данным по такой длинной цепочке.
Вы правда думаете, что другой разработчик, когда увидит хоть это: [[[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"k3"] objectForKey:@"s4"], хоть это: [[[[_dict1 key:@"k1"] index:0] key:@"k3"] key:@"s4"], сможет быстро разобраться, что тут происходит?

проектная архитектура следующая
Это не архитектура, это корявенькое описание паттерна синглтон (Хотя само по себе странно, что тут синглтон dictionary )
0
noname_club
104 / 95 / 12
Регистрация: 01.05.2013
Сообщений: 600
16.09.2013, 09:43  [ТС] #38
Вы правда думаете, что другой разработчик, когда увидит хоть это: [[[[_dict1 objectForKey:@"k1"] objectAtIndex:0] objectForKey:@"k3"] objectForKey:@"s4"], хоть это: [[[[_dict1 key:@"k1"] index:0] key:@"k3"] key:@"s4"], сможет быстро разобраться, что тут происходит?
1) быстро никто никогда не разбирается
2) я предложил использовать key: index: за имененем пока должных альтернатив
objectForKey, не смотря на свою общепринятость, все равно громоздок

3) литералы приемлемы для словарей.
Однако для массивов возникается таже самая ошибка (вылет приложения) если идет вызов по несуществующему индексу.

метод index: , перед вызовом элемента проверяет, на то что индекс входит в дипазон размера массива, иначе вызывает nil и ошибки удается избежать, хотя бы по этой причине я использую index: для массивов.

4) https://developer.apple.com/library/...uidelines.html OK мне это изветсно

5)
а тупой синглтон со словарем, к которому обращается масса контроллеров, это мягко говоря говнокод, разве что у вас есть ну очень веская причина для подобной архитектуры. Есть масса ооп принципов и видов рефакторинга, которые без особых усилий уберут необходимость в этом god-singleton классе
god singleton конечно плохо. Поэтому используется несколько маленьких, для разделения функций.

Есть масса ооп принципов и видов рефакторинга

есть то она есть, однако если приложения тупо получает JSON с сервера и выводит его, зачем плодить абстракции?


Это не архитектура, это корявенькое описание паттерна синглтон (Хотя само по себе странно, что тут синглтон dictionary )
синлгтон не dictionary, а NSObject. Dictionary это одно из полей, он выполняет роль простого хранилища данных, кроме dictionary там еще несколько полей для обмена между контроллерами
0
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
16.09.2013, 11:13 #39
быстро никто никогда не разбирается
По себе судите?
В говнокоде типа вашего - да. В чистом логичном коде, написанном, следуя code conventions, быстро разбираются даже джуниоры.

2) я предложил использовать key: index: за имененем пока должных альтернатив
objectForKey, не смотря на свою общепринятость, все равно громоздок
Поздравляю, вы сэкономили 9 символов, похерив к чертям читабельность. Что ж вы методы k: и i: не назвали? Смотрите! Еще бы несколько символов сэкономили!

Боюсь ошибиться, но есть впечатление, что вы не совсем понимаете, зачем нужны исключения.
Однако для массивов возникается таже самая ошибка (вылет приложения) если идет вызов по несуществующему индексу.
Я был прав. Сам по себе возврат nil не исправляет вашей ошибки. У вас понимание исключений на уровне школьника: это такая бяка, которая валит мою программу. Зачем их сделали, вы похоже не задумывались. Ваши проверки - чистая индусятина, когда устраняются не баги, а их симптомы. Умные люди наоборот для входных параметров ассерты пишут, а вы добиваетесь, чтобы ваш метод любое говно схавал.
0
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
16.09.2013, 11:31 #40
Цитата Сообщение от noname_club Посмотреть сообщение
god singleton конечно плохо. Поэтому используется несколько маленьких, для разделения функций.
Монотеизм - зло. Надо ввести пантеон богов и это решит все проблемы
Зачет
0
16.09.2013, 11:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2013, 11:31
Привет! Вот еще темы с решениями:

Обращение к данным 1С Предприятия
Доброго времени суток. Подскажите, пожалуйста, как в php обращаться к...

обращение к данным структуры
Ideal model small STACK 256 dataseg struc daymonthstruc day db 4...

Обращение к данным другого объекта
В одном из методов класса block необходимо обратиться к полю объекта класса...

Обращение к данным регламентированного отчета
Доброго времени суток,столкнулся с такой проблемой,что не могу обратиться к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru