"PHP" / Говнокод #27269 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
<?php
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); 

if($_POST['SESS_PARAM'] && $_POST['SESS_PARAM'] !='' && $_POST['SESS_PARAM_VALUE'] && $_POST['SESS_PARAM_VALUE'] !=''){

	$_SESSION[$_POST['SESS_PARAM']] = $_POST['SESS_PARAM_VALUE'];
	echo 'ok';
}else{
	echo 'error';
}

утверждают что сайт им писали лучшие из лучших

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

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

  • Это конечно очень плохо, но вероятно в мире "пхп" по другому и не бывает
    Ответить
        • никто меня не поломал

          это я узнал пароль от ракоучётки

          почему-то он кажется подозрительно знакомым))
          Ответить
          • Да ну его, хорманда, лучше подбери пароль от KoLLIKOgEBo4Kи, а то я забыл (((
            Ответить
          • Как же это низко, использовать куски моего ника в пароле говноучетки, с которой пишут всякую хуйню.
            Ответить
      • Здравствуйте, это канал о "РНР"?

        Какое аниме посоветуете?
        Ответить
        • Здравствуйте!

          Посоветываю: Naruto, Dragon Ball Z, Boruto: Naruto, Pokemon, One Piece, Boku no Pico.
          Ответить
            • Почему в С++ есть возможность приватно наследовать класс, а в пидорских языках-- нету?
              Потому что наследование ради реализации это пидорство?
              Ответить
              • У меня в Си никаких классов и наследований нет, именно поэтому я за Си.
                Ответить
                    • из структуры с указателями на функции вполне можно навалить объектик, а если скастить, то даже и наследование интерфейса

                      Но вообще отсутствие классов делает многие вещи проще
                      * проще делается ОРМ
                      * не нужно думать про вызовы деструкторов
                      Ответить
                      • Какое отношение имеет вызов деструктора к наличию классов?
                        Ответить
                        • В языках, где нету классов (таких, как plain c), как правило нет деструкторов, и освобождение памяти не приводит к вызову кода
                          Ответить
                          • В языках, где нету классов (таких, как js), как правило нет деструкторов, и освобождение памяти не приводит к вызову кода.
                            Ответить
                                • Как там, в 2014-м? Доллары купи.

                                  А вообще да: жабаскриптерские петушки пятьнадцать лет кукарекали нам о прелестях прототип-ориентированного ООП.

                                  --у вас в JS нету классов
                                  --ко-ко-ко, у нас есть прототипы, это намного лучше, ты просто не умеешь ими пользоваться

                                  При этом в каждой библиотеке был свой способ наследования.

                                  А потом в js завезли "class", и министерство правды сказало, что классы это хорошо.

                                  И петушки развернулись на 180 градусов.

                                  Такая же хуйня у скриптопитушков происходит со стат типизацией
                                  Ответить
                                  • иди в другое место оффтопь, здесь тред про деструкторы
                                    Ответить
                                      • Борманд, это не деструкторы, а говно.
                                        В жабе тоже есть finalize, а в C# finalize и ~, но когда они вызовутся, и вызовутся ли вообще -- этого никто не знает.

                                        Для JVM Шипилёша вообще напилил такой GC, который никогда не вызывается. Сколько памяти сначала есть, столько и будет (забыл, как этот "GC" называется).

                                        Так вот:

                                        A FinalizationRegistry object lets you request a callback when an object is garbage-collected.

                                        А когда? Когда рак на горе свиснет.

                                        Ну и чтобы отсос был особенно полным, прямо на мозиле написано

                                        A conforming JavaScript implementation, even one that does garbage collection, is not required to call cleanup callbacks.
                                        Ответить
                                    • извините

                                      трудно пройти мимо скриптоблядей, и не обоссать их. Сами понимаете..


                                      Так вот. Деструкторы позволяют освобождать ресурсы детерменированно. В языках для анскильных обезъян (типа джавы, котлина и C#) деструкторов по сути нет, потому они пилят свои using, и closable disposable.
                                      В то время как программисты на нормальных языках (типа C++) смотрят на них как на идиотов
                                      Ответить
                                        • могу ошибаться, но кажется, что в кокок нэйтив в рантайм впихнули GC (ну как в Go видимо), так что деструкторов там нормальных тоже нет
                                          Ответить
                          • Освобождение памяти не приводит к вызову кода, потому что программист вынужден вручную закрывать коннекшоны, сокеты и файлы, что обычно делается в деструкторах. Сомнительный плюс, если честно.
                            Ответить
                            • Ты сейчас о джаве, шарпе, питоне и им подобных "высокоуровневых" языках?
                              Ответить
                              • Да! Люблю, когда GC просыпается раз в 15 минут, и из-за close() в «деструкторе» какой-нибудь файл в этот промежуток времени невозможно снова открыть.
                                Ответить
                            • всякое бывает, но я обычно стараюсь делать отдельные функции, внутри которых происходит открытие/закрытие ресурсов, а не помещать их в конструкторы или деструкторы
                              Ответить
                              • А если ресурс должен пересечь границы функции?
                                Ты создал объект, который отражает какую-то структуру в операционке (ну там GDI в винде или это слушающий сокет в классе, представляющем сервер)

                                В С++ можно каждый внешний ресурс обернуть в класс. Да, кода придется писать много (хотя бывают готовые шаблоны), но зато ты точно будешь знать, что кода объект умрет -- ресурс закроют.

                                А джавабляди вручную управляют ресурсами, как в сишечкеи
                                https://plugins.jetbrains.com/docs/intellij/disposers.html
                                Ответить
                                      • > ресурс пересёк границы функции

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

                                          имелись в виду конечно методы класса, иначе зачем там дырка? при чём конструкторы?
                                          Ответить
                                          • Зачем? Зачем? Или у тебя многоразовые объекты, чтобы можно было открывать-закрывать файл и противно скрипеть петлями?
                                            Ответить
                                          • какая разница метод или функция?

                                            Вот на С++ у меня есть класс, в констркторе которого открывается сокет, а в десутркторе закрывается.
                                            У него так же есть метод "послать в сокет говна".

                                            Я создал объект класса, попользовался им сколько нужно, и он потом уничтожлился, и закрыл сокет.
                                            Причем если я не дурак, и не пользовался new, то скорее всего он уничтожится сам (и сокет закроется)

                                            как мне это сделать на жабе?
                                            Ответить
                                            • почему ты всегда спрашиваешь меня про жабу? я в гробу видел жабу, честно

                                              в Свифте у меня может быть объект, который конструируется in place (проперти сразу присваивается значение) или какой-нибудь lazy. Если у него в ините сидит открытие ресурса, которое может по какой-то причине тупить, то будет и не приятно, и не очень детерминировано
                                              Ответить
                                              • Потому что мы говорим про GC. В свифте же RC?

                                                не понял, что неприятного в открытии ресурса в конгструкторе, пусть и тупящего.

                                                Это явно лучше, чем отдельный метод open, добавляющий в объект лишний state

                                                >и не очень детерминировано
                                                Почему?

                                                К моменту создания объекта ресурс открыт, всё логично
                                                Ответить
                                                • ну тебе лучше, пиши так

                                                  мне так не лучше

                                                  закрыли тему

                                                  заебали со своей жабой блять
                                                  Ответить
                                                  • это теперь уже не имеет отношения к жабе

                                                    почему ты против открытия сокета или файла в конструкторе?
                                                    Ответить
                                                      • почему тупить в конструткоре плохо, а в методе open() хорошо?
                                                        Ответить
                                                        • 1) потому что init должен быть максимально легковесным
                                                          2) в языках вроде Свифта инициализация поля может пройти в разных местах в разное время, отсюда некая недетерминированность
                                                          3) открытие ресурса не есть ИМХО логикой инициализации (только не надо про raii), а потому должно быть вынесено из инициализации - семантически мне так нравится

                                                          ты удовлетворён?
                                                          Ответить
                                                          • 1. почему?
                                                            2. то есть ты не знаешь, когда будет вызван конструктор?
                                                            3. почему не надо по raii?
                                                            Ответить
                                                            • 1) почему нет? почему инициализация обязана быть тяжёлой?
                                                              2) в целом знаю, но это может быть неявно выражено в коде
                                                              3) потому что это чисто крестовая приблуда, которая к другим языкам не применима
                                                              Ответить
                                                              • 1) инициализация может быть тяжелой или легкой, это совершенно не важно.

                                                                В общем случае не существует требования "инициализация должна быть быстрой".

                                                                Однако есть фреймворки, которые требуют быстрого создания объекта (например, потому что он создается на UI треде).

                                                                Это особенность фреймворка, но не общее правило.

                                                                2) и что плохого в том, что в какой-то момент создастся объект и сделается запрос?

                                                                3) ну вообще RAII не привязана к конкретному языку, и кажется, что в языках с RC она тоже может быть реализована.
                                                                Ответить
                                                        • ну и

                                                          4) в логике фреймворков типа UIKit создание некоторых объектов и назначение этим объектам неких ресурсов разнесены во времени, как и обратные действия
                                                          Ответить
                                                        • считаешь ли ты, что нормально делать http-запросы прямо из конструктора?
                                                          Ответить
                                                          • вполне считаю.

                                                            гораздо хуже вводить в обект лишнее состояние, и делать его мутабельным
                                                            Ответить
                                                            • ну понятно

                                                              тогда мы друг друга не поймём

                                                              пойду поем
                                                              Ответить
                                                              • Приятного аппетита!

                                                                Кстати, это всё сильно зависит от ЯП, в жабе, например, хуй что в конструкторе сделаешь, потому что там крайне не рекомендуется бросать исключения (а в йаже почти всё их кидает).
                                                                Ответить
                                                                • почему и кто не рекомендует?

                                                                  Скорее уж не рекомендуется это делать в С++, потому что у тебя пол объекта будет инициализирвано, а деструктор не вызовется.

                                                                  Потому в С++ принято (ну, насколько я могу судить) оборачивать в классы каждый ресурс
                                                                  Ответить
                                                                  • > потому что у тебя пол объекта будет инициализирвано, а деструктор не вызовется

                                                                    Да и похуй. У полей и локалок, которые прошли инициализацию, деструктор вызовется.
                                                                    Ответить
                                                                    • Это если они тоже завернуты в RAII.

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


                                                                      А ты что думаешь про нашу дискуссию с Десктопом, кстати?
                                                                      Ответить
                                                                      • Про хттп запросы из конструктора?

                                                                        Вай нот, если он не дефолтный. Ничему особо не мешает.
                                                                        Ответить
                                                                        • А чем плох дефолтный?

                                                                          У меня есть класс, представляющий вебсайт. В него зашит урл сайта (красоту хардкода пока оставим за скобками). При создании объекта он всасывает в себя сайт.

                                                                          Я серьезно не понимаю, почему так нельзя. Конечно, если нет требований фреймворка "создавать объект быстро"
                                                                          Ответить
                                                                          • С дефолтным есть риск отстрелить себе яйца. Случайно создавать тяжёлую хуйню как-то не айс.

                                                                            Хотя бы фейковый аргумент надо, имхо.
                                                                            Ответить
                                                                              • Обычно от дефолтного конструктора ожидаешь что он лёгкий и быстрый.

                                                                                Если это не так, лучше его убрать. Зачем расставлять грабли.
                                                                                Ответить
                                                                                • Почему вы все этого ожидаете?

                                                                                  Я вот ожидаю, что объект после создания будет в инициализированном состоянии, готовом к использованию.
                                                                                  Иначе зачем мне раии?
                                                                                  Ответить
                                                                                  • Тебя никто не заставляет добавлять специальный стейт. Всегда можно убрать/запретить дефолтный конструктор если он не имеет смысла.

                                                                                    Его просто слишком легко позвать не подумав.
                                                                                    Ответить
                                                                                    • мне не нравится фейковый аргумент, если честно. Пахнет костылём.


                                                                                      Скорее всего ты говоришь с позиции С++сника, где невинное
                                                                                      Foo foo;

                                                                                      может вызвать бурю.

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

                                                                                      Трудно "случайно" написать
                                                                                      Foo foo = new Foo();


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

                                                                                        Фейковый аргумент костыль конечно, но я реально не помню чтобы у меня был тяжелый конструктор, у которого не было бы аргументов.

                                                                                        > фабричный метод

                                                                                        Ну тоже норм.
                                                                                        Ответить
                                                                                        • В игре может быть объект, который загружает какие-то текстуры в память, или оборачивает работу с видеоапаптером, переключая его в нужный режим (довольно медленная операция так-то).

                                                                                          Но такие объекты должны быть синглтонами конечно, а не создаваться на каждый чих

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

                                                                                            А всякие ResourceLoader да VideoAdapter тяжёлую работу скорее всего в методе делать будут. Ибо менять разрешение на ходу или загружать следующий уровень захочется. Странно это делать в дефолтном конструкторе.
                                                                                            Ответить
                                                                                            • Это зависит от архитектуры:) Иная тула может и не позволять менять разрешение, например.

                                                                                              А загруженный уровень можно выкинуть вместе с текстурами, но в такой класс конечно нужно передавать как минимум номер уровня
                                                                                              Ответить
                                                                                              • Ну если не позволяет, то скорее всего это разрешение в конструктор и передашь.
                                                                                                Ответить
                                                                                                • или захардкожу, лол.

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

                                                                                            - никогда больше такого не говори никому
                                                                                            Ответить
                                                                                            • Почему?

                                                                                              На компьютере есть как правило один видеоадаптер. Какой смысл иметь несколько объектов для работы с ним?

                                                                                              Если тебя смущает, что время жизни синглтона не определено, то можно конечно хранить его на стеке main, например. Он явно разрушится, когда завершится main.
                                                                                              Но это всё равно будет один объект
                                                                                              Ответить
                                                                                              • > один видеоадаптер
                                                                                                - возьми любой практически ширпотребный ноутбук и пойми, как ты ошибаешься

                                                                                                > Какой смысл иметь несколько объектов для работы с ним?
                                                                                                - не с ним, а с ними

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

                                                                                                синглтон не просто так считается анти-паттерном
                                                                                                Ответить
                                                                                                • >- возьми любой практически ширпотребный ноутбук и пойми, как ты ошибаешься

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

                                                                                                  >а потом не могли открыть два документа одновременно
                                                                                                  Это проблема неверного использования синглтона.

                                                                                                  >синглтон не просто так считается анти-паттерном
                                                                                                  Кем считается?
                                                                                                  Ответить
                                                                                                  • > Трудно представиь себе игру, которая работает одновременно с двумя видеоадаптерами

                                                                                                    - кто сказал про ОДНОВРЕМЕННО? Ты зашёл в настройки и переключил рендеринг на другой адаптер. А у него УЖЕ ЕСТЬ объект, настроенный на работу с ним (ну или ты его создал из фабрики).

                                                                                                    > Это проблема неверного использования синглтона.
                                                                                                    - у синглтона практически нет примеров верного использования, кроме каких-то application wide настроек, и то
                                                                                                    Ответить
                                                                                                    • Если твоя игра поддерживает переключение на другой видеоадаптер, то да. Простые игры вполне могут это не поддерживать.

                                                                                                      >кроме каких-то application wide настроек
                                                                                                      Вполне себе хороший пример.

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

                                                                                                        - какая разница, мы про техническую возможность. А ты как уж на сковородке)
                                                                                                        Ответить
                                                                                                        • Я привел пример ситуации, в которой синглтон допустим.
                                                                                                          Ты привел пример противоположной ситуации.
                                                                                                          Разумеется, синглтон (как и любой другой паттерн) не универсален.

                                                                                                          Игра может вообще иметь интерфейс с доступом по сети, и тогда класс для видеоадаптера ей не нужен, однако это не значит, что такой класс не нужен никогда
                                                                                                          Ответить
                                                                                                          • что значит "допустим"? если мы пишем write'n'throw булшит, то допустимо вообще всё!

                                                                                                            > Игра может вообще иметь интерфейс с доступом по сети

                                                                                                            - В большинстве своем сальпы и огнетелки очень теплолюбивы, поэтому встречаются только в экваториальных и тропических водах. Лишь несколько видов живут в полярных районах. К тому же животные эти очень требовательны к солености воды, они обитают только в тех морях и частях океана, где она составляет 33—35 ‰. В Восточном Средиземноморье, где соленость доходит до 40 ‰, а также в местах впадения рек, где она понижена, сальпы и пиросомы не живут.
                                                                                                            Ответить
                                                                                                              • ну вот это едва ли не единственное более-менее вменяемое употребление синглтона

                                                                                                                > Твое утверждение "синглтон не нужен"

                                                                                                                - покажи, где такое утверждение? есть редкий класс задач, где он полезен. в остальном это анти-паттерн.
                                                                                                                Ответить
                                                                                                                • Ты сказал
                                                                                                                  [quote]
                                                                                                                  синглтон не просто так считается анти-паттерном
                                                                                                                  [/quote]

                                                                                                                  Из определения антипаттерна следует, что

                                                                                                                  Another solution to the problem the anti-pattern is attempting to address exists, and documented, repeatable and proven to be effective where the anti-pattern is not

                                                                                                                  Иными словами, антипаттерн всегда можно заменить на более верное решение.

                                                                                                                  А в данном случае вряд-ли существует более верный solution, так что singleton антипаттерном не является.


                                                                                                                  >есть редкий класс задач, где он полезен. в остальном это анти-паттерн.

                                                                                                                  Любое решение подходит для одного класса задач, и не подходит для другого. Это не делает его антипаттерном.

                                                                                                                  Действительно, задач для синглтона немного, но они есть.

                                                                                                                  Возвраясь к примеру с игрой: если игра при запуске настраивает видеоадаптер, а при завершении возвращает настройки, и перенастройку не поддерживает (большинство игр, выпущенных до второй половины 90-х, смену разрешений не поддерживали, например) то синглтон является вполне допустимым представлением видеоадаптера
                                                                                                                  Ответить
                                                                                                                  • > так что singleton антипаттерном не является.
                                                                                                                    - конечно является

                                                                                                                    > Это не делает его антипаттерном
                                                                                                                    - конечно делает

                                                                                                                    > вряд ли существует более верный solution
                                                                                                                    - класс Application это прибитый гвоздями обработчик системных событий, программисту апи-пейсатели так прямо и говорят: у тебя, шакалёнок, может быть только один, сука, обработчик. Более верный solution? Помогите Даше найти

                                                                                                                    > большинство игр, выпущенных до второй половины 90-х, смену разрешений не поддерживали

                                                                                                                    - как обычно, в ход пошли какие-то примеры, которые не имеют ни малейшего отношения к обсуждаемой теме. В такой момент становится понятно, что аргументы Макаки иссякли 🙂

                                                                                                                    спасибо, я всё! доброй ночи
                                                                                                                    Ответить
                                                                                                                    • >- конечно является
                                                                                                                      нет
                                                                                                                      > - конечно делает
                                                                                                                      нет

                                                                                                                      > класс Application это прибитый гвоздями обработчик системных событий

                                                                                                                      нет, это API для доступа к приложению. Я же дал ссылку.

                                                                                                                      >как обычно, в ход пошли какие-то примеры, которые не имеют ни малейшего отношения к обсуждаемой теме.

                                                                                                                      Ты сообщил, что singleton это антипаттерн, я привел пример его использования.

                                                                                                                      > В такой момент становится понятно, что аргументы Макаки иссякли

                                                                                                                      написал человек с аргументами
                                                                                                                      "- конечно является" и "- конечно делает"

                                                                                                                      >доброй ночи
                                                                                                                      доброй ночи
                                                                                                                      Ответить
                                                                                                                      • > написал человек с аргументами

                                                                                                                        - так это я тебя косплеил, твой стиль) всё, ушёл
                                                                                                                        Ответить
                                                                                                                        • У меня не было такого стиля до последнего сообщения, где я как раз склосплеил тебя.

                                                                                                                          Мне кажется, что ты рассматриваешь вопросы с точки зрения IOS программиста.

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

                                                                                                                          Работа с HTTP там так же реализуется через фоновый поток (делается ли это через GCD или по другому -- не важно, важно, что это не делается на main).

                                                                                                                          Но такие приложения это только небольшая часть всего софта, что пишут люди, и приемы, которые недопустимы в IOS, вполне могут быть допустимы в других областях.

                                                                                                                          Потому что в разных областях допустимы разные приемы.
                                                                                                                          К примеру, jциферки или Борманд может писать в порты оборудования напрямую, а фронтэндер bootcamp скорее всего так делать не будет никогда, и вероятно ты в IOS тоже не будешь.

                                                                                                                          Это, однако, не значит, что работа с оборудованием напрямую это антипаттерн.

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

                                                                                    используй статические методы "класса" и теки
                                                                                    Ответить
                                                                                    • А причем тут ооп?

                                                                                      Чем меньше стейтов есть у объекта -- тем лучше. В идеале он один. Не понимаю, как это противоречит ооп
                                                                                      Ответить
                                                                                      • потому что ООП это в целом про стейт

                                                                                        не хочешь стейт, не бери ООП
                                                                                        Ответить
                                                                                        • С чего бы это?

                                                                                          ООП это про объединение в одной сущности данных и методов для работы с ними.

                                                                                          Хрестоматийный пример ООП, просто из палаты мер и весов: получает все параметры в конструкторе, имеет только один стейт, и никогда его не меняет
                                                                                          class Name {
                                                                                              constructor(readonly firstName: string, readonly lastName: string) {
                                                                                              }
                                                                                          
                                                                                              asEnglishName(): string {
                                                                                                  return `${this.firstName} + ${this.lastName}`;
                                                                                              }
                                                                                          
                                                                                              asEasternEuropeanName(): string {
                                                                                                  return `${this.lastName} + ${this.firstName}`;
                                                                                              }
                                                                                          }
                                                                                          Ответить
                                                                                          • > Хрестоматийный пример

                                                                                            - тебе на работе платят за копипасту хрестоматийных примеров из википедии или всё же за реальный осмысленный код?

                                                                                            или ты только с DTO и работаешь?
                                                                                            Ответить
                                                                                            • Это не копипаста.

                                                                                              Мне платят за реальный код, в котором бОльшая часть классов получает свой стейт в конструкторе и иммутабельна. Это никак не мешает мне работать с ООП.
                                                                                              Ответить
                                                                                              • мне было бы скучно целыми днями писать тупые модели (тупые в том смысле, что они не знают про бизнес-логику)

                                                                                                с другой стороны, судя по всему, на такой работе остаётся много времени, чтобы, например, обсирать "бойлерплейт" в Джаве
                                                                                                Ответить
                                                                                                • Я не понимаю, почему иммутабельные объекты должны не знать про бизнес логику.

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

                                                                                                      Если тебя смущает недостаточное количество логики, то вот тебе классическая стратегия
                                                                                                      interface BuyTicketsStrategy {
                                                                                                          buyTickets(num: number): void;
                                                                                                      }
                                                                                                      
                                                                                                      class BuyTickersOnlineStrategy implements BuyTicketsStrategy {
                                                                                                       //тут логика
                                                                                                      }
                                                                                                      
                                                                                                      class BuyTickersOffline implements BuyTicketsStrategy {
                                                                                                       //тут тоже логика
                                                                                                      }
                                                                                                      
                                                                                                      function doAll(tickets: BuyTicketsStrategy): void {
                                                                                                          tickets.buyTickets(getNumOfTickets());
                                                                                                      }


                                                                                                      никакого стейта нет, а ооп есть.

                                                                                                      ООП не требует, чтобы классы имели мутабельный стейт.
                                                                                                      Ответить
                                                                                                      • > ты сказал, что без мутабельности не бывает ООП

                                                                                                        - покажешь где?
                                                                                                        Ответить
                                                                                                          • именно то и имел в виду.

                                                                                                            если тебе нужны тупые данные без состояний, то бери язык без ООП, хуярь в нём структуры и обрабатывай при помощи чистых функций. зачем тебе ООП?
                                                                                                            Ответить
                                                                                      • ну и, кстати, вот тебе один стейт:

                                                                                        let obj = MyObj()
                                                                                        obj.get(url)
                                                                                        Ответить
                                                                                        • если url или результат вызова get сохраняется внутри класса в каком-то поле, то стейта будет уже два.
                                                                                          Ответить
                                                                                          • а, если ты отошлёшь запрос из конструктора, то результат вызова конечно сохранится в швейцарском банке?))

                                                                                            если бы у бабушки были...
                                                                                            Ответить
                                                                                            • Если я отошлю запрос из конструктора, то я смогу сохранить его в поле объекта.

                                                                                              В таком случае у объекта будет одно состояние: инициализирован ответом, вот этот ответ в поле лежит.

                                                                                              Если я сделаю для запроса отделтный метод, то у объекта будет два состояния:

                                                                                              * запрос еще не сделали, и в поле лежит хуй (null? пустая строка? что там должно быть?
                                                                                              * запрос уже сделали, и в поле лежит ответ

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

                                                                                              Не говоря уже о том, что это сделает его не потокобезопасным
                                                                                              Ответить
                                                                                              • если запрос по дороге обломается, то ты BSOD выкинешь, чтобы только второй стейт не вводить?

                                                                                                > Не говоря уже о том, что это сделает его не потокобезопасным
                                                                                                - пошла софистика
                                                                                                Ответить
                                                                                                • Если запрос по дороге обламается, то смысла в таком объекте нет, и я кину исключение.

                                                                                                  Объект не создастся, и проблемы не будет.

                                                                                                  >>потокобезопасным
                                                                                                  >- пошла софистика
                                                                                                  Верно ли я понимаю, что тебе не приходилось сталкиваться с вопросами потокобезопасности? Если приходилось, тогда что ты имел ввиду, говоря о софистике?
                                                                                                  Ответить
                                                                                                  • > что ты имел ввиду
                                                                                                    - если ты видишь что-то непотокобезопасное, а тебе его надо сделать потокобезопасным, сделай. Любой нормальный язык тебе даёт всё для этого. К теме разговора это отношения не имеет
                                                                                                    Ответить
                                                                                                    • Иммутабельные объекты потокобезопасны по умолчанию, а явная синхроинзация объекта не бесплатна во всех известных мне языках
                                                                                                      Ответить
                                                                                                      • про "это сделает его не потокобезопасным" ты всё равно напиздел, извини
                                                                                                        Ответить
                                                                                                        • Почему напиздел?

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

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

                                                                                                          Что не так?
                                                                                                          Ответить
                                                                                                          • "мутабельность стейта" не является частью публичного апи в данном случае, а потому ничем не грозит по сравнению с твоим подходом. это первое.

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

                                                                                                            или ты щас скажешь, что async/await есть в каждом мейнстримовом языке?))
                                                                                                            Ответить
                                                                                                            • >не является частью публичного апи в данном случае

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

                                                                                                              > а ты типа собрался хттп-запрос делать из того же потока, в котором конструктор позвали?
                                                                                                              Да.

                                                                                                              >то есть, вызвали на main, всё, блочим UI
                                                                                                              Объект ничего не знает о том, в каком потоке его будут вызвать.
                                                                                                              Существует огромное количество ситуаций, когда поток можно блочить: это фоновая обработка задач, работа в командной строке, в сценарии, итд.

                                                                                                              Если фреймворк запрещает медленные конструкторы, но конечно ничего загружать в них нельзя, о чём я почти сразу и написал:

                                                                                                              [quote]
                                                                                                              Однако есть фреймворки, которые требуют быстрого создания объекта (например, потому что он создается на UI треде).
                                                                                                              [/quote]
                                                                                                              Ответить
                                                                                                              • ну понятно

                                                                                                                в общем, если ты вдруг будешь писать UI, попробуй сделать именно так: отправить хттп-запрос из конструктора в похуй каком потоке, сделай ревью.

                                                                                                                Интересно будет почитать причитания о том, как злые коллеги не хотят его апрувить)
                                                                                                                Ответить
                                                                                                                • Классы для работы с http и полученными по http данными обычно ничего не знают про UI поток.

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

                                                                                                                    тебе надо знать про поток выполнения. а он должен быть специальным для работы с сетью. Именно для того, чтобы не блокировать пользовательский интерфейс.
                                                                                                                    Ответить
                                                                                                                    • Объект может сам разместить задачу на таком потоке, а может и ничего не знать о потоках вообще, и для его использования клиент сам должен будет вызвать его на верном потоке.

                                                                                                                      Второй способ более универсален, так как кроме UI приложений, есть еще и другие приложения.
                                                                                                                      Ответить
                                                                                                                      • то есть тебе ок просто так с нихуя заблокировать текущий поток управления ресурсоёмкой операцией?

                                                                                                                        это правда где-то может сойти за адекватное решение, кроме наколеночного скрипта?
                                                                                                                        Ответить
                                                                                                                        • Мне даже ок заблокировать его чтением из stdin, который будет ждать завершения ввода от пользователя.

                                                                                                                          Так работают очень многие утилиты командной строки, например.

                                                                                                                          Разумеется, делать так UI нельзя. Это требование фреймворка (всех фреймворков для работы с UI), о чём и было сказано изначально
                                                                                                                          Ответить
                                                                                                                          • утилита командной строки это очень хорошо, там небось вообще можно один раз всё создать, выполнить funcii и умереть, высравшись в аутпут

                                                                                                                            а "энтерпрайз приложение" где здесь?
                                                                                                                            Ответить
                                                                                                                            • >выполнить funcii
                                                                                                                              не понятно, почему интерфейс вывода (командная строка, ui, web итд) должен как-то влиять на использование или не использование ООП

                                                                                                                              >а "энтерпрайз приложение" где здесь?
                                                                                                                              В энтерпрайз приложении задачи могут выполняться в фоновом режиме, как по крону.

                                                                                                                              Такая задача создает объект, который в конструкторе получает нужные данные, производит с объектом какие-то действия, и завершается.

                                                                                                                              При следующем запуске она снова создаст объект.
                                                                                                                              Ответить
                                                                                                  • > я кину исключение
                                                                                                    - это если они у тебя есть. Вообще кидать исключение в вашей жабе на request timeout это хорошая практика? Или на отсутствующее соединение?
                                                                                                    Ответить
                                                                                                    • В большинстве мейнстрим языков исключения есть.

                                                                                                      Кинуть бизнеслогическое исключение из конструткора вполне нормально, имхо.
                                                                                                      try {
                                                                                                      listOfTickersFromRemoteSite = new ListOfTickersFromRemoteSite();
                                                                                                      listOfTickersFromRemoteSite.findTickets();
                                                                                                      } catch(ex: ConnectionException) {
                                                                                                        print("Can't get list of tickers: site is down");
                                                                                                        return;
                                                                                                      }


                                                                                                      Если бы я вынес загрузку билетов в отдельный метод, то в методе findTickets() мне бы пришлось проверять, что перед ним был вызван нужный метод загрузки.
                                                                                                      Ответить
                                                                                                      • билеты удалённо обновились

                                                                                                        а твой findTickets() работает со старыми

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

                                                                                                        такой себе пример
                                                                                                        Ответить
                                                                                                        • Нужно, и я не вижу в этом ничего плохого, если конечно они не обновляются каждые 20 секунд.

                                                                                                          Работать с таким объектом проще, чем с тем, где нужно не забыть после конструктора вызвать еще и fetchTickets();
                                                                                                          Ответить
                                                                                                          • откуда ты знаешь, как часто они обновляются? ты клиент пишешь, а не сервер.

                                                                                                            > Работать с таким объектом проще, чем с тем, где нужно не забыть после конструктора вызвать еще и fetchTickets();

                                                                                                            - конечно проще, ведь он нихуя не умеет.
                                                                                                            Ответить
                                                                                                            • Мой клиент знает как часто он хочет обновлять список билетов.

                                                                                                              > ведь он нихуя не умеет.
                                                                                                              Он умеет найти нужный билет, отсортировать билеты, и представить их в нужной форме.

                                                                                                              Ты опять пытаешься мне рассказать, что объект без изменяемого стейта должен нихуя не уметь.
                                                                                                              Это не верно.
                                                                                                              Ответить
                                                                                                              • да понятно

                                                                                                                твой клиент хочет обновлять список билетов раз в час

                                                                                                                то, что билеты на сервере обновляются раз в три минуты, твой клиент ни капли не чешет

                                                                                                                пользователи пишут гневные письма в поддержку, а Макака им отвечает: да всё мы умеем, не сцыте!
                                                                                                                Ответить
                                                                                                                • Если клиент работает в скрипте, то ничего перезагружать ему не нужно.
                                                                                                                  Если же он работает в долго живущем приложении, то вполне можно пересоздать объект
                                                                                                                  Ответить
                                                                                                                  • в каком скрипте?

                                                                                                                    пример с загрузкой информации про билеты это обычно работа для тонкого клиента.

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

                                                                                                                    Ты же предлагаешь в тонком клиенте иметь глобальное состояние (список билетов, затянутый по таймеру), которое может быть некорректным, что критично для пользователя и бизнеса. При этом ты категорически отказываешься от состояния в компонентах, просто потому что "это сложно".

                                                                                                                    ну ок, чо.
                                                                                                                    Ответить
                                                                                                                    • >в каком скрипте?
                                                                                                                      в скрипте с названием "tickets". Какая разница -- в каком?

                                                                                                                      >это обычно работа для тонкого клиента.
                                                                                                                      Это может быть работа энтерпрайз приложения в фоновом режиме с посылкой результата по email.

                                                                                                                      >Ты же предлагаешь в тонком клиенте иметь глобальное состояние

                                                                                                                      Где я говорил что либо про тонкий клиент?

                                                                                                                      >При этом ты категорически отказываешься от состояния в компонента

                                                                                                                      Где я говорил что либо про компоненты?

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

                                                                                                                      Потому что кроме UI компонента такого приложения бывают еще и другие объекты.
                                                                                                                      Ответить
                                                                                                                      • ок, у тебя будет "энтерпрайз приложение" с некорректными данными, какая разница?
                                                                                                                        Ответить
                                                                                                                        • Почему с некорректными?

                                                                                                                          Приложение выполняет задачу
                                                                                                                          * создает объект, который подтягивает список билетов
                                                                                                                          * находит в них нужный
                                                                                                                          * отсылает сообщение по email

                                                                                                                          В каком месте тут будут некорректные данные?
                                                                                                                          Ответить
                                • Таким образом, Йажа ближе к няшной сишке чем С-плюс-плюс.
                                  Ответить
              • Нахуй вообще нужен private? Не вызывай просто ненужные методы и всё. Один хуй сделаешь из private public, когда понадобится. /color
                Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

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


    8