ЙажаСценарий / Говнокод #28023 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 ASD_77, (Updated )

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

                              Что из этого классы? Структуры? Напиши скрипт, который мне их будет помечать, чтобы я не запутался.
                              Ответить
                  • А почему тогда в кретсах можно определять методы и наследоватья от структуры или саму структуру наследовать?
                    Ответить
                    • ну если в твоей структуре 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, это всё ещё останется классом?
                            Ответить
                  • Бллдяь, круто, я тоже хочу сам себя процитировать.

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

                    666_N33D135


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

                    Web_Monkey

                    > Ко-ко-ко!

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

                1. в различных системах классификации обширная категория объектов объединенных общностью главных признаков
                2. социол. большая группа людей, объединённых общностью положения условий жизни, доходов и т. п.
                3. в учебн. заведениях совокупность учеников школы одного и того же года обучения
                4. в учебн. заведениях совокупность учащихся всех лет обучения конкретного преподавателя в музыкальных образовательных учреждениях
                5. перен. помещение для учебных занятий класса в значении 3
                6. разряд, уровень квалификации
                7. комп., прогр. в объектно-ориентированном программировании определяемый пользователем тип данных, объединяющий прототипические структуры данных и методы работы с ними
                8. предик., сленг очень хорошо
                Ответить
  • 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;
    }
    Ответить
  • 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();
      }
      Именно поэтому я за "Си".
      Ответить
        • А вдруг там на самом деле сложный код, возвращающий разные значения в зависимости от местоположения юзера, фазы Луны и давления воздуха?
          Ответить
          • Я путешествую по самым красивым местам планеты и общаюсь с лесниками
            Ответить
            • На улице темнело, сидел я за столом.
              Лесник сидел напротив, болтал о том, о сём.
              Что нет среди животных у старика врагов,
              Что нравится ему подкармливать волков.
              Ответить
        • Который уже тред от 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());
    }
    Ответить
    • Ну да, в крестах классы и функции не первого класса.
      Но какую проблему решает этот код? Я могу то же самое написать на няшной без этих всех анонимных классов, сохранений классов в переменную и прочего синтаксического мусора.
      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

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

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

Помни, guest, за тобой могут следить!

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


    8