1. JavaScript / Говнокод #28023

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    function getPointFactory() {
        class P {
            x = 0;
            y = 0;
        }
    
        return new P();
    }
    
    function main() {
        const PointZero = getPointFactory();
        print("done.");
    }

    все шах и мат вам... с/c++

    Запостил: ASD_77, 16 Февраля 2022

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

    • ну типа.. я так могу... а вы?
      Ответить
      • никогда не обертывай структуры в классы. За это секир-бошка.
        Ответить
        • это не структура - это класс :)
          Ответить
          • А в чём отличие?
            Ответить
            • если имплементация структур ничем не отличается от классов — это не значит, что это одно и тоже.... "структура - это данные" а классы - это функционал над этими данными
              Ответить
              • Ничего не понял, но осуждаю.
                Ответить
              • >а классы - это функционал над этими данными


                Однажды я спросил восемь оопидоров "что такое класс?" и получил восемь разных ответов
                Ответить
                • Что такое класс?
                  Ответить
                  • Смотря где. Вопрос "чем класс отличается от структуры" совершенно разный ответ имеет в C# и C++, например:) А у Ruby он третий

                    В мое время было популярно определение "это данные, и методы для работы над ними"
                    Ответить
                    • > это данные, и методы для работы над ними

                      Т.е. если я напишу на Си структуру и функции для работы с ней, это будет класс?
                      Ответить
                      • > Т.е. если я напишу на Си структуру и функции для работы с ней, это будет класс?

                        Конечно. Няписать на Си — это класс!
                        Ответить
                  • Класс — в объектно-ориентированном программировании, представляет собой шаблон для создания объектов, обеспечивающий начальные значения состояний: инициализация полей-переменных и реализация поведения функций или методов.


                    ---
                    Вот одно из формальных определений класса: «Класс — это элемент ПО, описывающий абстрактный тип данных и его частичную или полную реализацию»

                    ---

                    Класс В C# описывает объект.

                    ---
                    A Class is like an object constructor, or a "blueprint" for creating objects.

                    --
                    выбирай
                    Ответить
                    • Блядь, какая же хуй-ня все эти определения...
                      Ответить
                      • Причем все определения неправильные, потому что у меня может быть класс со статическими методами только, и с приватным конструктором, и такой класс нельзя инстанциировать. Так что он вообще не для создания объектов
                        Ответить
                        • > со статическими методами только
                          > нельзя инстанциировать

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

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

                            Я даже в С++ могу так сделать, и в ObjC, просто там такой хуйни не творят.

                            Во-вторых во всех случаях я использую ключевое слово "class". Разве это не класс? Как тогда отличить класс настоящий от не настоящего?


                            > По-моему эта хрень вообще не имеет отношения к ООП.


                            Обязателен ли класс для ООП? Что с прототипориентированным оп?
                            Ответить
                            • > статический метод

                              Неведомая ёбаная хуйня, настолько притянутая за уши, что вообще никак не взаимодействует с инстансами класса...

                              Такое ощущение, что ООП-сектанты не умеют применять свой же Single Responsibility Principle и смешали "класс", "пространство имён" и "глобалки" в кучу. Логично, что после такого уже сложно дать определение класса.

                              З.Ы. А на самом деле, им просто стыдно было писать глобалки. Вот они и переименовали их в "статические поля". Хотя это именно глобалки со всеми их проблемами.
                              Ответить
                            • Весь смысл ООП (нет, я про пост-смоллтолк интерпретацию, в которой живем) в том, что first class citizen - это объект, неявный (this) или явный (когда мы дергаем метод _у кого-то_) контекст, в котором вызывается тот или иной метод. Именно поэтому вообще похую в каком языке можно или нельзя делать статику - это все просто функции, а не методы, потому что у них нет этого самого контекста.
                              Ответить
                              • > что first class citizen - это объект, неявный (this)

                                То есть в питоне ООП нет?

                                > контекст, в котором вызывается тот или иной метод.

                                То есть в JS до ES6 ООП нет?

                                > потому что у них нет этого самого контекста.
                                У класс метода в питоне есть.

                                Алсо,

                                // C89
                                void foo(Context context);
                                ////
                                foo(context);

                                ооп?
                                Ответить
                                • > То есть в питоне ООП нет?

                                  Питон не ООП-язык. Начиная с банального len().

                                  > То есть в JS до ES6 ООП нет?

                                  То есть в ES6 завезли классы, а я тебе совсем про другое. this там с незапамятных времен.

                                  > Алсо, ооп?

                                  Конечно нет. Контекст это не такая штука, которая передается. Она может создаваться и видоизменяться под вызов, но не передаваться.
                                  Ответить
                            • > Я даже в С++ могу так сделать, и в ObjC, просто там такой хуйни не творят.

                              Qed.
                              Ответить
                            • > Во-вторых во всех случаях я использую ключевое слово "class". Разве это не класс?

                              Нет конечно. Это пространство имён для самых обычных функций и глобалок. Какой же это класс, если у него нету ни инстансов ни полей ни методов?
                              Ответить
                              • > если у него нету ни инстансов ни полей ни методов?

                                У него есть статические поля и статические методы, не?
                                Ответить
                                • И что эти фейковые "поля" и "методы" умеют кроме инкапсуляции? Какое отношение они имеют к ООП и объектам?
                                  Ответить
                                  • А у объекта что умеют?
                                    Ответить
                                    • > А у объекта что умеют?

                                      Полиморфизм умеют, наследование умеют... Ну, три кита ООП, о которых все так любят говорить.

                                      Напиши-ка мне тесты для статиков. То-то и оно. Обычные глобалки и функции, как во времена фортрана.
                                      Ответить
                                      • Упрямство - это качество человека, присущее ослам
                                        Ответить
                                      • >Полиморфизм умеют, наследование умеют...
                                        У нас в котле все классы по умолчанию final, так что какой же тут полимофризм и наследование?

                                        А в С++ если метод не виртуальный, то ведь тоже никакого оплимморфизма?

                                        Выходит, и там class не class?
                                        Ответить
                                        • > А в С++ если метод не виртуальный, то ведь тоже никакого оплимморфизма?

                                          Я могу добавить virtual и юзать полиморфизм для обычного метода если он мне нужен. Я могу убрать final если мне понадобится наследование.

                                          Но не могу юзать полиморфизм для статика даже если он мне нужен. Это не метод. Это просто функция.
                                          Ответить
                                          • Как ты можешь убрать final у существующего класса?
                                            Ответить
                                            • Блин, я о том что у каких-то классов есть final, у каких-то нету. У каких-то методов есть virtual, у каких-то нету. Но в общем случае методы могут в полиморфизм.

                                              У статических методов в джаве нету никакого полиморфизма, никакими кейвордами их для этого не обмазать и тот же mock для них не сделать без ёбли.

                                              Это просто функция. Старая добрая функция из фортрана.

                                              /thread
                                              Ответить
                                              • Сделай-ка мне Mock для класса File в джаве без боли
                                                cglib разве что
                                                Ответить
                                                • > класса File

                                                  Я тебе про общий случай, а ты мне про какие-то конкретные примеры хуёвого дизайна...
                                                  Ответить
                                                  • Ну просто в джавке замокать НЕ интерфейс не всегда можно, а вроде бы даже финальный класс вообще нельзя
                                                    Ответить
                            • > Обязателен ли класс для ООП? Что с прототипориентированным оп?

                              Хрен знает, если честно. Наверное нет, если мы не будем ограничиваться статической типизацией, а позволим объектам как-то меняться на ходу, адаптироваться под задачу.
                              Ответить
                      • А вот например в перле нет ключевого слова "class", а классы есть.
                        Ответить
                        • Именно поэтому перл не считается классным языком.
                          Ответить
                  • класс описывает объект, структура описывает данные.
                    Ответить
                    • Что такое "объект", что такое "данные"?
                      Ответить
                      • данные - pod.
                        объект - не pod
                        Ответить
                        • А объект не данные?
                          Ответить
                          • > А объект не данные?
                            у меня в гомоиконности нет никаких "объектов" которые не "данные"
                            Ответить
                          • нет конечно, я же написал.
                            Ответить
                            • Является ли объектом структура с указателем на функцию?

                              Кстати, что такое pod?
                              Ответить
                              • верно да.
                                Ответить
                                • // жила была структура
                                  struct foo {
                                   void* bar;
                                  }
                                  // обычная структура
                                  struct foo petuh{.bar = "D"};
                                  
                                  // и вдруг стала классом
                                  struct foo petuhclzzz{.bar = &foo};
                                  Ответить
                              • А теперь представь себе три структуры
                                В одной лежит void*, и используется для передачи всех видов указателей на функции. Почему структура, а не просто void*? Чтобы отличать от void* используемого в других целях на уровне типов.
                                Во второй лежит указатель на функцию определённой сигнатуры. Используется, чтобы передать его куда-то. Отдельная структура, чтобы отличать его от указателей на функцию такой же сигнатуры, используемой в других целях на уровне типов.
                                В третьей лежит указатель на функцию определённой сигнатуры. Используется, чтобы поменять поведение функций, работающих с данным типом.

                                Что из этого классы? Структуры? Напиши скрипт, который мне их будет помечать, чтобы я не запутался.
                                Ответить
                                • Можно прще:
                                  class my_str{
                                      int len;
                                      char *buf;
                                  };
                                  Это класс или структура?
                                  Ответить
                                  • Когда смотришь рекламу, то кажется, что у нас проблемы с подгузниками и прокладками, а питаться нужно только йогуртами
                                    Ответить
                                  • какой C89 :)
                                    Ответить
                                  • класс. он не содержит данных, он содержит диапазон других данных.
                                    Ответить
                    • А почему тогда в кретсах можно определять методы и наследоватья от структуры или саму структуру наследовать?
                      Ответить
                      • И в C# можно
                        Ответить
                      • ну если в твоей структуре vtable появляется то можно начинать называть эту структуру классом
                        Ответить
                        • То есть не виртуальный класс это структура, а структура с виртуальным методом это класс?
                          Ответить
                        • struct foo;
                          struct foo_vtable
                          {
                              int(*)(foo*) f1;
                              int(*)(foo*, int) f2;
                          }
                          
                          struct foo
                          {
                              void* _vtable;
                             
                          }
                          foo* init_foo(foo* f);
                          int foo_f1(void* f)
                          {
                              return *((foo_vtable)_vtable->f1)((foo*)f);
                          }
                          
                          int foo_f2(void* f, int i)
                          {
                              return *((foo_vtable)_vtable->f2)((foo*)f, i);
                          }

                          Это класс?
                          Функционально ничем не отличается от класса в крестах.
                          Ответить
                          • конечно.
                            Ответить
                            • А если я вместо foo_vtable напишу "m0l0k0" то будет уже не класс?
                              Ответить
                              • всё ещё класс будет, ибо объект хранит информацию о том как работать над собой
                                Ответить
                                • > объект хранит информацию о том как работать над собой

                                  if (object.znacheniye < 0) {
                                      foo(object);
                                  } else {
                                      bar(object);
                                  }
                                  Это хранит информацию о том как работать над собой?

                                  if (object.tip == "zelenyi") {
                                      zelenuy_foo(object);
                                  } else if (object.tip == "teplyi") {
                                      teplyi_foo(object);
                                  }
                                  А это?

                                  *call_tablica[object.int_tip](object)
                                  А если мы соптимизируем?
                                  Ответить
                                  • какой багор)))
                                    Ответить
                                    • Если вы думаете, что я злой, то имейте в виду, что добрый
                                      Ответить
                                    • На самом деле ООП — довольно примитивная хуйня. Классами в нём называют типы, объектами — любые значения, а методы — всего лишь сахарок над функциями. ОО код можно написать почти на любом языке от си и паскаля до хаскеля. Например в id software херачили ООП на чистой сишке, в юниксах полно объектов в виде файлов, процессов, устройств и пр.

                                      Все обычно придумывают свои трактовки терминов ООП чтобы отнести угодные к ООП, а неугодные к не-ООП или наоборот. Типа как ты или я.
                                      Ответить
                                      • Ну и нахуя ты влез в наш срач со своим адекватным взглядом на вещи?

                                        Споры по поводу терминов ООП, по-моему, уступают только спорам о каноничных™ реализациях паттернов.
                                        Ответить
                                        • > спорам о каноничных™ реализациях паттернов.

                                          Еще прикольно поспорить насколько какой подхот "пайтоник" или "руби вэй"
                                          Ответить
                                        • > адекватным взглядом на вещи
                                          > 666_N33D135
                                          Ответить
                                        • Ой, прастити.

                                          ООП — это когда пишеш
                                          class Petuh {
                                              function say() {
                                                  echo "kokoko";
                                              }
                                          }
                                          Ответить
                                          • Совешренно верно.
                                            Вместо устаревшего подхода
                                            <?
                                             function say() {
                                                    echo "kokoko";
                                                }

                                            следует использовать современный
                                            <?
                                            class Petuh {
                                                function say() {
                                                    echo "kokoko";
                                                }
                                            }
                                            ?>
                                            <b>
                                            <?
                                            $petuh = new Petuh();
                                            $petuh->say();
                                            ?>
                                            </b>


                                            Невооруженным глазом видно, что второй подход гибче
                                            Ответить
                                • В крестах 42 объект, расскажи, пожалуйста, что он в себе хранит
                                  Ответить
                                • > ибо объект хранит информацию о том как работать над собой

                                  struct ItemWithManual {
                                    char* how_to_work_with_me;
                                  }

                                  а вот это объект?
                                  Ответить
                            • А теперь вот ещё один «класс»
                              struct _vtable_holder
                              {
                                  void* value;
                              }

                              Он возвращается разными хелперами для инициализации «классов», и содержит указатель, который запихивается в класс. Нужен, чтобы не запутаться в сотне разных void*.

                              Хочу заметить, что он абсолютно ничем не отличается от foo и может использоваться вместо него. Это всё ещё класс?

                              А если я заменю void* на int, это всё ещё останется классом?
                              Ответить
                  • > Что такое класс?

                    https://govnokod.ru/27996#comment761886

                    > ООП это вообще хер знает что

                    j123123

                    С классами то же самое.
                    Ответить
                    • Бллдяь, круто, я тоже хочу сам себя процитировать.

                      > Хочу лошадку.

                      666_N33D135


                      > Пошёл нахуй с моей ветки, гандон!

                      Web_Monkey

                      > Ко-ко-ко!

                      Rooster
                      Ответить
                      • Любовь к ближнему, в отличие от любви к конфетам, не приводит к ожирению и кариесу
                        Ответить
                • > Однажды я спросил восемь оопидоров "что такое класс?" и получил восемь разных ответов

                  1. в различных системах классификации обширная категория объектов объединенных общностью главных признаков
                  2. социол. большая группа людей, объединённых общностью положения условий жизни, доходов и т. п.
                  3. в учебн. заведениях совокупность учеников школы одного и того же года обучения
                  4. в учебн. заведениях совокупность учащихся всех лет обучения конкретного преподавателя в музыкальных образовательных учреждениях
                  5. перен. помещение для учебных занятий класса в значении 3
                  6. разряд, уровень квалификации
                  7. комп., прогр. в объектно-ориентированном программировании определяемый пользователем тип данных, объединяющий прототипические структуры данных и методы работы с ними
                  8. предик., сленг очень хорошо
                  Ответить
                • Classes: structures that inherit

                  Ну как получил ответ?
                  Ответить
    • void* getPointFactory()
      {
          struct P { int x = 0, y = 0; };
          return new P();
      }
      
      int main(void)
      {
          struct PointZero { int x = 0, y = 0; } &pointZero = *static_cast<PointZero*>(getPointFactory());
          printf("done.\n");
      
          delete &pointZero;
          
          return 0;
      }
      Ответить
      • del
        Ответить
      • я не могу смотреть на этот кошмар :)
        Ответить
      • Что же это, как будто в 98 году живём, честное слово.
        #include <memory>
        #include <iostream>
        
        auto getPointFactory()
        {
            struct P { int x = 0, y = 0; };
            return std::make_unique<P>();
        }
        
        int main()
        {
            auto pointZero = getPointFactory();
            std::cout << pointZero->x << ' ' << pointZero->y << '\n';
        }

        http://coliru.stacked-crooked.com/a/019ef1ddf0aae2cb
        Ответить
        • в рантайме не будет работать, а слово Factory намекает на присутствие злого духа
          Ответить
          • Почему не будет работать?

            Чувак, ключевые слова "new" и "delete" не нужны в 99.99999% случаев. Использование их почти всегда говорит о низком качестве кода
            Ответить
            • Именно поэтому я за malloc и free.
              Ответить
              • Именно поэтому я за сатаническую память.

                Использование демонической мапяти почти всегда говорит о низком качестве кода
                Ответить
                • анука напиши мне возврат сроки из функции использую исключительно статическую память

                  пример
                  char* add(char* s, char* p)
                  {
                  auto r = s + p;
                  return r;
                  }
                  Ответить
          • inline auto getPointFactory()

            Починил
            Ответить
        • А "P" создастся на стеке и потом скопируется в кучу, или она оптимизируется? А можно сразу ее в куче создать, то есть сразу в make_unique описать этакую анонимную структуру?
          Ответить
          • P — описание класса, оно ещё ничего не создаёт.
            Создание идёт в make_unique, которое сразу создаёт объект в куче.
            Вообще куча, в принципе, и не нужна, можно заставить getPointFactory возвращать объект по значению.

            http://coliru.stacked-crooked.com/a/c346d56a168707bf
            Ответить
          • в шаблонах нельзя определять типы. как и в decltype.
            так что не выйдет.
            Ответить
        • В "D" такое говно называется "Voldemort type"

          https://wiki.dlang.org/Voldemort_types
          Ответить
          • Девушки, которые увлекаются веганами, рожают только девушек
            Ответить
          • В "Zig" еще вот такое https://ziglang.org/documentation/0.8.1/#Generic-Data-Structures
            Ответить
          • А вот в крестах:
            https://gist.github.com/mosra/7363ac0f226f6370c78d
            Ответить
    • ,,,
      Ответить
    • struct Point {
          int x;
          int y;
      };
      
      struct Point zeroPoint = {0, 0};
      Классы-хуяссы, фабрики-хуябрики...
      Ответить
      • struct Point {int x, y;} getPointFactory()
        {
            return (struct Point){0, 0};
        }
        
        int main()
        {
            struct Point zeroPoint = getPointFactory();
        }
        Именно поэтому я за "Си".
        Ответить
        • > factory
          struct Point {
              int x, y;
          } zeroPoint = {0, 0};
          ООПляди соснули.
          Ответить
          • 0 0 2CONSTANT zeroPoint

            Типизированные бляди сонулли!
            Ответить
          • А вдруг там на самом деле сложный код, возвращающий разные значения в зависимости от местоположения юзера, фазы Луны и давления воздуха?
            Ответить
          • struct {
                int x, y;
            } zeroPoint = {0, 0};


            Нейминг-бляди соснули.
            Ответить
            • Я путешествую по самым красивым местам планеты и общаюсь с лесниками
              Ответить
              • На улице темнело, сидел я за столом.
                Лесник сидел напротив, болтал о том, о сём.
                Что нет среди животных у старика врагов,
                Что нравится ему подкармливать волков.
                Ответить
          • Который уже тред от ASD.
            Сишка всё так же непринуждённо сливает в хламище всю скриптуху.
            Ответить
            • А куда пропал ASD? Давно никто дампиков не присылал..
              Ответить
              • Да я сам задался таким вопросом. Так и попал в этот тред.

                С большим удовольствием прочёл дискач об опеределениях термина «класс».
                Ответить
    • Ебать говно, можно описать тип внутре функции и потом вернуть его?
      Ответить
      • прикинь
        Ответить
        • Ну и говно.
          Ответить
          • А в питухоне я в метод могу передать функцию, из которой вернуть метакласс, на основе которого создать другой метакласс, из которого создать класс, из статичного метода которого вернётся функция, которая создаст объект этого класса, у которого будет метод, в который мы в самом начале передавали функцию.

            Нахуя я ещё не придумал, но можно.
            Ответить
    • шах и мат вам

      function getClass() {
          let Point = class {
              constructor(public x: number, public y: number) { }
              public length() {
                  return (this.x * this.x + this.y * this.y);
              }
          };
      
          return Point;
      }
      
      function main() {
          const PointClass = getClass();
          const p = new PointClass(3, 4); // p has anonymous class type
          print(p.length());
      }
      Ответить
      • Длина точки.
        Ответить
        • длинна точки равна = 0. это знают даже дети
          Ответить
      • Ну да, в крестах классы и функции не первого класса.
        Но какую проблему решает этот код? Я могу то же самое написать на няшной без этих всех анонимных классов, сохранений классов в переменную и прочего синтаксического мусора.
        getClass семантически это типичная фабрика фабрик.
        Ответить
      • Не, знаю, что делает этот кот, но
        : p-length  DUP * SWAP DUP * + ;
        
        3 4 VALUE p
        p p-length .
        Ответить
      • Переписал на powershell:
        PS> function getClass {
        >>   class Point {
        >>     [int]$X; [int]$Y
        >>     Point($x, $y) { $this.X = $x; $this.Y = $y }
        >>     [int] length() { return $this.X * $this.X + $this.Y * $this.Y }
        >>   }
        >>   return [Point]
        >> }
        PS> function main {
        >>   $PointClass = getClass
        >>   $p = $PointClass::new(3, 4)
        >>   $p.length()
        >> }
        PS> main
        25
        Ответить
        • А ">>" в каждой строчке обязательно писать?
          Ответить
          • Нет, это автозаполнение в самой консоли, как и "PS> ". Прост по-другому красиво скопировать не получится.
            Ответить
            • Ааа. А если я пишу не в консоли, мне их самому писать надо?
              Ответить
              • Нет, их писать, вообще, не надо, а то не заработает.
                Ответить
                • В консоли с ними работает, но их не надо писать, потому что они автозаполняются. А если писать не в консоли их не надо писать, они тоже автозаполняются? А если их написать они не работают, т.е. не автозаполняются, а надо чтобы они автозаполнялись. А если их не писать, они работают и автозаполняются. А зачем они вообще нужны?

                  Ничего не понимаю...
                  Ответить
        • Кстати, в моём варианте каждый вызов функции не создаёт новый класс, а использует существующий:
          PS> (getClass) -eq (getClass)
          True

          А вам слабо!?
          Ответить
    • Треды ASN 77 (JHUAPL-AS - Johns Hopkins University Applied Physics Laboratory) в последнее время напоминают тик-ток челленджи, типа вылить на себя ведро воды, полежать на холодильнике, постоять цаплей...
      Ответить
    • ASD, а у тебя есть UB?
      Ответить
      • А у тебя?

        А давайте мерятся, у кого UB больше!
        Ответить
      • компилятор - один большой UB времени нет нормально писать
        Ответить

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