Субъективный Си / Говнокод #13626 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
- (id)init
{
    if (nil != (self=[super init]))
    {
    }
    return self;
}

Мастер Йода

Запостил: clockworkman clockworkman, (Updated )

Комментарии (25) RSS

  • Как сказал Шариков, сорвав кран в квартире у Преображенского - "ни пса не видно!"
    В чём соль, обжективщики?
    Ответить
    • Ни в чем, кроме того, что человек запихнул все в одну строку.

      Стандартный вариант:
      -(id)init
      {
      self = [super init];
      if(self)
      {
      }
      return self;
      }
      Ответить
        • Там, видимо, какой-нибудь код для инициализации полей втыкается. Просто вместо понятного комментария оставили блок пустым, вводя народ в заблуждение.
          Ответить
          • Понятно, а я сначала думал, может таким образом (самой проверкой) можно получить исключение в каких-то случаях.

            P.S. А у ОПа судя по комменту "Магистр Йода" вообще были претензии только к йодовскому условию, где первой идёт константа nil?
            Ответить
            • Ну тут скорее не к йодовскому, а к тому, что все в кучу.
              Ответить
          • Когда-то это шаблон выглядел так:

            -(id)init
            {
                if(self = [super init])
                {
                    // Your code where
            
                }
                return self;
            }
            Ответить
            • Блин, меня постоянно смущает этот self = xxx. init в ObjectiveC это особый метод, и только он может такое делать?

              Причем ладно был бы он класс-методом с плюсиком, тогда было бы все очевидно - обычная фабрика. Но тут же его помечают как инстанс метод...
              Ответить
              • В Ocj-C (да и в C тоже, если я верно помню) оператор "=" помимо выполнения самого присваивания возвращает в качестве результата присвоенное значение.
                То есть можно писать
                a = b = c = 3;

                Единственное, я не уверен в приоритете операций в данной записи.
                Соответственно результат присваивания можно использовать в любой операции. Конкретно в init'е проверяется не вернул ли [super init] значение nil.

                Сам init - самый обычный рядовой метод, с точки зрения синтаксиса, просто по соглашениям его (или вариации - initWithFrame, initWithDecoder) принято использовать в качестве инициализирующей функции.
                Ответить
                • > помимо выполнения самого присваивания возвращает в качестве результата присвоенное значение
                  Да это то все понятно. Меня смущало именно присваивание self.
                  Ответить
              • А, видимо я не понял вопроса. Нет, self можно переписать откуда угодно. Но не нужно 😉
                Как я уже писал, Obj-C выглядит так, как будто он реализован поверх C дефайнами.
                Ответить
              • Только метод, название которого начинается со слова init, может вызывать self = [super init], да.
                Про инстанс метод - зато в Obj-C аллокатор является класс-методом (правда, он только память выделяет и возвращает id, так что фабрикой назвать его нельзя никак).
                Ну и да, многие девелоперы (и я, да) для своих классов пишут статические фабрики.
                Ответить
                • Т.е. фактически мы выделяем кусок памяти через alloc, а потом вызываем у этого еще неинициализированного куска init, и он заполняет поля и т.п.? Ну тогда имеет смысл.

                  Правда меня все равно пугает self = xxx. Ну как-то это неестественно.
                  Ответить
                    • А можно в self засунуть не результат [super init], а результат alloc'а к примеру? Или запилить таким образом синглтон, всегда засовывая в self и возвращая одно и то же...
                      Ответить
                      • Можно конечно, и то, и то - id, все прекрасно вернется. Получишь объект, у которого ни одно поле не выставлено. Не могу представить, зачем тебе этого хочется.
                        Про синглтон идеи не понял.
                        Обычно он делается по-старинке - статик инстанс.
                        Ответить
                        • Чистый сингтон от статика отличается чуть меньше чем ничем.
                          Ответить
                        • > Не могу представить, зачем тебе этого хочется.
                          Для удовлетворения извращенных фантазий 🙂 Например в зависимости от параметров вернуть другой объект, являющийся потомком текущего.

                          > Про синглтон идеи не понял.
                          Ну вот тот самый статик инстанс возвращать из init'а. Чтобы внешний код не знал, что это синглтон.

                          P.S. Не обращайте внимания на мои странные мысли и идеи, это на меня годы работы с крестами так влияют 😉
                          Ответить
                          • > Ну вот тот самый статик инстанс возвращать из init'а. Чтобы внешний код не знал, что это синглтон.

                            Тащемта так правоставные синглтоны в Obj C и пишутся. По идее надо перекрывать все методы, через которые можно получить второй инстанс или поменять retain count самого синглтона, это init, autorelease, retain, release, и даже сам alloc.
                            Редко кто так заморачивается, пишут просто фабрику sharedInstance и все.
                            Ответить
                            • Слава ARC и GCD, теперь достаточно написать в ините "dispatch_once", и менее православным такой синглтон не станет.
                              Ответить
                              • В том то и беда, что ARC решит только проблему с retain count, не позволяя его самостоятельно поменять, а GCD с dispatch_once хоть штука и полезная при создании синглтонов, но не защитит от создания второй инстанс, если его добавить, как вы написали, в инит. Я же все еще могу послать alloc или allocWithZone и получить еще один полноценный объект, пусть и не инициализированный.
                                Ответить
                                • Конечно же я имел ввиду не в инит, а в геттер инстанса.
                                  Заработался.
                                  Ответить
                          • > Например в зависимости от параметров вернуть другой объект, являющийся потомком текущего.
                            В стандартной библиотеке так и запилено, конструкторы многих классов возвращают приватных наследников.

                            > Ну вот тот самый статик инстанс возвращать из init'а. Чтобы внешний код не знал, что это синглтон.
                            Можно запилить статический конструктор с приватным init-ом, а в стандартном init-е бросать исключение.
                            Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8